diff options
| author | Linus Torvalds <torvalds@penguin.transmeta.com> | 2002-10-27 23:10:58 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@penguin.transmeta.com> | 2002-10-27 23:10:58 -0800 |
| commit | 0c1528794f54839099deaddebb70a23f724951fd (patch) | |
| tree | 4dae3812e02889a1c18a23625e0cf476e1b11f48 | |
| parent | f8fe8a14f5294019c49c2dd4269ef25ef0b6dd18 (diff) | |
| parent | 205fbfe091c66658c49b7c8361dbf7b207e22713 (diff) | |
Merge penguin.transmeta.com:/home/penguin/torvalds/repositories/kernel/alan
into penguin.transmeta.com:/home/penguin/torvalds/repositories/kernel/linux
238 files changed, 71660 insertions, 6189 deletions
diff --git a/Documentation/filesystems/befs.txt b/Documentation/filesystems/befs.txt new file mode 100644 index 000000000000..1fc7c4df6f26 --- /dev/null +++ b/Documentation/filesystems/befs.txt @@ -0,0 +1,111 @@ +BeOS filesystem for Linux + +Document last updated: Dec 6, 2001 + +WARNING +======= +Make sure you understand that this is alpha software. This means that the +implementation is neither complete nor well-tested. + +I DISCLAIM ALL RESPONSIBILTY FOR ANY POSSIBLE BAD EFFECTS OF THIS CODE! + +LICENSE +===== +This software is covered by the GNU General Public License. +See the file COPYING for the complete text of the license. +Or the GNU website: <http://www.gnu.org/licenses/licenses.html> + +AUTHOR +===== +Current maintainer: Will Dyson <will_dyson@pobox.com> +Has been working on the code since Aug 13, 2001. See the changelog for details. + +Original Author: Makoto Kato <m_kato@ga2.so-net.ne.jp> +His orriginal code can still be found at: <http://hp.vector.co.jp/authors/VA008030/bfs/> +Does anyone know of a more current email address for Makoto? He doesn't respond +to the address given above... + +WHAT IS THIS DRIVER? +================== +This module implements the native filesystem of BeOS <http://www.be.com/> +for the linux 2.4.1 and later kernels. Currently it is a read-only implementation. + +Which is it, BFS or BEFS? +================ +Be, Inc said, "BeOS Filesystem is officially called BFS, not BeFS". +But Unixware Boot Filesystem is called bfs, too. And they are already in the +kernel. +Because of this nameing conflict, on Linux the BeOS filesystem is called befs. + +HOW TO INSTALL +============== +step 1. Install the BeFS patch into the source code tree of linux. + +Apply the patchfile to your kernel source tree. +Assuming that your kernel source is in /foo/bar/linux and the patchfile is called +patch-befs-xxx, you would do the following: + + cd /foo/bar/linux + patch -p1 < /path/to/patch-befs-xxx + +if the patching step fails (i.e. there are rejected hunks), you can try to +figure it out yourself (it shouldn't be hard), or mail the maintainer +(Will Dyson <will_dyson@pobox.com>) for help. + +step 2. Configuretion & make kernel + +The linux kernel has many compile-time options. Most of them are beyond the +scope of this document. I suggest the Kernel-HOWTO document as a good general +reference on this topic. <http://www.linux.com/howto/Kernel-HOWTO.html> + +However, to use the BeFS module, you must enable it at configure time. + + cd /foo/bar/linux + make menuconfig (or xconfig) + +The BeFS module is not a standard part of the linux kernel, so you must first +enable support for experimental code under the "Code maturity level" menu. + +Then, under the "Filesystems" menu will be an option called "BeFS filesystem (experimental)", +or something like that. Enable that option (it is fine to make it a module). + +Save your kernel configuration and then build your kernel. + +step 3. Install + +See the kernel howto <http://www.linux.com/howto/Kernel-HOWTO.html> for +instructions on this critical step. + +USING BFS +========= +To use the BeOS filesystem, use filesystem type 'befs'. + +ex) + mount -t befs /dev/fd0 /beos + +MOUNT OPTIONS +============= +uid=nnn All files in the partition will be owned by user id nnn. +gid=nnn All files in the partition will be in group nnn. +iocharset=xxx Use xxx as the name of the NLS translation table. +debug The driver will output debugging information to the syslog. + +HOW TO GET LASTEST VERSION +========================== + +The latest version is currently available at: +<http://befs-driver.sourceforge.net/> + +ANY KNOWN BUGS? +=========== +As of Jan 20, 2002: + + None + +SPECIAL THANKS +============== +Dominic Giampalo ... Writing "Practical file system design with Be filesystem" +Hiroyuki Yamada ... Testing LinuxPPC. + + + diff --git a/Documentation/voyager.txt b/Documentation/voyager.txt new file mode 100644 index 000000000000..2749af552cdf --- /dev/null +++ b/Documentation/voyager.txt @@ -0,0 +1,95 @@ +Running Linux on the Voyager Architecture +========================================= + +For full details and current project status, see + +http://www.hansenpartnership.com/voyager + +The voyager architecture was designed by NCR in the mid 80s to be a +fully SMP capable RAS computing architecture built around intel's 486 +chip set. The voyager came in three levels of architectural +sophistication: 3,4 and 5 --- 1 and 2 never made it out of prototype. +The linux patches support only the Level 5 voyager architecture (any +machine class 3435 and above). + +The Voyager Architecture +------------------------ + +Voyager machines consist of a Baseboard with a 386 diagnostic +processor, a Power Supply Interface (PSI) a Primary and possibly +Secondary Microchannel bus and between 2 and 20 voyager slots. The +voyager slots can be populated with memory and cpu cards (up to 4GB +memory and from 1 486 to 32 Pentium Pro processors). Internally, the +voyager has a dual arbitrated system bus and a configuration and test +bus (CAT). The voyager bus speed is 40MHz. Therefore (since all +voyager cards are dual ported for each system bus) the maximum +transfer rate is 320Mb/s but only if you have your slot configuration +tuned (only memory cards can communicate with both busses at once, CPU +cards utilise them one at a time). + +Voyager SMP +----------- + +Since voyager was the first intel based SMP system, it is slightly +more primitive than the Intel IO-APIC approach to SMP. Voyager allows +arbitrary interrupt routing (including processor affinity routing) of +all 16 PC type interrupts. However it does this by using a modified +5259 master/slave chip set instead of an APIC bus. Additionally, +voyager supports Cross Processor Interrupts (CPI) equivalent to the +APIC IPIs. There are two routed voyager interrupt lines provided to +each slot. + +Processor Cards +--------------- + +These come in single, dyadic and quad configurations (the quads are +problematic--see later). The maximum configuration is 8 quad cards +for 32 way SMP. + +Quad Processors +--------------- + +Because voyager only supplies two interrupt lines to each Processor +card, the Quad processors have to be configured (and Bootstrapped) in +as a pair of Master/Slave processors. + +In fact, most Quad cards only accept one VIC interrupt line, so they +have one interrupt handling processor (called the VIC extended +processor) and three non-interrupt handling processors. + +Current Status +-------------- + +The System will boot on Mono, Dyad and Quad cards. There was +originally a Quad boot problem which has been fixed by proper gdt +alignment in the initial boot loader. If you still cannot get your +voyager system to boot, email me at: + +<J.E.J.Bottomley@HansenPartnership.com> + + +The Quad cards now support using the separate Quad CPI vectors instead +of going through the VIC mailbox system. + +The Level 4 architecture (3430 and 3360 Machines) should also work +fine. + +Dump Switch +----------- + +The voyager dump switch sends out a broadcast NMI which the voyager +code intercepts and does a task dump. + +Power Switch +------------ + +The front panel power switch is intercepted by the kernel and should +cause a system shutdown and power off. + +A Note About Mixed CPU Systems +------------------------------ + +Linux isn't designed to handle mixed CPU systems very well. In order +to get everything going you *must* make sure that your lowest +capability CPU is used for booting. Also, mixing CPU classes +(e.g. 486 and 586) is really not going to work very well at all. diff --git a/arch/i386/kernel/apm.c b/arch/i386/kernel/apm.c index fd8b57d44906..f4f224db81e9 100644 --- a/arch/i386/kernel/apm.c +++ b/arch/i386/kernel/apm.c @@ -40,6 +40,7 @@ * Nov 2000, Version 1.14 * Oct 2001, Version 1.15 * Jan 2002, Version 1.16 + * Oct 2002, Version 1.16ac * * History: * 0.6b: first version in official kernel, Linux 1.3.46 @@ -177,6 +178,9 @@ * CONFIG_APM_CPU_IDLE now just affects the default value of * idle_threshold (sfr). * Change name of kernel apm daemon (as it no longer idles) (sfr). + * 1.16ac: Fix up SMP support somewhat. You can now force SMP on and we + * make _all_ APM calls on the CPU#0. Fix unsafe sign bug. + * TODO: determine if its "boot CPU" or "CPU0" we want to lock to. * * APM 1.1 Reference: * @@ -250,6 +254,7 @@ extern int (*console_blank_hook)(int); * powering off * [no-]debug log some debugging messages * [no-]power[-_]off power off on shutdown + * [no-]smp Use apm even on an SMP box * bounce[-_]interval=<n> number of ticks to ignore suspend * bounces * idle[-_]threshold=<n> System idle percentage above which to @@ -396,6 +401,7 @@ static long clock_cmos_diff; static int got_clock_diff; #endif static int debug; +static int smp; static int apm_disabled = -1; #ifdef CONFIG_SMP static int power_off; @@ -422,7 +428,7 @@ static struct apm_user * user_list; static spinlock_t user_list_lock = SPIN_LOCK_UNLOCKED; static struct desc_struct bad_bios_desc = { 0, 0x00409200 }; -static char driver_version[] = "1.16"; /* no spaces */ +static char driver_version[] = "1.16ac"; /* no spaces */ /* * APM event names taken from the APM 1.2 specification. These are @@ -499,6 +505,38 @@ static void apm_error(char *str, int err) } /* + * Lock APM functionality to physical CPU 0 + */ + +#ifdef CONFIG_SMP + +static unsigned long apm_save_cpus(void) +{ + unsigned long x = current->cpus_allowed; + /* Some bioses don't like being called from CPU != 0 */ + set_cpus_allowed(current, 1 << 0); + if (unlikely(smp_processor_id() != 0)) + BUG(); + return x; +} + +static inline void apm_restore_cpus(unsigned long mask) +{ + set_cpus_allowed(current, mask); +} + +#else + +/* + * No CPU lockdown needed on a uniprocessor + */ + +#define apm_save_cpus() 0 +#define apm_restore_cpus(x) (void)(x) + +#endif + +/* * These are the actual BIOS calls. Depending on APM_ZERO_SEGS and * apm_info.allow_ints, we are being really paranoid here! Not only * are interrupts disabled, but all the segment registers (except SS) @@ -571,9 +609,12 @@ static u8 apm_bios_call(u32 func, u32 ebx_in, u32 ecx_in, { APM_DECL_SEGS unsigned long flags; + unsigned long cpus; int cpu; struct desc_struct save_desc_40; + cpus = apm_save_cpus(); + cpu = get_cpu(); save_desc_40 = cpu_gdt_table[cpu][0x40 / 8]; cpu_gdt_table[cpu][0x40 / 8] = bad_bios_desc; @@ -601,6 +642,8 @@ static u8 apm_bios_call(u32 func, u32 ebx_in, u32 ecx_in, local_irq_restore(flags); cpu_gdt_table[cpu][0x40 / 8] = save_desc_40; put_cpu(); + apm_restore_cpus(cpus); + return *eax & 0xff; } @@ -623,9 +666,13 @@ static u8 apm_bios_call_simple(u32 func, u32 ebx_in, u32 ecx_in, u32 *eax) u8 error; APM_DECL_SEGS unsigned long flags; + unsigned long cpus; int cpu; struct desc_struct save_desc_40; + + cpus = apm_save_cpus(); + cpu = get_cpu(); save_desc_40 = cpu_gdt_table[cpu][0x40 / 8]; cpu_gdt_table[cpu][0x40 / 8] = bad_bios_desc; @@ -657,6 +704,7 @@ static u8 apm_bios_call_simple(u32 func, u32 ebx_in, u32 ecx_in, u32 *eax) local_irq_restore(flags); cpu_gdt_table[smp_processor_id()][0x40 / 8] = save_desc_40; put_cpu(); + apm_restore_cpus(cpus); return error; } @@ -772,7 +820,11 @@ static int apm_do_idle(void) if (apm_bios_call_simple(APM_FUNC_IDLE, 0, 0, &eax)) { static unsigned long t; - if (time_after(jiffies, t + 10 * HZ)) { + /* This always fails on some SMP boards running UP kernels. + * Only report the failure the first 5 times. + */ + if (++t < 5) + { printk(KERN_DEBUG "apm_do_idle failed (%d)\n", (eax >> 8) & 0xff); t = jiffies; @@ -912,14 +964,16 @@ static void apm_power_off(void) #ifdef CONFIG_SMP /* Some bioses don't like being called from CPU != 0 */ if (smp_processor_id() != 0) { - current->cpus_allowed = 1; - schedule(); + set_cpus_allowed(current, 1 << 0); if (unlikely(smp_processor_id() != 0)) BUG(); } #endif if (apm_info.realmode_power_off) + { + (void)apm_save_cpus(); machine_real_restart(po_bios_call, sizeof(po_bios_call)); + } else (void) set_system_power_state(APM_STATE_OFF); } @@ -1096,6 +1150,19 @@ static int apm_console_blank(int blank) } if ((error == APM_SUCCESS) || (error == APM_NO_ERROR)) return 1; + if (error == APM_NOT_ENGAGED) { + static int tried; + int eng_error; + if (tried++ == 0) { + eng_error = apm_engage_power_management(APM_DEVICE_ALL, 1); + if (eng_error) { + apm_error("set display", error); + apm_error("engage interface", eng_error); + return 0; + } else + return apm_console_blank(blank); + } + } apm_error("set display", error); return 0; } @@ -1424,7 +1491,7 @@ static ssize_t do_read(struct file *fp, char *buf, size_t count, loff_t *ppos) as = fp->private_data; if (check_apm_user(as, "read")) return -EIO; - if (count < sizeof(apm_event_t)) + if ((int)count < sizeof(apm_event_t)) return -EINVAL; if ((queue_empty(as)) && (fp->f_flags & O_NONBLOCK)) return -EAGAIN; @@ -1693,8 +1760,7 @@ static int apm(void *unused) * Method suggested by Ingo Molnar. */ if (smp_processor_id() != 0) { - current->cpus_allowed = 1; - schedule(); + set_cpus_allowed(current, 1 << 0); if (unlikely(smp_processor_id() != 0)) BUG(); } @@ -1746,7 +1812,7 @@ static int apm(void *unused) } } - if (debug) { + if (debug && (num_online_cpus() == 1 || smp )) { error = apm_get_power_status(&bx, &cx, &dx); if (error) printk(KERN_INFO "apm: power status not available\n"); @@ -1790,7 +1856,7 @@ static int apm(void *unused) pm_power_off = apm_power_off; register_sysrq_key('o', &sysrq_poweroff_op); - if (num_online_cpus() == 1) { + if (num_online_cpus() == 1 || smp) { #if defined(CONFIG_APM_DISPLAY_BLANK) && defined(CONFIG_VT) console_blank_hook = apm_console_blank; #endif @@ -1832,6 +1898,11 @@ static int __init apm_setup(char *str) if ((strncmp(str, "power-off", 9) == 0) || (strncmp(str, "power_off", 9) == 0)) power_off = !invert; + if (strncmp(str, "smp", 3) == 0) + { + smp = !invert; + idle_threshold = 100; + } if ((strncmp(str, "allow-ints", 10) == 0) || (strncmp(str, "allow_ints", 10) == 0)) apm_info.allow_ints = !invert; @@ -1934,7 +2005,7 @@ static int __init apm_init(void) printk(KERN_NOTICE "apm: disabled on user request.\n"); return -ENODEV; } - if ((num_online_cpus() > 1) && !power_off) { + if ((num_online_cpus() > 1) && !power_off && !smp) { printk(KERN_NOTICE "apm: disabled - APM is not SMP safe.\n"); return -ENODEV; } @@ -1980,6 +2051,14 @@ static int __init apm_init(void) (apm_info.bios.cseg_16_len - 1) & 0xffff); _set_limit((char *)&cpu_gdt_table[i][APM_DS >> 3], (apm_info.bios.dseg_len - 1) & 0xffff); + /* workaround for broken BIOSes */ + if (apm_info.bios.cseg_len <= apm_info.bios.offset) + _set_limit((char *)&cpu_gdt_table[i][APM_CS >> 3], 64 * 1024 -1); + if (apm_info.bios.dseg_len <= 0x40) { /* 0x40 * 4kB == 64kB */ + /* for the BIOS that assumes granularity = 1 */ + cpu_gdt_table[i][APM_DS >> 3].b |= 0x800000; + printk(KERN_NOTICE "apm: we set the granularity of dseg.\n"); + } } #endif } @@ -1990,7 +2069,7 @@ static int __init apm_init(void) kernel_thread(apm, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD); - if (num_online_cpus() > 1) { + if (num_online_cpus() > 1 && !smp ) { printk(KERN_NOTICE "apm: disabled - APM is not SMP safe (power off active).\n"); return 0; @@ -2058,3 +2137,7 @@ MODULE_PARM_DESC(idle_threshold, MODULE_PARM(idle_period, "i"); MODULE_PARM_DESC(idle_period, "Period (in sec/100) over which to caculate the idle percentage"); +MODULE_PARM(smp, "i"); +MODULE_PARM_DESC(smp, + "Set this to enable APM use on an SMP platform. Use with caution on older systems"); + diff --git a/arch/i386/kernel/mca.c b/arch/i386/kernel/mca.c index dc4452c9d871..c4bf6e9acf3d 100644 --- a/arch/i386/kernel/mca.c +++ b/arch/i386/kernel/mca.c @@ -194,10 +194,9 @@ struct resource mca_standard_resources[] = { #define MCA_STANDARD_RESOURCES (sizeof(mca_standard_resources)/sizeof(struct resource)) -void __init mca_init(void) +int __init mca_init(void) { unsigned int i, j; - unsigned long flags; /* WARNING: Be careful when making changes here. Putting an adapter * and the motherboard simultaneously into setup mode may result in @@ -209,16 +208,16 @@ void __init mca_init(void) /* Make sure the MCA bus is present */ if(!MCA_bus) - return; - printk("Micro Channel bus detected.\n"); + return -ENODEV; + printk(KERN_INFO "Micro Channel bus detected.\n"); /* Allocate MCA_info structure (at address divisible by 8) */ mca_info = (struct MCA_info *)kmalloc(sizeof(struct MCA_info), GFP_KERNEL); if(mca_info == NULL) { - printk("Failed to allocate memory for mca_info!"); - return; + printk(KERN_ERR "Failed to allocate memory for mca_info!"); + return -ENOMEM; } memset(mca_info, 0, sizeof(struct MCA_info)); @@ -320,6 +319,8 @@ void __init mca_init(void) #ifdef CONFIG_PROC_FS mca_do_proc_init(); #endif + + return 0; } subsys_initcall(mca_init); @@ -329,16 +330,16 @@ subsys_initcall(mca_init); static void mca_handle_nmi_slot(int slot, int check_flag) { if(slot < MCA_MAX_SLOT_NR) { - printk("NMI: caused by MCA adapter in slot %d (%s)\n", slot+1, + printk(KERN_CRIT "NMI: caused by MCA adapter in slot %d (%s)\n", slot+1, mca_info->slot[slot].name); } else if(slot == MCA_INTEGSCSI) { - printk("NMI: caused by MCA integrated SCSI adapter (%s)\n", + printk(KERN_CRIT "NMI: caused by MCA integrated SCSI adapter (%s)\n", mca_info->slot[slot].name); } else if(slot == MCA_INTEGVIDEO) { - printk("NMI: caused by MCA integrated video adapter (%s)\n", + printk(KERN_CRIT "NMI: caused by MCA integrated video adapter (%s)\n", mca_info->slot[slot].name); } else if(slot == MCA_MOTHERBOARD) { - printk("NMI: caused by motherboard (%s)\n", + printk(KERN_CRIT "NMI: caused by motherboard (%s)\n", mca_info->slot[slot].name); } @@ -350,7 +351,7 @@ static void mca_handle_nmi_slot(int slot, int check_flag) pos6 = mca_read_pos(slot, 6); pos7 = mca_read_pos(slot, 7); - printk("NMI: POS 6 = 0x%x, POS 7 = 0x%x\n", pos6, pos7); + printk(KERN_CRIT "NMI: POS 6 = 0x%x, POS 7 = 0x%x\n", pos6, pos7); } } /* mca_handle_nmi_slot */ @@ -367,21 +368,19 @@ void mca_handle_nmi(void) * adapter was responsible for the error. */ - for(i = 0; i < MCA_NUMADAPTERS; i++) { - - /* Bit 7 of POS 5 is reset when this adapter has a hardware - * error. Bit 7 it reset if there's error information - * available in POS 6 and 7. - */ - - pos5 = mca_read_pos(i, 5); + for(i = 0; i < MCA_NUMADAPTERS; i++) + { + /* Bit 7 of POS 5 is reset when this adapter has a hardware + * error. Bit 7 it reset if there's error information + * available in POS 6 and 7. + */ + pos5 = mca_read_pos(i, 5); - if(!(pos5 & 0x80)) { + if(!(pos5 & 0x80)) { mca_handle_nmi_slot(i, !(pos5 & 0x40)); return; } } - mca_nmi_hook(); } /* mca_handle_nmi */ diff --git a/arch/i386/mach-voyager/Makefile b/arch/i386/mach-voyager/Makefile new file mode 100644 index 000000000000..d692995e00dc --- /dev/null +++ b/arch/i386/mach-voyager/Makefile @@ -0,0 +1,17 @@ +# +# Makefile for the linux kernel. +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (ie not a .c file). +# +# Note 2! The CFLAGS definitions are now in the main makefile... + +EXTRA_CFLAGS += -I../kernel +export-objs := + +obj-y := setup.o voyager_basic.o voyager_thread.o + +obj-$(CONFIG_SMP) += voyager_smp.o voyager_cat.o + +include $(TOPDIR)/Rules.make diff --git a/arch/i386/mach-voyager/do_timer.h b/arch/i386/mach-voyager/do_timer.h new file mode 100644 index 000000000000..75c642f9af74 --- /dev/null +++ b/arch/i386/mach-voyager/do_timer.h @@ -0,0 +1,22 @@ +/* defines for inline arch setup functions */ +#include <asm/voyager.h> + +static inline void do_timer_interrupt_hook(struct pt_regs *regs) +{ + do_timer(regs); + + voyager_timer_interrupt(regs); +} + +static inline int do_timer_overflow(int count) +{ + /* can't read the ISR, just assume 1 tick + overflow */ + if(count > LATCH || count < 0) { + printk(KERN_ERR "VOYAGER PROBLEM: count is %d, latch is %d\n", count, LATCH); + count = LATCH; + } + count -= LATCH; + + return count; +} diff --git a/arch/i386/mach-voyager/entry_arch.h b/arch/i386/mach-voyager/entry_arch.h new file mode 100644 index 000000000000..4a1e1e8c10b6 --- /dev/null +++ b/arch/i386/mach-voyager/entry_arch.h @@ -0,0 +1,26 @@ +/* -*- mode: c; c-basic-offset: 8 -*- */ + +/* Copyright (C) 2002 + * + * Author: James.Bottomley@HansenPartnership.com + * + * linux/arch/i386/voyager/entry_arch.h + * + * This file builds the VIC and QIC CPI gates + */ + +/* initialise the voyager interrupt gates + * + * This uses the macros in irq.h to set up assembly jump gates. The + * calls are then redirected to the same routine with smp_ prefixed */ +BUILD_INTERRUPT(vic_sys_interrupt, VIC_SYS_INT) +BUILD_INTERRUPT(vic_cmn_interrupt, VIC_CMN_INT) +BUILD_INTERRUPT(vic_cpi_interrupt, VIC_CPI_LEVEL0); + +/* do all the QIC interrupts */ +BUILD_INTERRUPT(qic_timer_interrupt, QIC_TIMER_CPI); +BUILD_INTERRUPT(qic_invalidate_interrupt, QIC_INVALIDATE_CPI); +BUILD_INTERRUPT(qic_reschedule_interrupt, QIC_RESCHEDULE_CPI); +BUILD_INTERRUPT(qic_enable_irq_interrupt, QIC_ENABLE_IRQ_CPI); +BUILD_INTERRUPT(qic_call_function_interrupt, QIC_CALL_FUNCTION_CPI); + diff --git a/arch/i386/mach-voyager/irq_vectors.h b/arch/i386/mach-voyager/irq_vectors.h new file mode 100644 index 000000000000..4d4060a20434 --- /dev/null +++ b/arch/i386/mach-voyager/irq_vectors.h @@ -0,0 +1,71 @@ +/* -*- mode: c; c-basic-offset: 8 -*- */ + +/* Copyright (C) 2002 + * + * Author: James.Bottomley@HansenPartnership.com + * + * linux/arch/i386/voyager/irq_vectors.h + * + * This file provides definitions for the VIC and QIC CPIs + */ + +#ifndef _ASM_IRQ_VECTORS_H +#define _ASM_IRQ_VECTORS_H + +/* + * IDT vectors usable for external interrupt sources start + * at 0x20: + */ +#define FIRST_EXTERNAL_VECTOR 0x20 + +#define SYSCALL_VECTOR 0x80 + +/* + * Vectors 0x20-0x2f are used for ISA interrupts. + */ + +/* These define the CPIs we use in linux */ +#define VIC_CPI_LEVEL0 0 +#define VIC_CPI_LEVEL1 1 +/* now the fake CPIs */ +#define VIC_TIMER_CPI 2 +#define VIC_INVALIDATE_CPI 3 +#define VIC_RESCHEDULE_CPI 4 +#define VIC_ENABLE_IRQ_CPI 5 +#define VIC_CALL_FUNCTION_CPI 6 + +/* Now the QIC CPIs: Since we don't need the two initial levels, + * these are 2 less than the VIC CPIs */ +#define QIC_CPI_OFFSET 1 +#define QIC_TIMER_CPI (VIC_TIMER_CPI - QIC_CPI_OFFSET) +#define QIC_INVALIDATE_CPI (VIC_INVALIDATE_CPI - QIC_CPI_OFFSET) +#define QIC_RESCHEDULE_CPI (VIC_RESCHEDULE_CPI - QIC_CPI_OFFSET) +#define QIC_ENABLE_IRQ_CPI (VIC_ENABLE_IRQ_CPI - QIC_CPI_OFFSET) +#define QIC_CALL_FUNCTION_CPI (VIC_CALL_FUNCTION_CPI - QIC_CPI_OFFSET) + +#define VIC_START_FAKE_CPI VIC_TIMER_CPI +#define VIC_END_FAKE_CPI VIC_CALL_FUNCTION_CPI + +/* this is the SYS_INT CPI. */ +#define VIC_SYS_INT 8 +#define VIC_CMN_INT 15 + +/* This is the boot CPI for alternate processors. It gets overwritten + * by the above once the system has activated all available processors */ +#define VIC_CPU_BOOT_CPI VIC_CPI_LEVEL0 +#define VIC_CPU_BOOT_ERRATA_CPI (VIC_CPI_LEVEL0 + 8) + +#define NR_IRQS 224 + +#ifndef __ASSEMBLY__ +extern asmlinkage void vic_cpi_interrupt(void); +extern asmlinkage void vic_sys_interrupt(void); +extern asmlinkage void vic_cmn_interrupt(void); +extern asmlinkage void qic_timer_interrupt(void); +extern asmlinkage void qic_invalidate_interrupt(void); +extern asmlinkage void qic_reschedule_interrupt(void); +extern asmlinkage void qic_enable_irq_interrupt(void); +extern asmlinkage void qic_call_function_interrupt(void); +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_IRQ_VECTORS_H */ diff --git a/arch/i386/mach-voyager/setup.c b/arch/i386/mach-voyager/setup.c new file mode 100644 index 000000000000..a005c23b88c8 --- /dev/null +++ b/arch/i386/mach-voyager/setup.c @@ -0,0 +1,43 @@ +/* + * Machine specific setup for generic + */ + +#include <linux/config.h> +#include <linux/init.h> +#include <linux/irq.h> +#include <linux/interrupt.h> +#include <asm/arch_hooks.h> + +void __init pre_intr_init_hook(void) +{ + init_ISA_irqs(); +} + +/* + * IRQ2 is cascade interrupt to second interrupt controller + */ +static struct irqaction irq2 = { no_action, 0, 0, "cascade", NULL, NULL}; + +void __init intr_init_hook(void) +{ +#ifdef CONFIG_SMP + smp_intr_init(); +#endif + + setup_irq(2, &irq2); +} + +void __init pre_setup_arch_hook(void) +{ +} + +void __init trap_init_hook(void) +{ +} + +static struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, 0, "timer", NULL, NULL}; + +void __init time_init_hook(void) +{ + setup_irq(0, &irq0); +} diff --git a/arch/i386/mach-voyager/setup_arch_post.h b/arch/i386/mach-voyager/setup_arch_post.h new file mode 100644 index 000000000000..4c7cef49b8b2 --- /dev/null +++ b/arch/i386/mach-voyager/setup_arch_post.h @@ -0,0 +1,73 @@ +/* Hook for machine specific memory setup. + * + * This is included late in kernel/setup.c so that it can make use of all of + * the static functions. */ + +static inline char * __init machine_specific_memory_setup(void) +{ + char *who; + + who = "NOT VOYAGER"; + + if(voyager_level == 5) { + __u32 addr, length; + int i; + + who = "Voyager-SUS"; + + e820.nr_map = 0; + for(i=0; voyager_memory_detect(i, &addr, &length); i++) { + add_memory_region(addr, length, E820_RAM); + } + return who; + } else if(voyager_level == 4) { + __u32 tom; + __u16 catbase = inb(VOYAGER_SSPB_RELOCATION_PORT)<<8; + /* select the DINO config space */ + outb(VOYAGER_DINO, VOYAGER_CAT_CONFIG_PORT); + /* Read DINO top of memory register */ + tom = ((inb(catbase + 0x4) & 0xf0) << 16) + + ((inb(catbase + 0x5) & 0x7f) << 24); + + if(inb(catbase) != VOYAGER_DINO) { + printk(KERN_ERR "Voyager: Failed to get DINO for L4, setting tom to EXT_MEM_K\n"); + tom = (EXT_MEM_K)<<10; + } + who = "Voyager-TOM"; + add_memory_region(0, 0x9f000, E820_RAM); + /* map from 1M to top of memory */ + add_memory_region(1*1024*1024, tom - 1*1024*1024, E820_RAM); + /* FIXME: Should check the ASICs to see if I need to + * take out the 8M window. Just do it at the moment + * */ + add_memory_region(8*1024*1024, 8*1024*1024, E820_RESERVED); + return who; + } + + who = "BIOS-e820"; + + /* + * Try to copy the BIOS-supplied E820-map. + * + * Otherwise fake a memory map; one section from 0k->640k, + * the next section from 1mb->appropriate_mem_k + */ + sanitize_e820_map(E820_MAP, &E820_MAP_NR); + if (copy_e820_map(E820_MAP, E820_MAP_NR) < 0) { + unsigned long mem_size; + + /* compare results from other methods and take the greater */ + if (ALT_MEM_K < EXT_MEM_K) { + mem_size = EXT_MEM_K; + who = "BIOS-88"; + } else { + mem_size = ALT_MEM_K; + who = "BIOS-e801"; + } + + e820.nr_map = 0; + add_memory_region(0, LOWMEMSIZE(), E820_RAM); + add_memory_region(HIGH_MEMORY, mem_size << 10, E820_RAM); + } + return who; +} diff --git a/arch/i386/mach-voyager/setup_arch_pre.h b/arch/i386/mach-voyager/setup_arch_pre.h new file mode 100644 index 000000000000..48f7e6ff49a5 --- /dev/null +++ b/arch/i386/mach-voyager/setup_arch_pre.h @@ -0,0 +1,10 @@ +#include <asm/voyager.h> +#define VOYAGER_BIOS_INFO ((struct voyager_bios_info *)(PARAM+0x40)) + +/* Hook to call BIOS initialisation function */ + +/* for voyager, pass the voyager BIOS/SUS info area to the detection + * routines */ + +#define ARCH_SETUP voyager_detect(VOYAGER_BIOS_INFO); + diff --git a/arch/i386/mach-voyager/voyager_basic.c b/arch/i386/mach-voyager/voyager_basic.c new file mode 100644 index 000000000000..d14e26500377 --- /dev/null +++ b/arch/i386/mach-voyager/voyager_basic.c @@ -0,0 +1,312 @@ +/* Copyright (C) 1999,2001 + * + * Author: J.E.J.Bottomley@HansenPartnership.com + * + * linux/arch/i386/kernel/voyager.c + * + * This file contains all the voyager specific routines for getting + * initialisation of the architecture to function. For additional + * features see: + * + * voyager_cat.c - Voyager CAT bus interface + * voyager_smp.c - Voyager SMP hal (emulates linux smp.c) + */ + +#include <linux/config.h> +#include <linux/types.h> +#include <linux/sched.h> +#include <linux/ptrace.h> +#include <linux/ioport.h> +#include <linux/interrupt.h> +#include <linux/init.h> +#include <linux/delay.h> +#include <linux/reboot.h> +#include <asm/io.h> +#include <asm/pgalloc.h> +#include <asm/voyager.h> +#include <asm/vic.h> +#include <linux/pm.h> +#include <linux/irq.h> +#include <asm/tlbflush.h> +#include <asm/arch_hooks.h> + +/* + * Power off function, if any + */ +void (*pm_power_off)(void); + +int reboot_thru_bios; + +int voyager_level = 0; + +struct voyager_SUS *voyager_SUS = NULL; + +void +voyager_detect(struct voyager_bios_info *bios) +{ + if(bios->len != 0xff) { + int class = (bios->class_1 << 8) + | (bios->class_2 & 0xff); + + printk("Voyager System detected.\n" + " Class %x, Revision %d.%d\n", + class, bios->major, bios->minor); + if(class == VOYAGER_LEVEL4) + voyager_level = 4; + else if(class < VOYAGER_LEVEL5_AND_ABOVE) + voyager_level = 3; + else + voyager_level = 5; + printk(" Architecture Level %d\n", voyager_level); + if(voyager_level < 4) + printk("\n**WARNING**: Voyager HAL only supports Levels 4 and 5 Architectures at the moment\n\n"); + /* install the power off handler */ + pm_power_off = voyager_power_off; + } else { + printk("\n\n**WARNING**: No Voyager Subsystem Found\n"); + } +} + +void +voyager_system_interrupt(int cpl, void *dev_id, struct pt_regs *regs) +{ + printk("Voyager: detected system interrupt\n"); +} + +/* Routine to read information from the extended CMOS area */ +__u8 +voyager_extended_cmos_read(__u16 addr) +{ + outb(addr & 0xff, 0x74); + outb((addr >> 8) & 0xff, 0x75); + return inb(0x76); +} + +/* internal definitions for the SUS Click Map of memory */ + +#define CLICK_ENTRIES 16 +#define CLICK_SIZE 4096 /* click to byte conversion for Length */ + +typedef struct ClickMap { + struct Entry { + __u32 Address; + __u32 Length; + } Entry[CLICK_ENTRIES]; +} ClickMap_t; + + +/* This routine is pretty much an awful hack to read the bios clickmap by + * mapping it into page 0. There are usually three regions in the map: + * Base Memory + * Extended Memory + * zero length marker for end of map + * + * Returns are 0 for failure and 1 for success on extracting region. + */ +int __init +voyager_memory_detect(int region, __u32 *start, __u32 *length) +{ + int i; + int retval = 0; + __u8 cmos[4]; + ClickMap_t *map; + unsigned long map_addr; + unsigned long old; + + if(region >= CLICK_ENTRIES) { + printk("Voyager: Illegal ClickMap region %d\n", region); + return 0; + } + + for(i = 0; i < sizeof(cmos); i++) + cmos[i] = voyager_extended_cmos_read(VOYAGER_MEMORY_CLICKMAP + i); + + map_addr = *(unsigned long *)cmos; + + /* steal page 0 for this */ + old = pg0[0]; + pg0[0] = ((map_addr & PAGE_MASK) | _PAGE_RW | _PAGE_PRESENT); + local_flush_tlb(); + /* now clear everything out but page 0 */ + map = (ClickMap_t *)(map_addr & (~PAGE_MASK)); + + /* zero length is the end of the clickmap */ + if(map->Entry[region].Length != 0) { + *length = map->Entry[region].Length * CLICK_SIZE; + *start = map->Entry[region].Address; + retval = 1; + } + + /* replace the mapping */ + pg0[0] = old; + local_flush_tlb(); + return retval; +} + +void +voyager_dump() +{ + /* get here via a sysrq */ +#ifdef CONFIG_SMP + voyager_smp_dump(); +#endif +} + +/* voyager specific handling code for timer interrupts. Used to hand + * off the timer tick to the SMP code, since the VIC doesn't have an + * internal timer (The QIC does, but that's another story). */ +void +voyager_timer_interrupt(struct pt_regs *regs) +{ + if((jiffies & 0x3ff) == 0) { + + /* There seems to be something flaky in either + * hardware or software that is resetting the timer 0 + * count to something much higher than it should be + * This seems to occur in the boot sequence, just + * before root is mounted. Therefore, every 10 + * seconds or so, we sanity check the timer zero count + * and kick it back to where it should be. + * + * FIXME: This is the most awful hack yet seen. I + * should work out exactly what is interfering with + * the timer count settings early in the boot sequence + * and swiftly introduce it to something sharp and + * pointy. */ + __u16 val; + extern spinlock_t i8253_lock; + + spin_lock(&i8253_lock); + + outb_p(0x00, 0x43); + val = inb_p(0x40); + val |= inb(0x40) << 8; + spin_unlock(&i8253_lock); + + if(val > LATCH) { + printk("\nVOYAGER: countdown timer value too high (%d), resetting\n\n", val); + spin_lock(&i8253_lock); + outb(0x34,0x43); + outb_p(LATCH & 0xff , 0x40); /* LSB */ + outb(LATCH >> 8 , 0x40); /* MSB */ + spin_unlock(&i8253_lock); + } + } +#ifdef CONFIG_SMP + smp_vic_timer_interrupt(regs); +#endif +} + +void +voyager_power_off(void) +{ + printk("VOYAGER Power Off\n"); + + if(voyager_level == 5) { + voyager_cat_power_off(); + } else if(voyager_level == 4) { + /* This doesn't apparently work on most L4 machines, + * but the specs say to do this to get automatic power + * off. Unfortunately, if it doesn't power off the + * machine, it ends up doing a cold restart, which + * isn't really intended, so comment out the code */ +#if 0 + int port; + + + /* enable the voyager Configuration Space */ + outb((inb(VOYAGER_MC_SETUP) & 0xf0) | 0x8, + VOYAGER_MC_SETUP); + /* the port for the power off flag is an offset from the + floating base */ + port = (inb(VOYAGER_SSPB_RELOCATION_PORT) << 8) + 0x21; + /* set the power off flag */ + outb(inb(port) | 0x1, port); +#endif + } + /* and wait for it to happen */ + for(;;) { + __asm("cli"); + __asm("hlt"); + } +} + +/* copied from process.c */ +static inline void +kb_wait(void) +{ + int i; + + for (i=0; i<0x10000; i++) + if ((inb_p(0x64) & 0x02) == 0) + break; +} + +void +machine_restart(char *cmd) +{ + printk("Voyager Warm Restart\n"); + kb_wait(); + + if(voyager_level == 5) { + /* write magic values to the RTC to inform system that + * shutdown is beginning */ + outb(0x8f, 0x70); + outb(0x5 , 0x71); + + udelay(50); + outb(0xfe,0x64); /* pull reset low */ + } else if(voyager_level == 4) { + __u16 catbase = inb(VOYAGER_SSPB_RELOCATION_PORT)<<8; + __u8 basebd = inb(VOYAGER_MC_SETUP); + + outb(basebd | 0x08, VOYAGER_MC_SETUP); + outb(0x02, catbase + 0x21); + } + for(;;) { + asm("cli"); + asm("hlt"); + } +} + +void +mca_nmi_hook(void) +{ + __u8 dumpval __attribute__((unused)) = inb(0xf823); + __u8 swnmi __attribute__((unused)) = inb(0xf813); + extern void show_stack(unsigned long *); + + /* FIXME: assume dump switch pressed */ + /* check to see if the dump switch was pressed */ + VDEBUG(("VOYAGER: dumpval = 0x%x, swnmi = 0x%x\n", dumpval, swnmi)); + /* clear swnmi */ + outb(0xff, 0xf813); + /* tell SUS to ignore dump */ + if(voyager_level == 5 && voyager_SUS != NULL) { + if(voyager_SUS->SUS_mbox == VOYAGER_DUMP_BUTTON_NMI) { + voyager_SUS->kernel_mbox = VOYAGER_NO_COMMAND; + voyager_SUS->kernel_flags |= VOYAGER_OS_IN_PROGRESS; + udelay(1000); + voyager_SUS->kernel_mbox = VOYAGER_IGNORE_DUMP; + voyager_SUS->kernel_flags &= ~VOYAGER_OS_IN_PROGRESS; + } + } + printk(KERN_ERR "VOYAGER: Dump switch pressed, printing CPU%d tracebacks\n", smp_processor_id()); + show_stack(NULL); + show_state(); +} + + + +void +machine_halt(void) +{ + /* treat a halt like a power off */ + machine_power_off(); +} + +void machine_power_off(void) +{ + if (pm_power_off) + pm_power_off(); +} diff --git a/arch/i386/mach-voyager/voyager_cat.c b/arch/i386/mach-voyager/voyager_cat.c new file mode 100644 index 000000000000..23967fe658d3 --- /dev/null +++ b/arch/i386/mach-voyager/voyager_cat.c @@ -0,0 +1,1178 @@ +/* -*- mode: c; c-basic-offset: 8 -*- */ + +/* Copyright (C) 1999,2001 + * + * Author: J.E.J.Bottomley@HansenPartnership.com + * + * linux/arch/i386/kernel/voyager_cat.c + * + * This file contains all the logic for manipulating the CAT bus + * in a level 5 machine. + * + * The CAT bus is a serial configuration and test bus. Its primary + * uses are to probe the initial configuration of the system and to + * diagnose error conditions when a system interrupt occurs. The low + * level interface is fairly primitive, so most of this file consists + * of bit shift manipulations to send and receive packets on the + * serial bus */ + +#include <linux/config.h> +#include <linux/types.h> +#include <linux/completion.h> +#include <linux/sched.h> +#include <asm/voyager.h> +#include <asm/vic.h> +#include <linux/ioport.h> +#include <linux/init.h> +#include <linux/slab.h> +#include <linux/delay.h> +#include <asm/io.h> + +#ifdef VOYAGER_CAT_DEBUG +#define CDEBUG(x) printk x +#else +#define CDEBUG(x) +#endif + +/* the CAT command port */ +#define CAT_CMD (sspb + 0xe) +/* the CAT data port */ +#define CAT_DATA (sspb + 0xd) + +/* the internal cat functions */ +static void cat_pack(__u8 *msg, __u16 start_bit, __u8 *data, + __u16 num_bits); +static void cat_unpack(__u8 *msg, __u16 start_bit, __u8 *data, + __u16 num_bits); +static void cat_build_header(__u8 *header, const __u16 len, + const __u16 smallest_reg_bits, + const __u16 longest_reg_bits); +static int cat_sendinst(voyager_module_t *modp, voyager_asic_t *asicp, + __u8 reg, __u8 op); +static int cat_getdata(voyager_module_t *modp, voyager_asic_t *asicp, + __u8 reg, __u8 *value); +static int cat_shiftout(__u8 *data, __u16 data_bytes, __u16 header_bytes, + __u8 pad_bits); +static int cat_write(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, + __u8 value); +static int cat_read(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, + __u8 *value); +static int cat_subread(voyager_module_t *modp, voyager_asic_t *asicp, + __u16 offset, __u16 len, void *buf); +static int cat_senddata(voyager_module_t *modp, voyager_asic_t *asicp, + __u8 reg, __u8 value); +static int cat_disconnect(voyager_module_t *modp, voyager_asic_t *asicp); +static int cat_connect(voyager_module_t *modp, voyager_asic_t *asicp); + +static inline const char * +cat_module_name(int module_id) +{ + switch(module_id) { + case 0x10: + return "Processor Slot 0"; + case 0x11: + return "Processor Slot 1"; + case 0x12: + return "Processor Slot 2"; + case 0x13: + return "Processor Slot 4"; + case 0x14: + return "Memory Slot 0"; + case 0x15: + return "Memory Slot 1"; + case 0x18: + return "Primary Microchannel"; + case 0x19: + return "Secondary Microchannel"; + case 0x1a: + return "Power Supply Interface"; + case 0x1c: + return "Processor Slot 5"; + case 0x1d: + return "Processor Slot 6"; + case 0x1e: + return "Processor Slot 7"; + case 0x1f: + return "Processor Slot 8"; + default: + return "Unknown Module"; + } +} + +static int sspb = 0; /* stores the super port location */ +int voyager_8slot = 0; /* set to true if a 51xx monster */ + +voyager_module_t *voyager_cat_list; + +/* the I/O port assignments for the VIC and QIC */ +static struct resource vic_res = { + "Voyager Interrupt Controller", 0xFC00, 0xFC6F }; +static struct resource qic_res = { + "Quad Interrupt Controller", 0xFC70, 0xFCFF }; + +/* This function is used to pack a data bit stream inside a message. + * It writes num_bits of the data buffer in msg starting at start_bit. + * Note: This function assumes that any unused bit in the data stream + * is set to zero so that the ors will work correctly */ +#define BITS_PER_BYTE 8 +static void +cat_pack(__u8 *msg, const __u16 start_bit, __u8 *data, const __u16 num_bits) +{ + /* compute initial shift needed */ + const __u16 offset = start_bit % BITS_PER_BYTE; + __u16 len = num_bits / BITS_PER_BYTE; + __u16 byte = start_bit / BITS_PER_BYTE; + __u16 residue = (num_bits % BITS_PER_BYTE) + offset; + int i; + + /* adjust if we have more than a byte of residue */ + if(residue >= BITS_PER_BYTE) { + residue -= BITS_PER_BYTE; + len++; + } + + /* clear out the bits. We assume here that if len==0 then + * residue >= offset. This is always true for the catbus + * operations */ + msg[byte] &= 0xff << (BITS_PER_BYTE - offset); + msg[byte++] |= data[0] >> offset; + if(len == 0) + return; + for(i = 1; i < len; i++) + msg[byte++] = (data[i-1] << (BITS_PER_BYTE - offset)) + | (data[i] >> offset); + if(residue != 0) { + __u8 mask = 0xff >> residue; + __u8 last_byte = data[i-1] << (BITS_PER_BYTE - offset) + | (data[i] >> offset); + + last_byte &= ~mask; + msg[byte] &= mask; + msg[byte] |= last_byte; + } + return; +} +/* unpack the data again (same arguments as cat_pack()). data buffer + * must be zero populated. + * + * Function: given a message string move to start_bit and copy num_bits into + * data (starting at bit 0 in data). + */ +static void +cat_unpack(__u8 *msg, const __u16 start_bit, __u8 *data, const __u16 num_bits) +{ + /* compute initial shift needed */ + const __u16 offset = start_bit % BITS_PER_BYTE; + __u16 len = num_bits / BITS_PER_BYTE; + const __u8 last_bits = num_bits % BITS_PER_BYTE; + __u16 byte = start_bit / BITS_PER_BYTE; + int i; + + if(last_bits != 0) + len++; + + /* special case: want < 8 bits from msg and we can get it from + * a single byte of the msg */ + if(len == 0 && BITS_PER_BYTE - offset >= num_bits) { + data[0] = msg[byte] << offset; + data[0] &= 0xff >> (BITS_PER_BYTE - num_bits); + return; + } + for(i = 0; i < len; i++) { + /* this annoying if has to be done just in case a read of + * msg one beyond the array causes a panic */ + if(offset != 0) { + data[i] = msg[byte++] << offset; + data[i] |= msg[byte] >> (BITS_PER_BYTE - offset); + } + else { + data[i] = msg[byte++]; + } + } + /* do we need to truncate the final byte */ + if(last_bits != 0) { + data[i-1] &= 0xff << (BITS_PER_BYTE - last_bits); + } + return; +} + +static void +cat_build_header(__u8 *header, const __u16 len, const __u16 smallest_reg_bits, + const __u16 longest_reg_bits) +{ + int i; + __u16 start_bit = (smallest_reg_bits - 1) % BITS_PER_BYTE; + __u8 *last_byte = &header[len - 1]; + + if(start_bit == 0) + start_bit = 1; /* must have at least one bit in the hdr */ + + for(i=0; i < len; i++) + header[i] = 0; + + for(i = start_bit; i > 0; i--) + *last_byte = ((*last_byte) << 1) + 1; + +} + +static int +cat_sendinst(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, __u8 op) +{ + __u8 parity, inst, inst_buf[4] = { 0 }; + __u8 iseq[VOYAGER_MAX_SCAN_PATH], hseq[VOYAGER_MAX_REG_SIZE]; + __u16 ibytes, hbytes, padbits; + int i; + + /* + * Parity is the parity of the register number + 1 (READ_REGISTER + * and WRITE_REGISTER always add '1' to the number of bits == 1) + */ + parity = (__u8)(1 + (reg & 0x01) + + ((__u8)(reg & 0x02) >> 1) + + ((__u8)(reg & 0x04) >> 2) + + ((__u8)(reg & 0x08) >> 3)) % 2; + + inst = ((parity << 7) | (reg << 2) | op); + + outb(VOYAGER_CAT_IRCYC, CAT_CMD); + if(!modp->scan_path_connected) { + if(asicp->asic_id != VOYAGER_CAT_ID) { + printk("**WARNING***: cat_sendinst has disconnected scan path not to CAT asic\n"); + return 1; + } + outb(VOYAGER_CAT_HEADER, CAT_DATA); + outb(inst, CAT_DATA); + if(inb(CAT_DATA) != VOYAGER_CAT_HEADER) { + CDEBUG(("VOYAGER CAT: cat_sendinst failed to get CAT_HEADER\n")); + return 1; + } + return 0; + } + ibytes = modp->inst_bits / BITS_PER_BYTE; + if((padbits = modp->inst_bits % BITS_PER_BYTE) != 0) { + padbits = BITS_PER_BYTE - padbits; + ibytes++; + } + hbytes = modp->largest_reg / BITS_PER_BYTE; + if(modp->largest_reg % BITS_PER_BYTE) + hbytes++; + CDEBUG(("cat_sendinst: ibytes=%d, hbytes=%d\n", ibytes, hbytes)); + /* initialise the instruction sequence to 0xff */ + for(i=0; i < ibytes + hbytes; i++) + iseq[i] = 0xff; + cat_build_header(hseq, hbytes, modp->smallest_reg, modp->largest_reg); + cat_pack(iseq, modp->inst_bits, hseq, hbytes * BITS_PER_BYTE); + inst_buf[0] = inst; + inst_buf[1] = 0xFF >> (modp->largest_reg % BITS_PER_BYTE); + cat_pack(iseq, asicp->bit_location, inst_buf, asicp->ireg_length); +#ifdef VOYAGER_CAT_DEBUG + printk("ins = 0x%x, iseq: ", inst); + for(i=0; i< ibytes + hbytes; i++) + printk("0x%x ", iseq[i]); + printk("\n"); +#endif + if(cat_shiftout(iseq, ibytes, hbytes, padbits)) { + CDEBUG(("VOYAGER CAT: cat_sendinst: cat_shiftout failed\n")); + return 1; + } + CDEBUG(("CAT SHIFTOUT DONE\n")); + return 0; +} + +static int +cat_getdata(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, + __u8 *value) +{ + if(!modp->scan_path_connected) { + if(asicp->asic_id != VOYAGER_CAT_ID) { + CDEBUG(("VOYAGER CAT: ERROR: cat_getdata to CAT asic with scan path connected\n")); + return 1; + } + if(reg > VOYAGER_SUBADDRHI) + outb(VOYAGER_CAT_RUN, CAT_CMD); + outb(VOYAGER_CAT_DRCYC, CAT_CMD); + outb(VOYAGER_CAT_HEADER, CAT_DATA); + *value = inb(CAT_DATA); + outb(0xAA, CAT_DATA); + if(inb(CAT_DATA) != VOYAGER_CAT_HEADER) { + CDEBUG(("cat_getdata: failed to get VOYAGER_CAT_HEADER\n")); + return 1; + } + return 0; + } + else { + __u16 sbits = modp->num_asics -1 + asicp->ireg_length; + __u16 sbytes = sbits / BITS_PER_BYTE; + __u16 tbytes; + __u8 string[VOYAGER_MAX_SCAN_PATH], trailer[VOYAGER_MAX_REG_SIZE]; + __u8 padbits; + int i; + + outb(VOYAGER_CAT_DRCYC, CAT_CMD); + + if((padbits = sbits % BITS_PER_BYTE) != 0) { + padbits = BITS_PER_BYTE - padbits; + sbytes++; + } + tbytes = asicp->ireg_length / BITS_PER_BYTE; + if(asicp->ireg_length % BITS_PER_BYTE) + tbytes++; + CDEBUG(("cat_getdata: tbytes = %d, sbytes = %d, padbits = %d\n", + tbytes, sbytes, padbits)); + cat_build_header(trailer, tbytes, 1, asicp->ireg_length); + + + for(i = tbytes - 1; i >= 0; i--) { + outb(trailer[i], CAT_DATA); + string[sbytes + i] = inb(CAT_DATA); + } + + for(i = sbytes - 1; i >= 0; i--) { + outb(0xaa, CAT_DATA); + string[i] = inb(CAT_DATA); + } + *value = 0; + cat_unpack(string, padbits + (tbytes * BITS_PER_BYTE) + asicp->asic_location, value, asicp->ireg_length); +#ifdef VOYAGER_CAT_DEBUG + printk("value=0x%x, string: ", *value); + for(i=0; i< tbytes+sbytes; i++) + printk("0x%x ", string[i]); + printk("\n"); +#endif + + /* sanity check the rest of the return */ + for(i=0; i < tbytes; i++) { + __u8 input = 0; + + cat_unpack(string, padbits + (i * BITS_PER_BYTE), &input, BITS_PER_BYTE); + if(trailer[i] != input) { + CDEBUG(("cat_getdata: failed to sanity check rest of ret(%d) 0x%x != 0x%x\n", i, input, trailer[i])); + return 1; + } + } + CDEBUG(("cat_getdata DONE\n")); + return 0; + } +} + +static int +cat_shiftout(__u8 *data, __u16 data_bytes, __u16 header_bytes, __u8 pad_bits) +{ + int i; + + for(i = data_bytes + header_bytes - 1; i >= header_bytes; i--) + outb(data[i], CAT_DATA); + + for(i = header_bytes - 1; i >= 0; i--) { + __u8 header = 0; + __u8 input; + + outb(data[i], CAT_DATA); + input = inb(CAT_DATA); + CDEBUG(("cat_shiftout: returned 0x%x\n", input)); + cat_unpack(data, ((data_bytes + i) * BITS_PER_BYTE) - pad_bits, + &header, BITS_PER_BYTE); + if(input != header) { + CDEBUG(("VOYAGER CAT: cat_shiftout failed to return header 0x%x != 0x%x\n", input, header)); + return 1; + } + } + return 0; +} + +static int +cat_senddata(voyager_module_t *modp, voyager_asic_t *asicp, + __u8 reg, __u8 value) +{ + outb(VOYAGER_CAT_DRCYC, CAT_CMD); + if(!modp->scan_path_connected) { + if(asicp->asic_id != VOYAGER_CAT_ID) { + CDEBUG(("VOYAGER CAT: ERROR: scan path disconnected when asic != CAT\n")); + return 1; + } + outb(VOYAGER_CAT_HEADER, CAT_DATA); + outb(value, CAT_DATA); + if(inb(CAT_DATA) != VOYAGER_CAT_HEADER) { + CDEBUG(("cat_senddata: failed to get correct header response to sent data\n")); + return 1; + } + if(reg > VOYAGER_SUBADDRHI) { + outb(VOYAGER_CAT_RUN, CAT_CMD); + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + } + + return 0; + } + else { + __u16 hbytes = asicp->ireg_length / BITS_PER_BYTE; + __u16 dbytes = (modp->num_asics - 1 + asicp->ireg_length)/BITS_PER_BYTE; + __u8 padbits, dseq[VOYAGER_MAX_SCAN_PATH], + hseq[VOYAGER_MAX_REG_SIZE]; + int i; + + if((padbits = (modp->num_asics - 1 + + asicp->ireg_length) % BITS_PER_BYTE) != 0) { + padbits = BITS_PER_BYTE - padbits; + dbytes++; + } + if(asicp->ireg_length % BITS_PER_BYTE) + hbytes++; + + cat_build_header(hseq, hbytes, 1, asicp->ireg_length); + + for(i = 0; i < dbytes + hbytes; i++) + dseq[i] = 0xff; + CDEBUG(("cat_senddata: dbytes=%d, hbytes=%d, padbits=%d\n", + dbytes, hbytes, padbits)); + cat_pack(dseq, modp->num_asics - 1 + asicp->ireg_length, + hseq, hbytes * BITS_PER_BYTE); + cat_pack(dseq, asicp->asic_location, &value, + asicp->ireg_length); +#ifdef VOYAGER_CAT_DEBUG + printk("dseq "); + for(i=0; i<hbytes+dbytes; i++) { + printk("0x%x ", dseq[i]); + } + printk("\n"); +#endif + return cat_shiftout(dseq, dbytes, hbytes, padbits); + } +} + +static int +cat_write(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, + __u8 value) +{ + if(cat_sendinst(modp, asicp, reg, VOYAGER_WRITE_CONFIG)) + return 1; + return cat_senddata(modp, asicp, reg, value); +} + +static int +cat_read(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, + __u8 *value) +{ + if(cat_sendinst(modp, asicp, reg, VOYAGER_READ_CONFIG)) + return 1; + return cat_getdata(modp, asicp, reg, value); +} + +static int +cat_subaddrsetup(voyager_module_t *modp, voyager_asic_t *asicp, __u16 offset, + __u16 len) +{ + __u8 val; + + if(len > 1) { + /* set auto increment */ + __u8 newval; + + if(cat_read(modp, asicp, VOYAGER_AUTO_INC_REG, &val)) { + CDEBUG(("cat_subaddrsetup: read of VOYAGER_AUTO_INC_REG failed\n")); + return 1; + } + CDEBUG(("cat_subaddrsetup: VOYAGER_AUTO_INC_REG = 0x%x\n", val)); + newval = val | VOYAGER_AUTO_INC; + if(newval != val) { + if(cat_write(modp, asicp, VOYAGER_AUTO_INC_REG, val)) { + CDEBUG(("cat_subaddrsetup: write to VOYAGER_AUTO_INC_REG failed\n")); + return 1; + } + } + } + if(cat_write(modp, asicp, VOYAGER_SUBADDRLO, (__u8)(offset &0xff))) { + CDEBUG(("cat_subaddrsetup: write to SUBADDRLO failed\n")); + return 1; + } + if(asicp->subaddr > VOYAGER_SUBADDR_LO) { + if(cat_write(modp, asicp, VOYAGER_SUBADDRHI, (__u8)(offset >> 8))) { + CDEBUG(("cat_subaddrsetup: write to SUBADDRHI failed\n")); + return 1; + } + cat_read(modp, asicp, VOYAGER_SUBADDRHI, &val); + CDEBUG(("cat_subaddrsetup: offset = %d, hi = %d\n", offset, val)); + } + cat_read(modp, asicp, VOYAGER_SUBADDRLO, &val); + CDEBUG(("cat_subaddrsetup: offset = %d, lo = %d\n", offset, val)); + return 0; +} + +static int +cat_subwrite(voyager_module_t *modp, voyager_asic_t *asicp, __u16 offset, + __u16 len, void *buf) +{ + int i, retval; + + /* FIXME: need special actions for VOYAGER_CAT_ID here */ + if(asicp->asic_id == VOYAGER_CAT_ID) { + CDEBUG(("cat_subwrite: ATTEMPT TO WRITE TO CAT ASIC\n")); + /* FIXME -- This is supposed to be handled better + * There is a problem writing to the cat asic in the + * PSI. The 30us delay seems to work, though */ + udelay(30); + } + + if((retval = cat_subaddrsetup(modp, asicp, offset, len)) != 0) { + printk("cat_subwrite: cat_subaddrsetup FAILED\n"); + return retval; + } + + if(cat_sendinst(modp, asicp, VOYAGER_SUBADDRDATA, VOYAGER_WRITE_CONFIG)) { + printk("cat_subwrite: cat_sendinst FAILED\n"); + return 1; + } + for(i = 0; i < len; i++) { + if(cat_senddata(modp, asicp, 0xFF, ((__u8 *)buf)[i])) { + printk("cat_subwrite: cat_sendata element at %d FAILED\n", i); + return 1; + } + } + return 0; +} +static int +cat_subread(voyager_module_t *modp, voyager_asic_t *asicp, __u16 offset, + __u16 len, void *buf) +{ + int i, retval; + + if((retval = cat_subaddrsetup(modp, asicp, offset, len)) != 0) { + CDEBUG(("cat_subread: cat_subaddrsetup FAILED\n")); + return retval; + } + + if(cat_sendinst(modp, asicp, VOYAGER_SUBADDRDATA, VOYAGER_READ_CONFIG)) { + CDEBUG(("cat_subread: cat_sendinst failed\n")); + return 1; + } + for(i = 0; i < len; i++) { + if(cat_getdata(modp, asicp, 0xFF, + &((__u8 *)buf)[i])) { + CDEBUG(("cat_subread: cat_getdata element %d failed\n", i)); + return 1; + } + } + return 0; +} + + +/* buffer for storing EPROM data read in during initialisation */ +static __initdata __u8 eprom_buf[0xFFFF]; +static voyager_module_t *voyager_initial_module; + +/* Initialise the cat bus components. We assume this is called by the + * boot cpu *after* all memory initialisation has been done (so we can + * use kmalloc) but before smp initialisation, so we can probe the SMP + * configuration and pick up necessary information. */ +void +voyager_cat_init(void) +{ + voyager_module_t **modpp = &voyager_initial_module; + voyager_asic_t **asicpp; + voyager_asic_t *qabc_asic = NULL; + int i, j; + unsigned long qic_addr = 0; + __u8 qabc_data[0x20]; + __u8 num_submodules, val; + voyager_eprom_hdr_t *eprom_hdr = (voyager_eprom_hdr_t *)&eprom_buf[0]; + + __u8 cmos[4]; + unsigned long addr; + + /* initiallise the SUS mailbox */ + for(i=0; i<sizeof(cmos); i++) + cmos[i] = voyager_extended_cmos_read(VOYAGER_DUMP_LOCATION + i); + addr = *(unsigned long *)cmos; + if((addr & 0xff000000) != 0xff000000) { + printk(KERN_ERR "Voyager failed to get SUS mailbox (addr = 0x%lx\n", addr); + } else { + static struct resource res; + + res.name = "voyager SUS"; + res.start = addr; + res.end = addr+0x3ff; + + request_resource(&iomem_resource, &res); + voyager_SUS = (struct voyager_SUS *) + ioremap(addr, 0x400); + printk(KERN_NOTICE "Voyager SUS mailbox version 0x%x\n", + voyager_SUS->SUS_version); + voyager_SUS->kernel_version = VOYAGER_MAILBOX_VERSION; + voyager_SUS->kernel_flags = VOYAGER_OS_HAS_SYSINT; + } + + /* clear the processor counts */ + voyager_extended_vic_processors = 0; + voyager_quad_processors = 0; + + + + printk("VOYAGER: beginning CAT bus probe\n"); + /* set up the SuperSet Port Block which tells us where the + * CAT communication port is */ + sspb = inb(VOYAGER_SSPB_RELOCATION_PORT) * 0x100; + VDEBUG(("VOYAGER DEBUG: sspb = 0x%x\n", sspb)); + + /* now find out if were 8 slot or normal */ + if((inb(VIC_PROC_WHO_AM_I) & EIGHT_SLOT_IDENTIFIER) + == EIGHT_SLOT_IDENTIFIER) { + voyager_8slot = 1; + printk(KERN_NOTICE "Voyager: Eight slot 51xx configuration detected\n"); + } + + for(i = VOYAGER_MIN_MODULE; + i <= VOYAGER_MAX_MODULE; i++) { + __u8 input; + int asic; + __u16 eprom_size; + __u16 sp_offset; + + outb(VOYAGER_CAT_DESELECT, VOYAGER_CAT_CONFIG_PORT); + outb(i, VOYAGER_CAT_CONFIG_PORT); + + /* check the presence of the module */ + outb(VOYAGER_CAT_RUN, CAT_CMD); + outb(VOYAGER_CAT_IRCYC, CAT_CMD); + outb(VOYAGER_CAT_HEADER, CAT_DATA); + /* stream series of alternating 1's and 0's to stimulate + * response */ + outb(0xAA, CAT_DATA); + input = inb(CAT_DATA); + outb(VOYAGER_CAT_END, CAT_CMD); + if(input != VOYAGER_CAT_HEADER) { + continue; + } + CDEBUG(("VOYAGER DEBUG: found module id 0x%x, %s\n", i, + cat_module_name(i))); + *modpp = kmalloc(sizeof(voyager_module_t), GFP_KERNEL); /*&voyager_module_storage[cat_count++];*/ + if(*modpp == NULL) { + printk("**WARNING** kmalloc failure in cat_init\n"); + continue; + } + memset(*modpp, 0, sizeof(voyager_module_t)); + /* need temporary asic for cat_subread. It will be + * filled in correctly later */ + (*modpp)->asic = kmalloc(sizeof(voyager_asic_t), GFP_KERNEL); /*&voyager_asic_storage[asic_count];*/ + if((*modpp)->asic == NULL) { + printk("**WARNING** kmalloc failure in cat_init\n"); + continue; + } + memset((*modpp)->asic, 0, sizeof(voyager_asic_t)); + (*modpp)->asic->asic_id = VOYAGER_CAT_ID; + (*modpp)->asic->subaddr = VOYAGER_SUBADDR_HI; + (*modpp)->module_addr = i; + (*modpp)->scan_path_connected = 0; + if(i == VOYAGER_PSI) { + /* Exception leg for modules with no EEPROM */ + printk("Module \"%s\"\n", cat_module_name(i)); + continue; + } + + CDEBUG(("cat_init: Reading eeprom for module 0x%x at offset %d\n", i, VOYAGER_XSUM_END_OFFSET)); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(*modpp, (*modpp)->asic); + if(cat_subread(*modpp, (*modpp)->asic, + VOYAGER_XSUM_END_OFFSET, sizeof(eprom_size), + &eprom_size)) { + printk("**WARNING**: Voyager couldn't read EPROM size for module 0x%x\n", i); + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + if(eprom_size > sizeof(eprom_buf)) { + printk("**WARNING**: Voyager insufficient size to read EPROM data, module 0x%x. Need %d\n", i, eprom_size); + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + CDEBUG(("cat_init: module 0x%x, eeprom_size %d\n", i, eprom_size)); + if(cat_subread(*modpp, (*modpp)->asic, 0, + eprom_size, eprom_buf)) { + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + outb(VOYAGER_CAT_END, CAT_CMD); + printk("Module \"%s\", version 0x%x, tracer 0x%x, asics %d\n", + cat_module_name(i), eprom_hdr->version_id, + *((__u32 *)eprom_hdr->tracer), eprom_hdr->num_asics); + (*modpp)->ee_size = eprom_hdr->ee_size; + (*modpp)->num_asics = eprom_hdr->num_asics; + asicpp = &((*modpp)->asic); + sp_offset = eprom_hdr->scan_path_offset; + /* All we really care about are the Quad cards. We + * identify them because they are in a processor slot + * and have only four asics */ + if((i < 0x10 || (i>=0x14 && i < 0x1c) || i>0x1f)) { + modpp = &((*modpp)->next); + continue; + } + /* Now we know it's in a processor slot, does it have + * a quad baseboard submodule */ + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_read(*modpp, (*modpp)->asic, VOYAGER_SUBMODPRESENT, + &num_submodules); + /* lowest two bits, active low */ + num_submodules = ~(0xfc | num_submodules); + CDEBUG(("VOYAGER CAT: %d submodules present\n", num_submodules)); + if(num_submodules == 0) { + /* fill in the dyadic extended processors */ + __u8 cpu = i & 0x07; + + printk("Module \"%s\": Dyadic Processor Card\n", + cat_module_name(i)); + voyager_extended_vic_processors |= (1<<cpu); + cpu += 4; + voyager_extended_vic_processors |= (1<<cpu); + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + + /* now we want to read the asics on the first submodule, + * which should be the quad base board */ + + cat_read(*modpp, (*modpp)->asic, VOYAGER_SUBMODSELECT, &val); + CDEBUG(("cat_init: SUBMODSELECT value = 0x%x\n", val)); + val = (val & 0x7c) | VOYAGER_QUAD_BASEBOARD; + cat_write(*modpp, (*modpp)->asic, VOYAGER_SUBMODSELECT, val); + + outb(VOYAGER_CAT_END, CAT_CMD); + + + CDEBUG(("cat_init: Reading eeprom for module 0x%x at offset %d\n", i, VOYAGER_XSUM_END_OFFSET)); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(*modpp, (*modpp)->asic); + if(cat_subread(*modpp, (*modpp)->asic, + VOYAGER_XSUM_END_OFFSET, sizeof(eprom_size), + &eprom_size)) { + printk("**WARNING**: Voyager couldn't read EPROM size for module 0x%x\n", i); + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + if(eprom_size > sizeof(eprom_buf)) { + printk("**WARNING**: Voyager insufficient size to read EPROM data, module 0x%x. Need %d\n", i, eprom_size); + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + CDEBUG(("cat_init: module 0x%x, eeprom_size %d\n", i, eprom_size)); + if(cat_subread(*modpp, (*modpp)->asic, 0, + eprom_size, eprom_buf)) { + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + outb(VOYAGER_CAT_END, CAT_CMD); + /* Now do everything for the QBB submodule 1 */ + (*modpp)->ee_size = eprom_hdr->ee_size; + (*modpp)->num_asics = eprom_hdr->num_asics; + asicpp = &((*modpp)->asic); + sp_offset = eprom_hdr->scan_path_offset; + /* get rid of the dummy CAT asic and read the real one */ + kfree((*modpp)->asic); + for(asic=0; asic < (*modpp)->num_asics; asic++) { + int j; + voyager_asic_t *asicp = *asicpp + = kmalloc(sizeof(voyager_asic_t), GFP_KERNEL); /*&voyager_asic_storage[asic_count++];*/ + voyager_sp_table_t *sp_table; + voyager_at_t *asic_table; + voyager_jtt_t *jtag_table; + + if(asicp == NULL) { + printk("**WARNING** kmalloc failure in cat_init\n"); + continue; + } + memset(asicp, 0, sizeof(voyager_asic_t)); + asicpp = &(asicp->next); + asicp->asic_location = asic; + sp_table = (voyager_sp_table_t *)(eprom_buf + sp_offset); + asicp->asic_id = sp_table->asic_id; + asic_table = (voyager_at_t *)(eprom_buf + sp_table->asic_data_offset); + for(j=0; j<4; j++) + asicp->jtag_id[j] = asic_table->jtag_id[j]; + jtag_table = (voyager_jtt_t *)(eprom_buf + asic_table->jtag_offset); + asicp->ireg_length = jtag_table->ireg_len; + asicp->bit_location = (*modpp)->inst_bits; + (*modpp)->inst_bits += asicp->ireg_length; + if(asicp->ireg_length > (*modpp)->largest_reg) + (*modpp)->largest_reg = asicp->ireg_length; + if (asicp->ireg_length < (*modpp)->smallest_reg || + (*modpp)->smallest_reg == 0) + (*modpp)->smallest_reg = asicp->ireg_length; + CDEBUG(("asic 0x%x, ireg_length=%d, bit_location=%d\n", + asicp->asic_id, asicp->ireg_length, + asicp->bit_location)); + if(asicp->asic_id == VOYAGER_QUAD_QABC) { + CDEBUG(("VOYAGER CAT: QABC ASIC found\n")); + qabc_asic = asicp; + } + sp_offset += sizeof(voyager_sp_table_t); + } + CDEBUG(("Module inst_bits = %d, largest_reg = %d, smallest_reg=%d\n", + (*modpp)->inst_bits, (*modpp)->largest_reg, + (*modpp)->smallest_reg)); + /* OK, now we have the QUAD ASICs set up, use them. + * we need to: + * + * 1. Find the Memory area for the Quad CPIs. + * 2. Find the Extended VIC processor + * 3. Configure a second extended VIC processor (This + * cannot be done for the 51xx. + * */ + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_connect(*modpp, (*modpp)->asic); + CDEBUG(("CAT CONNECTED!!\n")); + cat_subread(*modpp, qabc_asic, 0, sizeof(qabc_data), qabc_data); + qic_addr = qabc_data[5] << 8; + qic_addr = (qic_addr | qabc_data[6]) << 8; + qic_addr = (qic_addr | qabc_data[7]) << 8; + printk("Module \"%s\": Quad Processor Card; CPI 0x%lx, SET=0x%x\n", + cat_module_name(i), qic_addr, qabc_data[8]); +#if 0 /* plumbing fails---FIXME */ + if((qabc_data[8] & 0xf0) == 0) { + /* FIXME: 32 way 8 CPU slot monster cannot be + * plumbed this way---need to check for it */ + + printk("Plumbing second Extended Quad Processor\n"); + /* second VIC line hardwired to Quad CPU 1 */ + qabc_data[8] |= 0x20; + cat_subwrite(*modpp, qabc_asic, 8, 1, &qabc_data[8]); +#ifdef VOYAGER_CAT_DEBUG + /* verify plumbing */ + cat_subread(*modpp, qabc_asic, 8, 1, &qabc_data[8]); + if((qabc_data[8] & 0xf0) == 0) { + CDEBUG(("PLUMBING FAILED: 0x%x\n", qabc_data[8])); + } +#endif + } +#endif + + { + struct resource *res = kmalloc(sizeof(struct resource),GFP_KERNEL); + memset(res, 0, sizeof(struct resource)); + res->name = kmalloc(128, GFP_KERNEL); + sprintf((char *)res->name, "Voyager %s Quad CPI", cat_module_name(i)); + res->start = qic_addr; + res->end = qic_addr + 0x3ff; + request_resource(&iomem_resource, res); + } + + qic_addr = (unsigned long)ioremap(qic_addr, 0x400); + + for(j = 0; j < 4; j++) { + __u8 cpu; + + if(voyager_8slot) { + /* 8 slot has a different mapping, + * each slot has only one vic line, so + * 1 cpu in each slot must be < 8 */ + cpu = (i & 0x07) + j*8; + } else { + cpu = (i & 0x03) + j*4; + } + if( (qabc_data[8] & (1<<j))) { + voyager_extended_vic_processors |= (1<<cpu); + } + if(qabc_data[8] & (1<<(j+4)) ) { + /* Second SET register plumbed: Quad + * card has two VIC connected CPUs. + * Secondary cannot be booted as a VIC + * CPU */ + voyager_extended_vic_processors |= (1<<cpu); + voyager_allowed_boot_processors &= (~(1<<cpu)); + } + + voyager_quad_processors |= (1<<cpu); + voyager_quad_cpi_addr[cpu] = (struct voyager_qic_cpi *) + (qic_addr+(j<<8)); + CDEBUG(("CPU%d: CPI address 0x%lx\n", cpu, + (unsigned long)voyager_quad_cpi_addr[cpu])); + } + outb(VOYAGER_CAT_END, CAT_CMD); + + + + *asicpp = NULL; + modpp = &((*modpp)->next); + } + *modpp = NULL; + printk("CAT Bus Initialisation finished: extended procs 0x%x, quad procs 0x%x, allowed vic boot = 0x%x\n", voyager_extended_vic_processors, voyager_quad_processors, voyager_allowed_boot_processors); + request_resource(&ioport_resource, &vic_res); + if(voyager_quad_processors) + request_resource(&ioport_resource, &qic_res); + /* set up the front power switch */ +} + +int +voyager_cat_readb(__u8 module, __u8 asic, int reg) +{ + return 0; +} + +static int +cat_disconnect(voyager_module_t *modp, voyager_asic_t *asicp) +{ + __u8 val; + int err = 0; + + if(!modp->scan_path_connected) + return 0; + if(asicp->asic_id != VOYAGER_CAT_ID) { + CDEBUG(("cat_disconnect: ASIC is not CAT\n")); + return 1; + } + err = cat_read(modp, asicp, VOYAGER_SCANPATH, &val); + if(err) { + CDEBUG(("cat_disconnect: failed to read SCANPATH\n")); + return err; + } + val &= VOYAGER_DISCONNECT_ASIC; + err = cat_write(modp, asicp, VOYAGER_SCANPATH, val); + if(err) { + CDEBUG(("cat_disconnect: failed to write SCANPATH\n")); + return err; + } + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + modp->scan_path_connected = 0; + + return 0; +} + +static int +cat_connect(voyager_module_t *modp, voyager_asic_t *asicp) +{ + __u8 val; + int err = 0; + + if(modp->scan_path_connected) + return 0; + if(asicp->asic_id != VOYAGER_CAT_ID) { + CDEBUG(("cat_connect: ASIC is not CAT\n")); + return 1; + } + + err = cat_read(modp, asicp, VOYAGER_SCANPATH, &val); + if(err) { + CDEBUG(("cat_connect: failed to read SCANPATH\n")); + return err; + } + val |= VOYAGER_CONNECT_ASIC; + err = cat_write(modp, asicp, VOYAGER_SCANPATH, val); + if(err) { + CDEBUG(("cat_connect: failed to write SCANPATH\n")); + return err; + } + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + modp->scan_path_connected = 1; + + return 0; +} + +void +voyager_cat_power_off(void) +{ + /* Power the machine off by writing to the PSI over the CAT + * bus */ + __u8 data; + voyager_module_t psi = { 0 }; + voyager_asic_t psi_asic = { 0 }; + + psi.asic = &psi_asic; + psi.asic->asic_id = VOYAGER_CAT_ID; + psi.asic->subaddr = VOYAGER_SUBADDR_HI; + psi.module_addr = VOYAGER_PSI; + psi.scan_path_connected = 0; + + outb(VOYAGER_CAT_END, CAT_CMD); + /* Connect the PSI to the CAT Bus */ + outb(VOYAGER_CAT_DESELECT, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_PSI, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(&psi, &psi_asic); + /* Read the status */ + cat_subread(&psi, &psi_asic, VOYAGER_PSI_GENERAL_REG, 1, &data); + outb(VOYAGER_CAT_END, CAT_CMD); + CDEBUG(("PSI STATUS 0x%x\n", data)); + /* These two writes are power off prep and perform */ + data = PSI_CLEAR; + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_subwrite(&psi, &psi_asic, VOYAGER_PSI_GENERAL_REG, 1, &data); + outb(VOYAGER_CAT_END, CAT_CMD); + data = PSI_POWER_DOWN; + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_subwrite(&psi, &psi_asic, VOYAGER_PSI_GENERAL_REG, 1, &data); + outb(VOYAGER_CAT_END, CAT_CMD); +} + +struct voyager_status voyager_status = { 0 }; + +void +voyager_cat_psi(__u8 cmd, __u16 reg, __u8 *data) +{ + voyager_module_t psi = { 0 }; + voyager_asic_t psi_asic = { 0 }; + + psi.asic = &psi_asic; + psi.asic->asic_id = VOYAGER_CAT_ID; + psi.asic->subaddr = VOYAGER_SUBADDR_HI; + psi.module_addr = VOYAGER_PSI; + psi.scan_path_connected = 0; + + outb(VOYAGER_CAT_END, CAT_CMD); + /* Connect the PSI to the CAT Bus */ + outb(VOYAGER_CAT_DESELECT, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_PSI, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(&psi, &psi_asic); + switch(cmd) { + case VOYAGER_PSI_READ: + cat_read(&psi, &psi_asic, reg, data); + break; + case VOYAGER_PSI_WRITE: + cat_write(&psi, &psi_asic, reg, *data); + break; + case VOYAGER_PSI_SUBREAD: + cat_subread(&psi, &psi_asic, reg, 1, data); + break; + case VOYAGER_PSI_SUBWRITE: + cat_subwrite(&psi, &psi_asic, reg, 1, data); + break; + default: + printk(KERN_ERR "Voyager PSI, unrecognised command %d\n", cmd); + break; + } + outb(VOYAGER_CAT_END, CAT_CMD); +} + +void +voyager_cat_do_common_interrupt(void) +{ + /* This is caused either by a memory parity error or something + * in the PSI */ + __u8 data; + voyager_module_t psi = { 0 }; + voyager_asic_t psi_asic = { 0 }; + struct voyager_psi psi_reg; + int i; + re_read: + psi.asic = &psi_asic; + psi.asic->asic_id = VOYAGER_CAT_ID; + psi.asic->subaddr = VOYAGER_SUBADDR_HI; + psi.module_addr = VOYAGER_PSI; + psi.scan_path_connected = 0; + + outb(VOYAGER_CAT_END, CAT_CMD); + /* Connect the PSI to the CAT Bus */ + outb(VOYAGER_CAT_DESELECT, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_PSI, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(&psi, &psi_asic); + /* Read the status. NOTE: Need to read *all* the PSI regs here + * otherwise the cmn int will be reasserted */ + for(i = 0; i < sizeof(psi_reg.regs); i++) { + cat_read(&psi, &psi_asic, i, &((__u8 *)&psi_reg.regs)[i]); + } + outb(VOYAGER_CAT_END, CAT_CMD); + if((psi_reg.regs.checkbit & 0x02) == 0) { + psi_reg.regs.checkbit |= 0x02; + cat_write(&psi, &psi_asic, 5, psi_reg.regs.checkbit); + printk("VOYAGER RE-READ PSI\n"); + goto re_read; + } + outb(VOYAGER_CAT_RUN, CAT_CMD); + for(i = 0; i < sizeof(psi_reg.subregs); i++) { + /* This looks strange, but the PSI doesn't do auto increment + * correctly */ + cat_subread(&psi, &psi_asic, VOYAGER_PSI_SUPPLY_REG + i, + 1, &((__u8 *)&psi_reg.subregs)[i]); + } + outb(VOYAGER_CAT_END, CAT_CMD); +#ifdef VOYAGER_CAT_DEBUG + printk("VOYAGER PSI: "); + for(i=0; i<sizeof(psi_reg.regs); i++) + printk("%02x ", ((__u8 *)&psi_reg.regs)[i]); + printk("\n "); + for(i=0; i<sizeof(psi_reg.subregs); i++) + printk("%02x ", ((__u8 *)&psi_reg.subregs)[i]); + printk("\n"); +#endif + if(psi_reg.regs.intstatus & PSI_MON) { + /* switch off or power fail */ + + if(psi_reg.subregs.supply & PSI_SWITCH_OFF) { + if(voyager_status.switch_off) { + printk(KERN_ERR "Voyager front panel switch turned off again---Immediate power off!\n"); + voyager_cat_power_off(); + /* not reached */ + } else { + printk(KERN_ERR "Voyager front panel switch turned off\n"); + voyager_status.switch_off = 1; + voyager_status.request_from_kernel = 1; + up(&kvoyagerd_sem); + } + /* Tell the hardware we're taking care of the + * shutdown, otherwise it will power the box off + * within 3 seconds of the switch being pressed and, + * which is much more important to us, continue to + * assert the common interrupt */ + data = PSI_CLR_SWITCH_OFF; + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_subwrite(&psi, &psi_asic, VOYAGER_PSI_SUPPLY_REG, + 1, &data); + outb(VOYAGER_CAT_END, CAT_CMD); + } else { + + VDEBUG(("Voyager ac fail reg 0x%x\n", + psi_reg.subregs.ACfail)); + if((psi_reg.subregs.ACfail & AC_FAIL_STAT_CHANGE) == 0) { + /* No further update */ + return; + } +#if 0 + /* Don't bother trying to find out who failed. + * FIXME: This probably makes the code incorrect on + * anything other than a 345x */ + for(i=0; i< 5; i++) { + if( psi_reg.subregs.ACfail &(1<<i)) { + break; + } + } + printk(KERN_NOTICE "AC FAIL IN SUPPLY %d\n", i); +#endif + /* DON'T do this: it shuts down the AC PSI + outb(VOYAGER_CAT_RUN, CAT_CMD); + data = PSI_MASK_MASK | i; + cat_subwrite(&psi, &psi_asic, VOYAGER_PSI_MASK, + 1, &data); + outb(VOYAGER_CAT_END, CAT_CMD); + */ + printk(KERN_ERR "Voyager AC power failure\n"); + outb(VOYAGER_CAT_RUN, CAT_CMD); + data = PSI_COLD_START; + cat_subwrite(&psi, &psi_asic, VOYAGER_PSI_GENERAL_REG, + 1, &data); + outb(VOYAGER_CAT_END, CAT_CMD); + voyager_status.power_fail = 1; + voyager_status.request_from_kernel = 1; + up(&kvoyagerd_sem); + } + + + } else if(psi_reg.regs.intstatus & PSI_FAULT) { + /* Major fault! */ + printk(KERN_ERR "Voyager PSI Detected major fault, immediate power off!\n"); + voyager_cat_power_off(); + /* not reached */ + } else if(psi_reg.regs.intstatus & (PSI_DC_FAIL | PSI_ALARM + | PSI_CURRENT | PSI_DVM + | PSI_PSCFAULT | PSI_STAT_CHG)) { + /* other psi fault */ + + printk(KERN_WARNING "Voyager PSI status 0x%x\n", data); + /* clear the PSI fault */ + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_write(&psi, &psi_asic, VOYAGER_PSI_STATUS_REG, 0); + outb(VOYAGER_CAT_END, CAT_CMD); + } +} diff --git a/arch/i386/mach-voyager/voyager_smp.c b/arch/i386/mach-voyager/voyager_smp.c new file mode 100644 index 000000000000..d8384ea6463f --- /dev/null +++ b/arch/i386/mach-voyager/voyager_smp.c @@ -0,0 +1,1989 @@ +/* -*- mode: c; c-basic-offset: 8 -*- */ + +/* Copyright (C) 1999,2001 + * + * Author: J.E.J.Bottomley@HansenPartnership.com + * + * linux/arch/i386/kernel/voyager_smp.c + * + * This file provides all the same external entries as smp.c but uses + * the voyager hal to provide the functionality + */ +#include <linux/config.h> +#include <linux/mm.h> +#include <linux/kernel_stat.h> +#include <linux/delay.h> +#include <linux/mc146818rtc.h> +#include <linux/cache.h> +#include <linux/interrupt.h> +#include <linux/smp_lock.h> +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/bootmem.h> +#include <linux/completion.h> +#include <asm/desc.h> +#include <asm/voyager.h> +#include <asm/vic.h> +#include <asm/pgalloc.h> +#include <asm/mtrr.h> +#include <asm/pgalloc.h> +#include <asm/tlbflush.h> +#include <asm/smpboot.h> +#include <asm/desc.h> +#include <asm/arch_hooks.h> + +#include <linux/irq.h> + +int reboot_smp = 0; + +/* TLB state -- visible externally, indexed physically */ +struct tlb_state cpu_tlbstate[NR_CPUS] __cacheline_aligned = {[0 ... NR_CPUS-1] = { &init_mm, 0 }}; + +/* CPU IRQ affinity -- set to all ones initially */ +static unsigned long cpu_irq_affinity[NR_CPUS] __cacheline_aligned = { [0 ... NR_CPUS-1] = ~0UL }; + +/* Set when the idlers are all forked - Set in main.c but not actually + * used by any other parts of the kernel */ +int smp_threads_ready = 0; + +/* per CPU data structure (for /proc/cpuinfo et al), visible externally + * indexed physically */ +struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned; + +/* Per CPU interrupt stacks */ +extern union thread_union init_irq_union; +union thread_union *irq_stacks[NR_CPUS] __cacheline_aligned = + { &init_irq_union, }; + +/* physical ID of the CPU used to boot the system */ +unsigned char boot_cpu_id; + +/* The memory line addresses for the Quad CPIs */ +struct voyager_qic_cpi *voyager_quad_cpi_addr[NR_CPUS] __cacheline_aligned; + +/* The masks for the Extended VIC processors, filled in by cat_init */ +__u32 voyager_extended_vic_processors = 0; + +/* Masks for the extended Quad processors which cannot be VIC booted */ +__u32 voyager_allowed_boot_processors = 0; + +/* The mask for the Quad Processors (both extended and non-extended) */ +__u32 voyager_quad_processors = 0; + +/* Total count of live CPUs, used in process.c to display + * the CPU information and in irq.c for the per CPU irq + * activity count. Finally exported by i386_ksyms.c */ +static int voyager_extended_cpus = 1; + +/* Have we found an SMP box - used by time.c to do the profiling + interrupt for timeslicing; do not set to 1 until the per CPU timer + interrupt is active */ +int smp_found_config = 0; + +/* Used for the invalidate map that's also checked in the spinlock */ +volatile unsigned long smp_invalidate_needed; + +/* Bitmask of currently online CPUs - used by setup.c for + /proc/cpuinfo, visible externally but still physical */ +unsigned long cpu_online_map = 0; + +/* Bitmask of CPUs present in the system - exported by i386_syms.c, used + * by scheduler but indexed physically */ +unsigned long phys_cpu_present_map = 0; + +/* estimate of time used to flush the SMP-local cache - used in + * processor affinity calculations */ +cycles_t cacheflush_time = 0; + +/* cache decay ticks for scheduler---a fairly useless quantity for the + voyager system with its odd affinity and huge L3 cache */ +unsigned long cache_decay_ticks = 20; + + +/* The internal functions */ +static void send_CPI(__u32 cpuset, __u8 cpi); +static void ack_CPI(__u8 cpi); +static int ack_QIC_CPI(__u8 cpi); +static void ack_special_QIC_CPI(__u8 cpi); +static void ack_VIC_CPI(__u8 cpi); +static void send_CPI_allbutself(__u8 cpi); +static void enable_vic_irq(unsigned int irq); +static void disable_vic_irq(unsigned int irq); +static unsigned int startup_vic_irq(unsigned int irq); +static void enable_local_vic_irq(unsigned int irq); +static void disable_local_vic_irq(unsigned int irq); +static void before_handle_vic_irq(unsigned int irq); +static void after_handle_vic_irq(unsigned int irq); +static void set_vic_irq_affinity(unsigned int irq, unsigned long mask); +static void ack_vic_irq(unsigned int irq); +static void vic_enable_cpi(void); +static void do_boot_cpu(__u8 cpuid); +static void do_quad_bootstrap(void); +static inline void wrapper_smp_local_timer_interrupt(struct pt_regs *); + +int hard_smp_processor_id(void); + +/* Inline functions */ +static inline void +send_one_QIC_CPI(__u8 cpu, __u8 cpi) +{ + voyager_quad_cpi_addr[cpu]->qic_cpi[cpi].cpi = + (smp_processor_id() << 16) + cpi; +} + +static inline void +send_QIC_CPI(__u32 cpuset, __u8 cpi) +{ + int mask; + __u8 cpu; + + for_each_cpu(cpu, mask) { + if(cpuset & (1<<cpu)) { +#ifdef VOYAGER_DEBUG + if(!test_bit(cpu, cpu_online_map)) + VDEBUG(("CPU%d sending cpi %d to CPU%d not in cpu_online_map\n", hard_smp_processor_id(), cpi, cpu)); +#endif + send_one_QIC_CPI(cpu, cpi - QIC_CPI_OFFSET); + } + } +} + +static inline void +send_one_CPI(__u8 cpu, __u8 cpi) +{ + if(voyager_quad_processors & (1<<cpu)) + send_one_QIC_CPI(cpu, cpi - QIC_CPI_OFFSET); + else + send_CPI(1<<cpu, cpi); +} + +static inline void +send_CPI_allbutself(__u8 cpi) +{ + __u8 cpu = smp_processor_id(); + __u32 mask = (cpu_online_map & (~(1<<cpu))); + send_CPI(mask, cpi); +} + +static inline int +is_cpu_quad(void) +{ + __u8 cpumask = inb(VIC_PROC_WHO_AM_I); + return ((cpumask & QUAD_IDENTIFIER) == QUAD_IDENTIFIER); +} + +static inline int +is_cpu_extended(void) +{ + __u8 cpu = hard_smp_processor_id(); + + return(voyager_extended_vic_processors & (1<<cpu)); +} + +static inline int +is_cpu_vic_boot(void) +{ + __u8 cpu = hard_smp_processor_id(); + + return(voyager_extended_vic_processors + & voyager_allowed_boot_processors & (1<<cpu)); +} + + +static inline void +ack_CPI(__u8 cpi) +{ + switch(cpi) { + case VIC_CPU_BOOT_CPI: + if(is_cpu_quad() && !is_cpu_vic_boot()) + ack_QIC_CPI(cpi); + else + ack_VIC_CPI(cpi); + break; + case VIC_SYS_INT: + case VIC_CMN_INT: + /* These are slightly strange. Even on the Quad card, + * They are vectored as VIC CPIs */ + if(is_cpu_quad()) + ack_special_QIC_CPI(cpi); + else + ack_VIC_CPI(cpi); + break; + default: + printk("VOYAGER ERROR: CPI%d is in common CPI code\n", cpi); + break; + } +} + +/* local variables */ + +/* The VIC IRQ descriptors -- these look almost identical to the + * 8259 IRQs except that masks and things must be kept per processor + */ +static struct hw_interrupt_type vic_irq_type = { + "VIC-level", + startup_vic_irq, /* startup */ + disable_vic_irq, /* shutdown */ + enable_vic_irq, /* enable */ + disable_vic_irq, /* disable */ + before_handle_vic_irq, /* ack */ + after_handle_vic_irq, /* end */ + set_vic_irq_affinity, /* affinity */ +}; + +/* used to count up as CPUs are brought on line (starts at 0) */ +static int cpucount = 0; + +/* steal a page from the bottom of memory for the trampoline and + * squirrel its address away here. This will be in kernel virtual + * space */ +static __u32 trampoline_base; + +/* The per cpu profile stuff - used in smp_local_timer_interrupt */ +static unsigned int prof_multiplier[NR_CPUS] __cacheline_aligned = { 1, }; +static unsigned int prof_old_multiplier[NR_CPUS] __cacheline_aligned = { 1, }; +static unsigned int prof_counter[NR_CPUS] __cacheline_aligned = { 1, }; + +/* the map used to check if a CPU has booted */ +static __u32 cpu_booted_map; + +/* the synchronize flag used to hold all secondary CPUs spinning in + * a tight loop until the boot sequence is ready for them */ +static unsigned long smp_commenced_mask = 0; + +/* This is for the new dynamic CPU boot code */ +volatile unsigned long cpu_callin_map = 0; +unsigned long cpu_callout_map = 0; + +/* The per processor IRQ masks (these are usually kept in sync) */ +static __u16 vic_irq_mask[NR_CPUS] __cacheline_aligned; + +/* the list of IRQs to be enabled by the VIC_ENABLE_IRQ_CPI */ +static __u16 vic_irq_enable_mask[NR_CPUS] __cacheline_aligned = { 0 }; + +/* Lock for enable/disable of VIC interrupts */ +static spinlock_t vic_irq_lock __cacheline_aligned = SPIN_LOCK_UNLOCKED; + +/* The boot processor is correctly set up in PC mode when it + * comes up, but the secondaries need their master/slave 8259 + * pairs initializing correctly */ + +/* Interrupt counters (per cpu) and total - used to try to + * even up the interrupt handling routines */ +static long vic_intr_total = 0; +static long vic_intr_count[NR_CPUS] __cacheline_aligned = { 0 }; +static unsigned long vic_tick[NR_CPUS] __cacheline_aligned = { 0 }; + +/* Since we can only use CPI0, we fake all the other CPIs */ +static unsigned long vic_cpi_mailbox[NR_CPUS] __cacheline_aligned; + +/* debugging routine to read the isr of the cpu's pic */ +static inline __u16 +vic_read_isr(void) +{ + __u16 isr; + + outb(0x0b, 0xa0); + isr = inb(0xa0) << 8; + outb(0x0b, 0x20); + isr |= inb(0x20); + + return isr; +} + +static __init void +qic_setup(void) +{ + if(!is_cpu_quad()) { + /* not a quad, no setup */ + return; + } + outb(QIC_DEFAULT_MASK0, QIC_MASK_REGISTER0); + outb(QIC_CPI_ENABLE, QIC_MASK_REGISTER1); + + if(is_cpu_extended()) { + /* the QIC duplicate of the VIC base register */ + outb(VIC_DEFAULT_CPI_BASE, QIC_VIC_CPI_BASE_REGISTER); + outb(QIC_DEFAULT_CPI_BASE, QIC_CPI_BASE_REGISTER); + + /* FIXME: should set up the QIC timer and memory parity + * error vectors here */ + } +} + +static __init void +vic_setup_pic(void) +{ + outb(1, VIC_REDIRECT_REGISTER_1); + /* clear the claim registers for dynamic routing */ + outb(0, VIC_CLAIM_REGISTER_0); + outb(0, VIC_CLAIM_REGISTER_1); + + outb(0, VIC_PRIORITY_REGISTER); + /* Set the Primary and Secondary Microchannel vector + * bases to be the same as the ordinary interrupts + * + * FIXME: This would be more efficient using separate + * vectors. */ + outb(FIRST_EXTERNAL_VECTOR, VIC_PRIMARY_MC_BASE); + outb(FIRST_EXTERNAL_VECTOR, VIC_SECONDARY_MC_BASE); + /* Now initiallise the master PIC belonging to this CPU by + * sending the four ICWs */ + + /* ICW1: level triggered, ICW4 needed */ + outb(0x19, 0x20); + + /* ICW2: vector base */ + outb(FIRST_EXTERNAL_VECTOR, 0x21); + + /* ICW3: slave at line 2 */ + outb(0x04, 0x21); + + /* ICW4: 8086 mode */ + outb(0x01, 0x21); + + /* now the same for the slave PIC */ + + /* ICW1: level trigger, ICW4 needed */ + outb(0x19, 0xA0); + + /* ICW2: slave vector base */ + outb(FIRST_EXTERNAL_VECTOR + 8, 0xA1); + + /* ICW3: slave ID */ + outb(0x02, 0xA1); + + /* ICW4: 8086 mode */ + outb(0x01, 0xA1); +} + +static void +do_quad_bootstrap(void) +{ + if(is_cpu_quad() && is_cpu_vic_boot()) { + int i; + unsigned long flags; + __u8 cpuid = hard_smp_processor_id(); + + local_irq_save(flags); + + for(i = 0; i<4; i++) { + /* FIXME: this would be >>3 &0x7 on the 32 way */ + if(((cpuid >> 2) & 0x03) == i) + /* don't lower our own mask! */ + continue; + + /* masquerade as local Quad CPU */ + outb(QIC_CPUID_ENABLE | i, QIC_PROCESSOR_ID); + /* enable the startup CPI */ + outb(QIC_BOOT_CPI_MASK, QIC_MASK_REGISTER1); + /* restore cpu id */ + outb(0, QIC_PROCESSOR_ID); + } + local_irq_restore(flags); + } +} + + +/* Set up all the basic stuff: read the SMP config and make all the + * SMP information reflect only the boot cpu. All others will be + * brought on-line later. */ +void __init +find_smp_config(void) +{ + int i; + + boot_cpu_id = hard_smp_processor_id(); + + printk("VOYAGER SMP: Boot cpu is %d\n", boot_cpu_id); + + /* initialize the CPU structures (moved from smp_boot_cpus) */ + for(i=0; i<NR_CPUS; i++) { + prof_counter[i] = 1; + prof_old_multiplier[i] = 1; + prof_multiplier[i] = 1; + cpu_irq_affinity[i] = ~0; + } + cpu_online_map = (1<<boot_cpu_id); + + /* The boot CPU must be extended */ + voyager_extended_vic_processors = 1<<boot_cpu_id; + /* initially, all of the first 8 cpu's can boot */ + voyager_allowed_boot_processors = 0xff; + /* set up everything for just this CPU, we can alter + * this as we start the other CPUs later */ + /* now get the CPU disposition from the extended CMOS */ + phys_cpu_present_map = voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK); + phys_cpu_present_map |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 1) << 8; + phys_cpu_present_map |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 2) << 16; + phys_cpu_present_map |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 3) << 24; + printk("VOYAGER SMP: phys_cpu_present_map = 0x%lx\n", phys_cpu_present_map); + /* Here we set up the VIC to enable SMP */ + /* enable the CPIs by writing the base vector to their register */ + outb(VIC_DEFAULT_CPI_BASE, VIC_CPI_BASE_REGISTER); + outb(1, VIC_REDIRECT_REGISTER_1); + /* set the claim registers for static routing --- Boot CPU gets + * all interrupts untill all other CPUs started */ + outb(0xff, VIC_CLAIM_REGISTER_0); + outb(0xff, VIC_CLAIM_REGISTER_1); + /* Set the Primary and Secondary Microchannel vector + * bases to be the same as the ordinary interrupts + * + * FIXME: This would be more efficient using separate + * vectors. */ + outb(FIRST_EXTERNAL_VECTOR, VIC_PRIMARY_MC_BASE); + outb(FIRST_EXTERNAL_VECTOR, VIC_SECONDARY_MC_BASE); + + /* Finally tell the firmware that we're driving */ + outb(inb(VOYAGER_SUS_IN_CONTROL_PORT) | VOYAGER_IN_CONTROL_FLAG, + VOYAGER_SUS_IN_CONTROL_PORT); + + current_thread_info()->cpu = boot_cpu_id; +} + +/* + * The bootstrap kernel entry code has set these up. Save them + * for a given CPU, id is physical */ +void __init +smp_store_cpu_info(int id) +{ + struct cpuinfo_x86 *c=&cpu_data[id]; + + *c = boot_cpu_data; + identify_cpu(c); +} + +/* set up the trampoline and return the physical address of the code */ +static __u32 __init +setup_trampoline(void) +{ + /* these two are global symbols in trampoline.S */ + extern __u8 trampoline_end[]; + extern __u8 trampoline_data[]; + + memcpy((__u8 *)trampoline_base, trampoline_data, + trampoline_end - trampoline_data); + return virt_to_phys((__u8 *)trampoline_base); +} + +/* Routine initially called when a non-boot CPU is brought online */ +int __init +start_secondary(void *unused) +{ + __u8 cpuid = hard_smp_processor_id(); + /* external functions not defined in the headers */ + extern void calibrate_delay(void); + extern int cpu_idle(void); + + cpu_init(); + + /* OK, we're in the routine */ + ack_CPI(VIC_CPU_BOOT_CPI); + + /* setup the 8259 master slave pair belonging to this CPU --- + * we won't actually receive any until the boot CPU + * relinquishes it's static routing mask */ + vic_setup_pic(); + + qic_setup(); + + if(is_cpu_quad() && !is_cpu_vic_boot()) { + /* clear the boot CPI */ + __u8 dummy; + + dummy = voyager_quad_cpi_addr[cpuid]->qic_cpi[VIC_CPU_BOOT_CPI].cpi; + printk("read dummy %d\n", dummy); + } + + /* lower the mask to receive CPIs */ + vic_enable_cpi(); + + VDEBUG(("VOYAGER SMP: CPU%d, stack at about %p\n", cpuid, &cpuid)); + + /* enable interrupts */ + local_irq_enable(); + + /* get our bogomips */ + calibrate_delay(); + + /* save our processor parameters */ + smp_store_cpu_info(cpuid); + + /* if we're a quad, we may need to bootstrap other CPUs */ + do_quad_bootstrap(); + + set_bit(cpuid, &cpu_callin_map); + + /* signal that we're done */ + cpu_booted_map = 1; + + while (!test_bit(cpuid, &smp_commenced_mask)) + rep_nop(); + + local_flush_tlb(); + + set_bit(cpuid, &cpu_online_map); + wmb(); + return cpu_idle(); +} + +static struct task_struct * __init +fork_by_hand(void) +{ + struct pt_regs regs; + /* don't care about the eip and regs settings since we'll + * never reschedule the forked task. */ + return do_fork(CLONE_VM|CLONE_IDLETASK, 0, ®s, 0, NULL); +} + + +static void __init setup_irq_stack(struct task_struct *p, int cpu) +{ + unsigned long stk; + + stk = __get_free_pages(GFP_KERNEL, THREAD_ORDER+1); + if (!stk) + panic("I can't seem to allocate my irq stack. Oh well, giving up."); + + irq_stacks[cpu] = (void *)stk; + memset(irq_stacks[cpu], 0, THREAD_SIZE); + irq_stacks[cpu]->thread_info.cpu = cpu; + irq_stacks[cpu]->thread_info.preempt_count = 1; + /* interrupts are not preemptable */ + p->thread_info->irq_stack = irq_stacks[cpu]; + + /* If we want to make the irq stack more than one unit + * deep, we can chain then off of the irq_stack pointer + * here. + */ +} + + +/* Routine to kick start the given CPU and wait for it to report ready + * (or timeout in startup). When this routine returns, the requested + * CPU is either fully running and configured or known to be dead. + * + * We call this routine sequentially 1 CPU at a time, so no need for + * locking */ + +static void __init +do_boot_cpu(__u8 cpu) +{ + struct task_struct *idle; + int timeout; + unsigned long flags; + int quad_boot = (1<<cpu) & voyager_quad_processors + & ~( voyager_extended_vic_processors + & voyager_allowed_boot_processors); + + /* For the 486, we can't use the 4Mb page table trick, so + * must map a region of memory */ +#ifdef CONFIG_M486 + int i; + unsigned long *page_table_copies = (unsigned long *) + __get_free_page(GFP_KERNEL); +#endif + pgd_t orig_swapper_pg_dir0; + + /* This is an area in head.S which was used to set up the + * initial kernel stack. We need to alter this to give the + * booting CPU a new stack (taken from its idle process) */ + extern struct { + __u8 *esp; + unsigned short ss; + } stack_start; + /* This is the format of the CPI IDT gate (in real mode) which + * we're hijacking to boot the CPU */ + union IDTFormat { + struct seg { + __u16 Offset; + __u16 Segment; + } idt; + __u32 val; + } hijack_source; + + __u32 *hijack_vector; + __u32 start_phys_address = setup_trampoline(); + + /* There's a clever trick to this: The linux trampoline is + * compiled to begin at absolute location zero, so make the + * address zero but have the data segment selector compensate + * for the actual address */ + hijack_source.idt.Offset = start_phys_address & 0x000F; + hijack_source.idt.Segment = (start_phys_address >> 4) & 0xFFFF; + + cpucount++; + idle = fork_by_hand(); + if(IS_ERR(idle)) + panic("failed fork for CPU%d", cpu); + + setup_irq_stack(idle, cpu); + + init_idle(idle, cpu); + + idle->thread.eip = (unsigned long) start_secondary; + unhash_process(idle); + + /* The -4 is to correct for the fact that the stack pointer + * is used to find the location of the thread_info structure + * by masking off several of the LSBs. Without the -4, esp + * is pointing to the page after the one the stack is on. + */ + stack_start.esp = (void *)(THREAD_SIZE - 4 + (char *)idle->thread_info); + + /* Note: Don't modify initial ss override */ + VDEBUG(("VOYAGER SMP: Booting CPU%d at 0x%lx[%x:%x], stack %p\n", cpu, + (unsigned long)hijack_source.val, hijack_source.idt.Segment, + hijack_source.idt.Offset, stack_start.esp)); + /* set the original swapper_pg_dir[0] to map 0 to 4Mb transparently + * (so that the booting CPU can find start_32 */ + orig_swapper_pg_dir0 = swapper_pg_dir[0]; +#ifdef CONFIG_M486 + if(page_table_copies == NULL) + panic("No free memory for 486 page tables\n"); + for(i = 0; i < PAGE_SIZE/sizeof(unsigned long); i++) + page_table_copies[i] = (i * PAGE_SIZE) + | _PAGE_RW | _PAGE_USER | _PAGE_PRESENT; + + ((unsigned long *)swapper_pg_dir)[0] = + ((virt_to_phys(page_table_copies)) & PAGE_MASK) + | _PAGE_RW | _PAGE_USER | _PAGE_PRESENT; +#else + ((unsigned long *)swapper_pg_dir)[0] = 0x102007; +#endif + + if(quad_boot) { + printk("CPU %d: non extended Quad boot\n", cpu); + hijack_vector = (__u32 *)phys_to_virt((VIC_CPU_BOOT_CPI + QIC_DEFAULT_CPI_BASE)*4); + *hijack_vector = hijack_source.val; + } else { + printk("CPU%d: extended VIC boot\n", cpu); + hijack_vector = (__u32 *)phys_to_virt((VIC_CPU_BOOT_CPI + VIC_DEFAULT_CPI_BASE)*4); + *hijack_vector = hijack_source.val; + /* VIC errata, may also receive interrupt at this address */ + hijack_vector = (__u32 *)phys_to_virt((VIC_CPU_BOOT_ERRATA_CPI + VIC_DEFAULT_CPI_BASE)*4); + *hijack_vector = hijack_source.val; + } + /* All non-boot CPUs start with interrupts fully masked. Need + * to lower the mask of the CPI we're about to send. We do + * this in the VIC by masquerading as the processor we're + * about to boot and lowering its interrupt mask */ + local_irq_save(flags); + if(quad_boot) { + send_one_QIC_CPI(cpu, VIC_CPU_BOOT_CPI); + } else { + outb(VIC_CPU_MASQUERADE_ENABLE | cpu, VIC_PROCESSOR_ID); + /* here we're altering registers belonging to `cpu' */ + + outb(VIC_BOOT_INTERRUPT_MASK, 0x21); + /* now go back to our original identity */ + outb(boot_cpu_id, VIC_PROCESSOR_ID); + + /* and boot the CPU */ + + send_CPI((1<<cpu), VIC_CPU_BOOT_CPI); + } + cpu_booted_map = 0; + local_irq_restore(flags); + + /* now wait for it to become ready (or timeout) */ + for(timeout = 0; timeout < 50000; timeout++) { + if(cpu_booted_map) + break; + udelay(100); + } + /* reset the page table */ + swapper_pg_dir[0] = orig_swapper_pg_dir0; + local_flush_tlb(); +#ifdef CONFIG_M486 + free_page((unsigned long)page_table_copies); +#endif + + if(cpu_booted_map) { + VDEBUG(("CPU%d: Booted successfully, back in CPU %d\n", + cpu, smp_processor_id())); + + printk("CPU%d: ", cpu); + print_cpu_info(&cpu_data[cpu]); + wmb(); + set_bit(cpu, &cpu_callout_map); + } + else { + printk("CPU%d FAILED TO BOOT: ", cpu); + if (*((volatile unsigned char *)phys_to_virt(start_phys_address))==0xA5) + printk("Stuck.\n"); + else + printk("Not responding.\n"); + + cpucount--; + } +} + +void __init +smp_boot_cpus(void) +{ + int i; + + /* CAT BUS initialisation must be done after the memory */ + /* FIXME: The L4 has a catbus too, it just needs to be + * accessed in a totally different way */ + if(voyager_level == 5) { + voyager_cat_init(); + + /* now that the cat has probed the Voyager System Bus, sanity + * check the cpu map */ + if( ((voyager_quad_processors | voyager_extended_vic_processors) + & phys_cpu_present_map) != phys_cpu_present_map) { + /* should panic */ + printk("\n\n***WARNING*** Sanity check of CPU present map FAILED\n"); + } + } else if(voyager_level == 4) { + voyager_extended_vic_processors = phys_cpu_present_map; + } + + /* this sets up the idle task to run on the current cpu */ + voyager_extended_cpus = 1; + /* Remove the global_irq_holder setting, it triggers a BUG() on + * schedule at the moment */ + //global_irq_holder = boot_cpu_id; + + /* FIXME: Need to do something about this but currently only works + * on CPUs with a tsc which none of mine have. + smp_tune_scheduling(); + */ + smp_store_cpu_info(boot_cpu_id); + printk("CPU%d: ", boot_cpu_id); + print_cpu_info(&cpu_data[boot_cpu_id]); + + if(is_cpu_quad()) { + /* booting on a Quad CPU */ + printk("VOYAGER SMP: Boot CPU is Quad\n"); + qic_setup(); + do_quad_bootstrap(); + } + + /* enable our own CPIs */ + vic_enable_cpi(); + + /* loop over all the extended VIC CPUs and boot them. The + * Quad CPUs must be bootstrapped by their extended VIC cpu */ + for(i = 0; i < NR_CPUS; i++) { + if( i == boot_cpu_id || ((1<<i) & (phys_cpu_present_map) ) == 0) + continue; + do_boot_cpu(i); + /* This udelay seems to be needed for the Quad boots + * don't remove unless you know what you're doing */ + udelay(1000); + } + /* we could compute the total bogomips here, but why bother?, + * Code added from smpboot.c */ + { + unsigned long bogosum = 0; + for (i = 0; i < NR_CPUS; i++) + if (cpu_online_map & (1<<i)) + bogosum += cpu_data[i].loops_per_jiffy; + printk(KERN_INFO "Total of %d processors activated (%lu.%02lu BogoMIPS).\n", + cpucount+1, + bogosum/(500000/HZ), + (bogosum/(5000/HZ))%100); + } + voyager_extended_cpus = hweight32(voyager_extended_vic_processors); + printk("VOYAGER: Extended (interrupt handling CPUs): %d, non-extended: %d\n", voyager_extended_cpus, num_booting_cpus() - voyager_extended_cpus); + /* that's it, switch to symmetric mode */ + outb(0, VIC_PRIORITY_REGISTER); + outb(0, VIC_CLAIM_REGISTER_0); + outb(0, VIC_CLAIM_REGISTER_1); + + VDEBUG(("VOYAGER SMP: Booted with %d CPUs\n", num_booting_cpus())); +} + +/* Reload the secondary CPUs task structure (this function does not + * return ) */ +void __init +initialize_secondary(void) +{ +#if 0 + // AC kernels only + set_current(hard_get_current()); +#endif + + /* + * We don't actually need to load the full TSS, + * basically just the stack pointer and the eip. + */ + + asm volatile( + "movl %0,%%esp\n\t" + "jmp *%1" + : + :"r" (current->thread.esp),"r" (current->thread.eip)); +} + +/* handle a Voyager SYS_INT -- If we don't, the base board will + * panic the system. + * + * System interrupts occur because some problem was detected on the + * various busses. To find out what you have to probe all the + * hardware via the CAT bus. FIXME: At the moment we do nothing. */ +asmlinkage void +smp_vic_sys_interrupt(void) +{ + ack_CPI(VIC_SYS_INT); + printk("Voyager SYSTEM INTERRUPT\n"); +} + +/* Handle a voyager CMN_INT; These interrupts occur either because of + * a system status change or because a single bit memory error + * occurred. FIXME: At the moment, ignore all this. */ +asmlinkage void +smp_vic_cmn_interrupt(void) +{ + static __u8 in_cmn_int = 0; + static spinlock_t cmn_int_lock = SPIN_LOCK_UNLOCKED; + + /* common ints are broadcast, so make sure we only do this once */ + _raw_spin_lock(&cmn_int_lock); + if(in_cmn_int) + goto unlock_end; + + in_cmn_int++; + _raw_spin_unlock(&cmn_int_lock); + + VDEBUG(("Voyager COMMON INTERRUPT\n")); + + if(voyager_level == 5) + voyager_cat_do_common_interrupt(); + + _raw_spin_lock(&cmn_int_lock); + in_cmn_int = 0; + unlock_end: + _raw_spin_unlock(&cmn_int_lock); + ack_CPI(VIC_CMN_INT); +} + +/* + * Reschedule call back. Nothing to do, all the work is done + * automatically when we return from the interrupt. */ +asmlinkage void +smp_reschedule_interrupt(void) +{ + /* do nothing */ +} + +static struct mm_struct * flush_mm; +static unsigned long flush_va; +static spinlock_t tlbstate_lock = SPIN_LOCK_UNLOCKED; +#define FLUSH_ALL 0xffffffff + +/* + * We cannot call mmdrop() because we are in interrupt context, + * instead update mm->cpu_vm_mask. + * + * We need to reload %cr3 since the page tables may be going + * away from under us.. + */ +static void inline +leave_mm (unsigned long cpu) +{ + if (cpu_tlbstate[cpu].state == TLBSTATE_OK) + BUG(); + clear_bit(cpu, &cpu_tlbstate[cpu].active_mm->cpu_vm_mask); + load_cr3(swapper_pg_dir); +} + + +/* + * Invalidate call-back + */ +asmlinkage void +smp_invalidate_interrupt(void) +{ + __u8 cpu = get_cpu(); + + if(!test_bit(cpu, &smp_invalidate_needed)) + goto out; + /* This will flood messages. Don't uncomment unless you see + * Problems with cross cpu invalidation + VDEBUG(("VOYAGER SMP: CPU%d received INVALIDATE_CPI\n", + smp_processor_id())); + */ + + if (flush_mm == cpu_tlbstate[cpu].active_mm) { + if (cpu_tlbstate[cpu].state == TLBSTATE_OK) { + if (flush_va == FLUSH_ALL) + local_flush_tlb(); + else + __flush_tlb_one(flush_va); + } else + leave_mm(cpu); + } + clear_bit(cpu, &smp_invalidate_needed); + out: + put_cpu_no_resched(); +} + +/* All the new flush operations for 2.4 */ + + +/* This routine is called with a physical cpu mask */ +static void +flush_tlb_others (unsigned long cpumask, struct mm_struct *mm, + unsigned long va) +{ + int stuck = 50000; + + if (!cpumask) + BUG(); + if ((cpumask & cpu_online_map) != cpumask) + BUG(); + if (cpumask & (1 << smp_processor_id())) + BUG(); + if (!mm) + BUG(); + + spin_lock(&tlbstate_lock); + + flush_mm = mm; + flush_va = va; + atomic_set_mask(cpumask, &smp_invalidate_needed); + /* + * We have to send the CPI only to + * CPUs affected. + */ + send_CPI(cpumask, VIC_INVALIDATE_CPI); + + while (smp_invalidate_needed) { + if(--stuck == 0) { + printk("***WARNING*** Stuck doing invalidate CPI (CPU%d)\n", smp_processor_id()); + break; + } + } + + /* Uncomment only to debug invalidation problems + VDEBUG(("VOYAGER SMP: Completed invalidate CPI (CPU%d)\n", cpu)); + */ + + flush_mm = NULL; + flush_va = 0; + spin_unlock(&tlbstate_lock); +} + +void +flush_tlb_current_task(void) +{ + struct mm_struct *mm = current->mm; + unsigned long cpu_mask; + + preempt_disable(); + + cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id()); + local_flush_tlb(); + if (cpu_mask) + flush_tlb_others(cpu_mask, mm, FLUSH_ALL); + + preempt_enable(); +} + + +void +flush_tlb_mm (struct mm_struct * mm) +{ + unsigned long cpu_mask; + + preempt_disable(); + + cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id()); + + if (current->active_mm == mm) { + if (current->mm) + local_flush_tlb(); + else + leave_mm(smp_processor_id()); + } + if (cpu_mask) + flush_tlb_others(cpu_mask, mm, FLUSH_ALL); + + preempt_enable(); +} + +void flush_tlb_page(struct vm_area_struct * vma, unsigned long va) +{ + struct mm_struct *mm = vma->vm_mm; + unsigned long cpu_mask; + + preempt_disable(); + + cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id()); + if (current->active_mm == mm) { + if(current->mm) + __flush_tlb_one(va); + else + leave_mm(smp_processor_id()); + } + + if (cpu_mask) + flush_tlb_others(cpu_mask, mm, va); + + preempt_enable(); +} + +/* enable the requested IRQs */ +asmlinkage void +smp_enable_irq_interrupt(void) +{ + __u8 irq; + __u8 cpu = get_cpu(); + + VDEBUG(("VOYAGER SMP: CPU%d enabling irq mask 0x%x\n", cpu, + vic_irq_enable_mask[cpu])); + + spin_lock(&vic_irq_lock); + for(irq = 0; irq < 16; irq++) { + if(vic_irq_enable_mask[cpu] & (1<<irq)) + enable_local_vic_irq(irq); + } + vic_irq_enable_mask[cpu] = 0; + spin_unlock(&vic_irq_lock); + + put_cpu_no_resched(); +} + +/* + * CPU halt call-back + */ +static void +smp_stop_cpu_function(void *dummy) +{ + VDEBUG(("VOYAGER SMP: CPU%d is STOPPING\n", smp_processor_id())); + clear_bit(smp_processor_id(), &cpu_online_map); + local_irq_disable(); + for(;;) + __asm__("hlt"); +} + +static spinlock_t call_lock = SPIN_LOCK_UNLOCKED; + +struct call_data_struct { + void (*func) (void *info); + void *info; + volatile unsigned long started; + volatile unsigned long finished; + int wait; +}; + +static struct call_data_struct * call_data; + +/* execute a thread on a new CPU. The function to be called must be + * previously set up. This is used to schedule a function for + * execution on all CPU's - set up the function then broadcast a + * function_interrupt CPI to come here on each CPU */ +asmlinkage void +smp_call_function_interrupt(void) +{ + void (*func) (void *info) = call_data->func; + void *info = call_data->info; + /* must take copy of wait because call_data may be replaced + * unless the function is waiting for us to finish */ + int wait = call_data->wait; + __u8 cpu = smp_processor_id(); + + /* + * Notify initiating CPU that I've grabbed the data and am + * about to execute the function + */ + mb(); + if(!test_and_clear_bit(cpu, &call_data->started)) { + /* If the bit wasn't set, this could be a replay */ + printk(KERN_WARNING "VOYAGER SMP: CPU %d received call funtion with no call pending\n", cpu); + return; + } + /* + * At this point the info structure may be out of scope unless wait==1 + */ + irq_enter(); + (*func)(info); + irq_exit(); + if (wait) { + mb(); + clear_bit(cpu, &call_data->finished); + } +} + +/* Call this function on all CPUs using the function_interrupt above + <func> The function to run. This must be fast and non-blocking. + <info> An arbitrary pointer to pass to the function. + <retry> If true, keep retrying until ready. + <wait> If true, wait until function has completed on other CPUs. + [RETURNS] 0 on success, else a negative status code. Does not return until + remote CPUs are nearly ready to execute <<func>> or are or have executed. +*/ +int +smp_call_function (void (*func) (void *info), void *info, int retry, + int wait) +{ + struct call_data_struct data; + __u32 mask = cpu_online_map; + + mask &= ~(1<<smp_processor_id()); + + if (!mask) + return 0; + + data.func = func; + data.info = info; + data.started = mask; + data.wait = wait; + if (wait) + data.finished = mask; + + spin_lock(&call_lock); + call_data = &data; + wmb(); + /* Send a message to all other CPUs and wait for them to respond */ + send_CPI_allbutself(VIC_CALL_FUNCTION_CPI); + + /* Wait for response */ + while (data.started) + barrier(); + + if (wait) + while (data.finished) + barrier(); + + spin_unlock(&call_lock); + + return 0; +} + +/* Sorry about the name. In an APIC based system, the APICs + * themselves are programmed to send a timer interrupt. This is used + * by linux to reschedule the processor. Voyager doesn't have this, + * so we use the system clock to interrupt one processor, which in + * turn, broadcasts a timer CPI to all the others --- we receive that + * CPI here. We don't use this actually for counting so losing + * ticks doesn't matter + * + * FIXME: For those CPU's which actually have a local APIC, we could + * try to use it to trigger this interrupt instead of having to + * broadcast the timer tick. Unfortunately, all my pentium DYADs have + * no local APIC, so I can't do this + * + * This function is currently a placeholder and is unused in the code */ +asmlinkage void +smp_apic_timer_interrupt(struct pt_regs regs) +{ + wrapper_smp_local_timer_interrupt(®s); +} + +/* All of the QUAD interrupt GATES */ +asmlinkage void +smp_qic_timer_interrupt(struct pt_regs regs) +{ + ack_QIC_CPI(QIC_TIMER_CPI); + wrapper_smp_local_timer_interrupt(®s); +} + +asmlinkage void +smp_qic_invalidate_interrupt(void) +{ + ack_QIC_CPI(QIC_INVALIDATE_CPI); + smp_invalidate_interrupt(); +} + +asmlinkage void +smp_qic_reschedule_interrupt(void) +{ + ack_QIC_CPI(QIC_RESCHEDULE_CPI); + smp_reschedule_interrupt(); +} + +asmlinkage void +smp_qic_enable_irq_interrupt(void) +{ + ack_QIC_CPI(QIC_ENABLE_IRQ_CPI); + smp_enable_irq_interrupt(); +} + +asmlinkage void +smp_qic_call_function_interrupt(void) +{ + ack_QIC_CPI(QIC_CALL_FUNCTION_CPI); + smp_call_function_interrupt(); +} + +asmlinkage void +smp_vic_cpi_interrupt(struct pt_regs regs) +{ + __u8 cpu = smp_processor_id(); + + if(is_cpu_quad()) + ack_QIC_CPI(VIC_CPI_LEVEL0); + else + ack_VIC_CPI(VIC_CPI_LEVEL0); + + if(test_and_clear_bit(VIC_TIMER_CPI, &vic_cpi_mailbox[cpu])) + wrapper_smp_local_timer_interrupt(®s); + if(test_and_clear_bit(VIC_INVALIDATE_CPI, &vic_cpi_mailbox[cpu])) + smp_invalidate_interrupt(); + if(test_and_clear_bit(VIC_RESCHEDULE_CPI, &vic_cpi_mailbox[cpu])) + smp_reschedule_interrupt(); + if(test_and_clear_bit(VIC_ENABLE_IRQ_CPI, &vic_cpi_mailbox[cpu])) + smp_enable_irq_interrupt(); + if(test_and_clear_bit(VIC_CALL_FUNCTION_CPI, &vic_cpi_mailbox[cpu])) + smp_call_function_interrupt(); +} + +static inline void +do_flush_tlb_all_local(void) +{ + unsigned long cpu = smp_processor_id(); + + __flush_tlb_all(); + if (cpu_tlbstate[cpu].state == TLBSTATE_LAZY) + leave_mm(cpu); +} + + +static void +flush_tlb_all_function(void* info) +{ + do_flush_tlb_all_local(); +} + +/* flush the TLB of every active CPU in the system */ +void +flush_tlb_all(void) +{ + smp_call_function (flush_tlb_all_function, 0, 1, 1); + + do_flush_tlb_all_local(); +} + +/* used to set up the trampoline for other CPUs when the memory manager + * is sorted out */ +void __init +smp_alloc_memory(void) +{ + trampoline_base = (__u32)alloc_bootmem_low_pages(PAGE_SIZE); + if(__pa(trampoline_base) >= 0x93000) + BUG(); +} + +/* send a reschedule CPI to one CPU by physical CPU number*/ +void +smp_send_reschedule(int cpu) +{ + send_one_CPI(cpu, VIC_RESCHEDULE_CPI); +} + + +int +hard_smp_processor_id(void) +{ + __u8 i; + __u8 cpumask = inb(VIC_PROC_WHO_AM_I); + if((cpumask & QUAD_IDENTIFIER) == QUAD_IDENTIFIER) + return cpumask & 0x1F; + + for(i = 0; i < 8; i++) { + if(cpumask & (1<<i)) + return i; + } + printk("** WARNING ** Illegal cpuid returned by VIC: %d", cpumask); + return 0; +} + +/* broadcast a halt to all other CPUs */ +void +smp_send_stop(void) +{ + smp_call_function(smp_stop_cpu_function, NULL, 1, 1); +} + +/* this function is triggered in time.c when a clock tick fires + * we need to re-broadcast the tick to all CPUs */ +void +smp_vic_timer_interrupt(struct pt_regs *regs) +{ + send_CPI_allbutself(VIC_TIMER_CPI); + smp_local_timer_interrupt(regs); +} + +static inline void +wrapper_smp_local_timer_interrupt(struct pt_regs *regs) +{ + __u8 cpu = smp_processor_id(); + + irq_enter(); + smp_local_timer_interrupt(regs); + irq_exit(); + +} + +/* local (per CPU) timer interrupt. It does both profiling and + * process statistics/rescheduling. + * + * We do profiling in every local tick, statistics/rescheduling + * happen only every 'profiling multiplier' ticks. The default + * multiplier is 1 and it can be changed by writing the new multiplier + * value into /proc/profile. + */ +void +smp_local_timer_interrupt(struct pt_regs * regs) +{ + int cpu = smp_processor_id(); + long weight; + + x86_do_profile(regs); + + if (--prof_counter[cpu] <= 0) { + /* + * The multiplier may have changed since the last time we got + * to this point as a result of the user writing to + * /proc/profile. In this case we need to adjust the APIC + * timer accordingly. + * + * Interrupts are already masked off at this point. + */ + prof_counter[cpu] = prof_multiplier[cpu]; + if (prof_counter[cpu] != prof_old_multiplier[cpu]) { + /* FIXME: need to update the vic timer tick here */ + prof_old_multiplier[cpu] = prof_counter[cpu]; + } + + update_process_times(user_mode(regs)); + } + + if( ((1<<cpu) & voyager_extended_vic_processors) == 0) + /* only extended VIC processors participate in + * interrupt distribution */ + return; + + /* + * We take the 'long' return path, and there every subsystem + * grabs the apropriate locks (kernel lock/ irq lock). + * + * we might want to decouple profiling from the 'long path', + * and do the profiling totally in assembly. + * + * Currently this isn't too much of an issue (performance wise), + * we can take more than 100K local irqs per second on a 100 MHz P5. + */ + + if((++vic_tick[cpu] & 0x7) != 0) + return; + /* get here every 16 ticks (about every 1/6 of a second) */ + + /* Change our priority to give someone else a chance at getting + * the IRQ. The algorithm goes like this: + * + * In the VIC, the dynamically routed interrupt is always + * handled by the lowest priority eligible (i.e. receiving + * interrupts) CPU. If >1 eligible CPUs are equal lowest, the + * lowest processor number gets it. + * + * The priority of a CPU is controlled by a special per-CPU + * VIC priority register which is 3 bits wide 0 being lowest + * and 7 highest priority.. + * + * Therefore we subtract the average number of interrupts from + * the number we've fielded. If this number is negative, we + * lower the activity count and if it is positive, we raise + * it. + * + * I'm afraid this still leads to odd looking interrupt counts: + * the totals are all roughly equal, but the individual ones + * look rather skewed. + * + * FIXME: This algorithm is total crap when mixed with SMP + * affinity code since we now try to even up the interrupt + * counts when an affinity binding is keeping them on a + * particular CPU*/ + weight = (vic_intr_count[cpu]*voyager_extended_cpus + - vic_intr_total) >> 4; + weight += 4; + if(weight > 7) + weight = 7; + if(weight < 0) + weight = 0; + + outb((__u8)weight, VIC_PRIORITY_REGISTER); + +#ifdef VOYAGER_DEBUG + if((vic_tick[cpu] & 0xFFF) == 0) { + /* print this message roughly every 25 secs */ + printk("VOYAGER SMP: vic_tick[%d] = %lu, weight = %ld\n", + cpu, vic_tick[cpu], weight); + } +#endif +} + +/* setup the profiling timer */ +int +setup_profiling_timer(unsigned int multiplier) +{ + int i; + + if ( (!multiplier)) + return -EINVAL; + + /* + * Set the new multiplier for each CPU. CPUs don't start using the + * new values until the next timer interrupt in which they do process + * accounting. + */ + for (i = 0; i < NR_CPUS; ++i) + prof_multiplier[i] = multiplier; + + return 0; +} + + +/* The CPIs are handled in the per cpu 8259s, so they must be + * enabled to be received: FIX: enabling the CPIs in the early + * boot sequence interferes with bug checking; enable them later + * on in smp_init */ +#define VIC_SET_GATE(cpi, vector) \ + set_intr_gate((cpi) + VIC_DEFAULT_CPI_BASE, (vector)) +#define QIC_SET_GATE(cpi, vector) \ + set_intr_gate((cpi) + QIC_DEFAULT_CPI_BASE, (vector)) + +void __init +smp_intr_init(void) +{ + int i; + + /* initialize the per cpu irq mask to all disabled */ + for(i = 0; i < NR_CPUS; i++) + vic_irq_mask[i] = 0xFFFF; + + VIC_SET_GATE(VIC_CPI_LEVEL0, vic_cpi_interrupt); + + VIC_SET_GATE(VIC_SYS_INT, vic_sys_interrupt); + VIC_SET_GATE(VIC_CMN_INT, vic_cmn_interrupt); + + QIC_SET_GATE(QIC_TIMER_CPI, qic_timer_interrupt); + QIC_SET_GATE(QIC_INVALIDATE_CPI, qic_invalidate_interrupt); + QIC_SET_GATE(QIC_RESCHEDULE_CPI, qic_reschedule_interrupt); + QIC_SET_GATE(QIC_ENABLE_IRQ_CPI, qic_enable_irq_interrupt); + QIC_SET_GATE(QIC_CALL_FUNCTION_CPI, qic_call_function_interrupt); + + + /* now put the VIC descriptor into the first 48 IRQs + * + * This is for later: first 16 correspond to PC IRQs; next 16 + * are Primary MC IRQs and final 16 are Secondary MC IRQs */ + for(i = 0; i < 48; i++) + irq_desc[i].handler = &vic_irq_type; +} + +/* send a CPI at level cpi to a set of cpus in cpuset (set 1 bit per + * processor to recieve CPI */ +static void +send_CPI(__u32 cpuset, __u8 cpi) +{ + int mask; + __u8 cpu; + __u32 quad_cpuset = (cpuset & voyager_quad_processors); + + if(cpi < VIC_START_FAKE_CPI) { + /* fake CPI are only used for booting, so send to the + * extended quads as well---Quads must be VIC booted */ + outb((__u8)(cpuset), VIC_CPI_Registers[cpi]); + return; + } + if(quad_cpuset) + send_QIC_CPI(quad_cpuset, cpi); + cpuset &= ~quad_cpuset; + cpuset &= 0xff; /* only first 8 CPUs vaild for VIC CPI */ + if(cpuset == 0) + return; + for_each_cpu(cpu, mask) { + if(cpuset & (1<<cpu)) + set_bit(cpi, &vic_cpi_mailbox[cpu]); + } + if(cpuset) + outb((__u8)cpuset, VIC_CPI_Registers[VIC_CPI_LEVEL0]); +} + +/* Acknowlege receipt of CPI in the QIC, clear in QIC hardware and + * set the cache line to shared by reading it. + * + * DON'T make this inline otherwise the cache line read will be + * optimised away + * */ +static int +ack_QIC_CPI(__u8 cpi) { + __u8 cpu = hard_smp_processor_id(); + + cpi &= 7; + + outb(1<<cpi, QIC_INTERRUPT_CLEAR1); + return voyager_quad_cpi_addr[cpu]->qic_cpi[cpi].cpi; +} + +static void +ack_special_QIC_CPI(__u8 cpi) +{ + switch(cpi) { + case VIC_CMN_INT: + outb(QIC_CMN_INT, QIC_INTERRUPT_CLEAR0); + break; + case VIC_SYS_INT: + outb(QIC_SYS_INT, QIC_INTERRUPT_CLEAR0); + break; + } + /* also clear at the VIC, just in case (nop for non-extended proc) */ + ack_VIC_CPI(cpi); +} + +/* Acknowledge receipt of CPI in the VIC (essentially an EOI) */ +static void +ack_VIC_CPI(__u8 cpi) +{ +#ifdef VOYAGER_DEBUG + unsigned long flags; + __u16 isr; + __u8 cpu = smp_processor_id(); + + local_irq_save(flags); + isr = vic_read_isr(); + if((isr & (1<<(cpi &7))) == 0) { + printk("VOYAGER SMP: CPU%d lost CPI%d\n", cpu, cpi); + } +#endif + /* send specific EOI; the two system interrupts have + * bit 4 set for a separate vector but behave as the + * corresponding 3 bit intr */ + outb_p(0x60|(cpi & 7),0x20); + +#ifdef VOYAGER_DEBUG + if((vic_read_isr() & (1<<(cpi &7))) != 0) { + printk("VOYAGER SMP: CPU%d still asserting CPI%d\n", cpu, cpi); + } + local_irq_restore(flags); +#endif +} + +/* cribbed with thanks from irq.c */ +#define __byte(x,y) (((unsigned char *)&(y))[x]) +#define cached_21(cpu) (__byte(0,vic_irq_mask[cpu])) +#define cached_A1(cpu) (__byte(1,vic_irq_mask[cpu])) + +static unsigned int +startup_vic_irq(unsigned int irq) +{ + enable_vic_irq(irq); + + return 0; +} + +/* The enable and disable routines. This is where we run into + * conflicting architectural philosophy. Fundamentally, the voyager + * architecture does not expect to have to disable interrupts globally + * (the IRQ controllers belong to each CPU). The processor masquerade + * which is used to start the system shouldn't be used in a running OS + * since it will cause great confusion if two separate CPUs drive to + * the same IRQ controller (I know, I've tried it). + * + * The solution is a variant on the NCR lazy SPL design: + * + * 1) To disable an interrupt, do nothing (other than set the + * IRQ_DISABLED flag). This dares the interrupt actually to arrive. + * + * 2) If the interrupt dares to come in, raise the local mask against + * it (this will result in all the CPU masks being raised + * eventually). + * + * 3) To enable the interrupt, lower the mask on the local CPU and + * broadcast an Interrupt enable CPI which causes all other CPUs to + * adjust their masks accordingly. */ + +static void +enable_vic_irq(unsigned int irq) +{ + int tmpmask; + /* linux doesn't to processor-irq affinity, so enable on + * all CPUs we know about */ + __u8 cpu = smp_processor_id(), real_cpu; + __u16 mask = (1<<irq); + __u32 processorList = 0; + unsigned long flags; + + VDEBUG(("VOYAGER: enable_vic_irq(%d) CPU%d affinity 0x%lx\n", + irq, cpu, cpu_irq_affinity[cpu])); + spin_lock_irqsave(&vic_irq_lock, flags); + for_each_cpu(real_cpu, tmpmask) { + if(!(voyager_extended_vic_processors & (1<<real_cpu))) + continue; + if(!(cpu_irq_affinity[real_cpu] & mask)) { + /* irq has no affinity for this CPU, ignore */ + continue; + } + if(real_cpu == cpu) { + enable_local_vic_irq(irq); + } + else if(vic_irq_mask[real_cpu] & mask) { + vic_irq_enable_mask[real_cpu] |= mask; + processorList |= (1<<real_cpu); + } + } + spin_unlock_irqrestore(&vic_irq_lock, flags); + if(processorList) + send_CPI(processorList, VIC_ENABLE_IRQ_CPI); +} + +static void +disable_vic_irq(unsigned int irq) +{ + /* lazy disable, do nothing */ +} + +static void +enable_local_vic_irq(unsigned int irq) +{ + __u8 cpu = smp_processor_id(); + __u16 mask = ~(1 << irq); + __u16 old_mask = vic_irq_mask[cpu]; + + vic_irq_mask[cpu] &= mask; + if(vic_irq_mask[cpu] == old_mask) + return; + + VDEBUG(("VOYAGER DEBUG: Enabling irq %d in hardware on CPU %d\n", + irq, cpu)); + + if (irq & 8) { + outb_p(cached_A1(cpu),0xA1); + (void)inb_p(0xA1); + } + else { + outb_p(cached_21(cpu),0x21); + (void)inb_p(0x21); + } +} + +static void +disable_local_vic_irq(unsigned int irq) +{ + __u8 cpu = smp_processor_id(); + __u16 mask = (1 << irq); + __u16 old_mask = vic_irq_mask[cpu]; + + if(irq == 7) + return; + + vic_irq_mask[cpu] |= mask; + if(old_mask == vic_irq_mask[cpu]) + return; + + VDEBUG(("VOYAGER DEBUG: Disabling irq %d in hardware on CPU %d\n", + irq, cpu)); + + if (irq & 8) { + outb_p(cached_A1(cpu),0xA1); + (void)inb_p(0xA1); + } + else { + outb_p(cached_21(cpu),0x21); + (void)inb_p(0x21); + } +} + +/* The VIC is level triggered, so the ack can only be issued after the + * interrupt completes. However, we do Voyager lazy interrupt + * handling here: It is an extremely expensive operation to mask an + * interrupt in the vic, so we merely set a flag (IRQ_DISABLED). If + * this interrupt actually comes in, then we mask and ack here to push + * the interrupt off to another CPU */ +static void +before_handle_vic_irq(unsigned int irq) +{ + irq_desc_t *desc = irq_desc + irq; + __u8 cpu = smp_processor_id(); + + _raw_spin_lock(&vic_irq_lock); + vic_intr_total++; + vic_intr_count[cpu]++; + + if(!(cpu_irq_affinity[cpu] & (1<<irq))) { + /* The irq is not in our affinity mask, push it off + * onto another CPU */ + VDEBUG(("VOYAGER DEBUG: affinity triggered disable of irq %d on cpu %d\n", + irq, cpu)); + disable_local_vic_irq(irq); + /* set IRQ_INPROGRESS to prevent the handler in irq.c from + * actually calling the interrupt routine */ + desc->status |= IRQ_REPLAY | IRQ_INPROGRESS; + } else if(desc->status & IRQ_DISABLED) { + /* Damn, the interrupt actually arrived, do the lazy + * disable thing. The interrupt routine in irq.c will + * not handle a IRQ_DISABLED interrupt, so nothing more + * need be done here */ + VDEBUG(("VOYAGER DEBUG: lazy disable of irq %d on CPU %d\n", + irq, cpu)); + disable_local_vic_irq(irq); + desc->status |= IRQ_REPLAY; + } else { + desc->status &= ~IRQ_REPLAY; + } + + _raw_spin_unlock(&vic_irq_lock); +} + +/* Finish the VIC interrupt: basically mask */ +static void +after_handle_vic_irq(unsigned int irq) +{ + irq_desc_t *desc = irq_desc + irq; + + _raw_spin_lock(&vic_irq_lock); + { + unsigned int status = desc->status & ~IRQ_INPROGRESS; +#ifdef VOYAGER_DEBUG + __u16 isr; +#endif + + desc->status = status; + if ((status & IRQ_DISABLED)) + disable_local_vic_irq(irq); +#ifdef VOYAGER_DEBUG + /* DEBUG: before we ack, check what's in progress */ + isr = vic_read_isr(); + if((isr & (1<<irq) && !(status & IRQ_REPLAY)) == 0) { + int i; + __u8 cpu = smp_processor_id(); + __u8 real_cpu; + int mask; + + printk("VOYAGER SMP: CPU%d lost interrupt %d\n", + cpu, irq); + for_each_cpu(real_cpu, mask) { + + outb(VIC_CPU_MASQUERADE_ENABLE | real_cpu, + VIC_PROCESSOR_ID); + isr = vic_read_isr(); + if(isr & (1<<irq)) { + printk("VOYAGER SMP: CPU%d ack irq %d\n", + real_cpu, irq); + ack_vic_irq(irq); + } + outb(cpu, VIC_PROCESSOR_ID); + } + } +#endif /* VOYAGER_DEBUG */ + /* as soon as we ack, the interrupt is eligible for + * receipt by another CPU so everything must be in + * order here */ + ack_vic_irq(irq); + if(status & IRQ_REPLAY) { + /* replay is set if we disable the interrupt + * in the before_handle_vic_irq() routine, so + * clear the in progress bit here to allow the + * next CPU to handle this correctly */ + desc->status &= ~(IRQ_REPLAY | IRQ_INPROGRESS); + } +#ifdef VOYAGER_DEBUG + isr = vic_read_isr(); + if((isr & (1<<irq)) != 0) + printk("VOYAGER SMP: after_handle_vic_irq() after ack irq=%d, isr=0x%x\n", + irq, isr); +#endif /* VOYAGER_DEBUG */ + } + _raw_spin_unlock(&vic_irq_lock); + + /* All code after this point is out of the main path - the IRQ + * may be intercepted by another CPU if reasserted */ +} + + +/* Linux processor - interrupt affinity manipulations. + * + * For each processor, we maintain a 32 bit irq affinity mask. + * Initially it is set to all 1's so every processor accepts every + * interrupt. In this call, we change the processor's affinity mask: + * + * Change from enable to disable: + * + * If the interrupt ever comes in to the processor, we will disable it + * and ack it to push it off to another CPU, so just accept the mask here. + * + * Change from disable to enable: + * + * change the mask and then do an interrupt enable CPI to re-enable on + * the selected processors */ + +void +set_vic_irq_affinity(unsigned int irq, unsigned long mask) +{ + /* Only extended processors handle interrupts */ + unsigned long real_mask = mask & voyager_extended_vic_processors; + unsigned long irq_mask = (1<<irq); + int tmpmask; + __u8 cpu; + + if(mask == 0) + /* can't have no cpu's to accept the interrupt -- extremely + * bad things will happen */ + return; + + if(irq == 0) + /* can't change the affinity of the timer IRQ. This + * is due to the constraint in the voyager + * architecture that the CPI also comes in on and IRQ + * line and we have chosen IRQ0 for this. If you + * raise the mask on this interrupt, the processor + * will no-longer be able to accept VIC CPIs */ + return; + + if(irq >= 32) + /* You can only have 32 interrupts in a voyager system + * (and 32 only if you have a secondary microchannel + * bus) */ + return; + + for_each_cpu(cpu, tmpmask) { + unsigned long cpu_mask = (1<<cpu); + + if(cpu_mask & real_mask) { + /* enable the interrupt for this cpu */ + cpu_irq_affinity[cpu] |= irq_mask; + } else { + /* disable the interrupt for this cpu */ + cpu_irq_affinity[cpu] &= ~irq_mask; + } + } + /* this is magic, we now have the correct affinity maps, so + * enable the interrupt. This will send an enable CPI to + * those cpu's who need to enable it in their local masks, + * causing them to correct for the new affinity . If the + * interrupt is currently globally disabled, it will simply be + * disabled again as it comes in (voyager lazy disable). If + * the affinity map is tightened to disable the interrupt on a + * cpu, it will be pushed off when it comes in */ + enable_vic_irq(irq); +} + +static void +ack_vic_irq(unsigned int irq) +{ + if (irq & 8) { + outb(0x62,0x20); /* Specific EOI to cascade */ + outb(0x60|(irq & 7),0xA0); + } else { + outb(0x60 | (irq & 7),0x20); + } +} + +/* enable the CPIs. In the VIC, the CPIs are delivered by the 8259 + * but are not vectored by it. This means that the 8259 mask must be + * lowered to receive them */ +static __init void +vic_enable_cpi(void) +{ + __u8 cpu = smp_processor_id(); + + /* just take a copy of the current mask (nop for boot cpu) */ + vic_irq_mask[cpu] = vic_irq_mask[boot_cpu_id]; + + enable_local_vic_irq(VIC_CPI_LEVEL0); + enable_local_vic_irq(VIC_CPI_LEVEL1); + /* for sys int and cmn int */ + enable_local_vic_irq(7); + + if(is_cpu_quad()) { + outb(QIC_DEFAULT_MASK0, QIC_MASK_REGISTER0); + outb(QIC_CPI_ENABLE, QIC_MASK_REGISTER1); + VDEBUG(("VOYAGER SMP: QIC ENABLE CPI: CPU%d: MASK 0x%x\n", + cpu, QIC_CPI_ENABLE)); + } + + VDEBUG(("VOYAGER SMP: ENABLE CPI: CPU%d: MASK 0x%x\n", + cpu, vic_irq_mask[cpu])); +} + +void +voyager_smp_dump() +{ + int mask; + __u8 old_cpu = smp_processor_id(), cpu; + + /* dump the interrupt masks of each processor */ + for_each_cpu(cpu, mask) { + __u16 imr, isr, irr; + unsigned long flags; + + local_irq_save(flags); + outb(VIC_CPU_MASQUERADE_ENABLE | cpu, VIC_PROCESSOR_ID); + imr = (inb(0xa1) << 8) | inb(0x21); + outb(0x0a, 0xa0); + irr = inb(0xa0) << 8; + outb(0x0a, 0x20); + irr |= inb(0x20); + outb(0x0b, 0xa0); + isr = inb(0xa0) << 8; + outb(0x0b, 0x20); + isr |= inb(0x20); + outb(old_cpu, VIC_PROCESSOR_ID); + local_irq_restore(flags); + printk("\tCPU%d: mask=0x%x, IMR=0x%x, IRR=0x%x, ISR=0x%x\n", + cpu, vic_irq_mask[cpu], imr, irr, isr); +#if 0 + /* These lines are put in to try to unstick an un ack'd irq */ + if(isr != 0) { + int irq; + for(irq=0; irq<16; irq++) { + if(isr & (1<<irq)) { + printk("\tCPU%d: ack irq %d\n", + cpu, irq); + local_irq_save(flags); + outb(VIC_CPU_MASQUERADE_ENABLE | cpu, + VIC_PROCESSOR_ID); + ack_vic_irq(irq); + outb(old_cpu, VIC_PROCESSOR_ID); + local_irq_restore(flags); + } + } + } +#endif + } +} + +void +smp_voyager_power_off(void *dummy) +{ + if(smp_processor_id() == boot_cpu_id) + voyager_power_off(); + else + smp_stop_cpu_function(NULL); +} + +void __init +smp_prepare_cpus(unsigned int max_cpus) +{ + /* FIXME: ignore max_cpus for now */ + smp_boot_cpus(); +} + +int __devinit +__cpu_up(unsigned int cpu) +{ + /* This only works at boot for x86. See "rewrite" above. */ + if (test_bit(cpu, &smp_commenced_mask)) + return -ENOSYS; + + /* In case one didn't come up */ + if (!test_bit(cpu, &cpu_callin_map)) + return -EIO; + /* Unleash the CPU! */ + set_bit(cpu, &smp_commenced_mask); + while (!test_bit(cpu, &cpu_online_map)) + mb(); + return 0; +} + +void __init +smp_cpus_done(unsigned int max_cpus) +{ + zap_low_mappings(); +} diff --git a/arch/i386/mach-voyager/voyager_thread.c b/arch/i386/mach-voyager/voyager_thread.c new file mode 100644 index 000000000000..70fdedf6cd37 --- /dev/null +++ b/arch/i386/mach-voyager/voyager_thread.c @@ -0,0 +1,178 @@ +/* -*- mode: c; c-basic-offset: 8 -*- */ + +/* Copyright (C) 2001 + * + * Author: J.E.J.Bottomley@HansenPartnership.com + * + * linux/arch/i386/kernel/voyager_thread.c + * + * This module provides the machine status monitor thread for the + * voyager architecture. This allows us to monitor the machine + * environment (temp, voltage, fan function) and the front panel and + * internal UPS. If a fault is detected, this thread takes corrective + * action (usually just informing init) + * */ + +#include <linux/module.h> +#include <linux/config.h> +#include <linux/mm.h> +#include <linux/kernel_stat.h> +#include <linux/delay.h> +#include <linux/mc146818rtc.h> +#include <linux/smp_lock.h> +#include <linux/init.h> +#include <linux/bootmem.h> +#include <linux/kmod.h> +#include <linux/completion.h> +#include <linux/sched.h> +#include <asm/desc.h> +#include <asm/voyager.h> +#include <asm/vic.h> +#include <asm/pgalloc.h> +#include <asm/mtrr.h> +#include <asm/msr.h> + +#include <linux/irq.h> + +#define THREAD_NAME "kvoyagerd" + +/* external variables */ +int kvoyagerd_running = 0; +DECLARE_MUTEX_LOCKED(kvoyagerd_sem); + +static int thread(void *); + +static __u8 set_timeout = 0; + +/* Start the machine monitor thread. Return 1 if OK, 0 if fail */ +static int __init +voyager_thread_start(void) +{ + if(kernel_thread(thread, NULL, CLONE_KERNEL) < 0) { + /* This is serious, but not fatal */ + printk(KERN_ERR "Voyager: Failed to create system monitor thread!!!\n"); + return 1; + } + return 0; +} + +static int +execute_helper(void *string) +{ + int ret; + + char *envp[] = { + "HOME=/", + "TERM=linux", + "PATH=/sbin:/usr/sbin:/bin:/usr/bin", + NULL, + }; + char *argv[] = { + "/bin/bash", + "-c", + (char *)string, + NULL, + }; + + if((ret = exec_usermodehelper(argv[0], argv, envp)) < 0) { + printk(KERN_ERR "Voyager failed to execute \"%s\"\n", + (char *)string); + } + return ret; +} + +static void +execute(char *string) +{ + if(kernel_thread(execute_helper, (void *)string, CLONE_VFORK | SIGCHLD) < 0) { + printk(KERN_ERR "Voyager failed to fork before exec of \"%s\"\n", + string); + } +} + +static void +check_from_kernel(void) +{ + if(voyager_status.switch_off) { + + /* FIXME: This should be configureable via proc */ + execute("umask 600; echo 0 > /etc/initrunlvl; kill -HUP 1"); + } else if(voyager_status.power_fail) { + VDEBUG(("Voyager daemon detected AC power failure\n")); + + /* FIXME: This should be configureable via proc */ + execute("umask 600; echo F > /etc/powerstatus; kill -PWR 1"); + set_timeout = 1; + } +} + +static void +check_continuing_condition(void) +{ + if(voyager_status.power_fail) { + __u8 data; + voyager_cat_psi(VOYAGER_PSI_SUBREAD, + VOYAGER_PSI_AC_FAIL_REG, &data); + if((data & 0x1f) == 0) { + /* all power restored */ + printk(KERN_NOTICE "VOYAGER AC power restored, cancelling shutdown\n"); + /* FIXME: should be user configureable */ + execute("umask 600; echo O > /etc/powerstatus; kill -PWR 1"); + set_timeout = 0; + } + } +} + +static void +wakeup(unsigned long unused) +{ + up(&kvoyagerd_sem); +} + +static int +thread(void *unused) +{ + struct timer_list wakeup_timer; + + kvoyagerd_running = 1; + + reparent_to_init(); + daemonize(); + + set_timeout = 0; + + init_timer(&wakeup_timer); + + strcpy(current->comm, THREAD_NAME); + sigfillset(¤t->blocked); + current->tty = NULL; /* get rid of controlling tty */ + + printk(KERN_NOTICE "Voyager starting monitor thread\n"); + + for(;;) { + down_interruptible(&kvoyagerd_sem); + VDEBUG(("Voyager Daemon awoken\n")); + if(voyager_status.request_from_kernel == 0) { + /* probably awoken from timeout */ + check_continuing_condition(); + } else { + check_from_kernel(); + voyager_status.request_from_kernel = 0; + } + if(set_timeout) { + del_timer(&wakeup_timer); + wakeup_timer.expires = HZ + jiffies; + wakeup_timer.function = wakeup; + add_timer(&wakeup_timer); + } + } +} + +static void __exit +voyager_thread_stop(void) +{ + /* FIXME: do nothing at the moment */ +} + +module_init(voyager_thread_start); +//module_exit(voyager_thread_stop); diff --git a/drivers/acorn/block/mfmhd.c b/drivers/acorn/block/mfmhd.c index 95471970b5d8..7b1c3b13fb3f 100644 --- a/drivers/acorn/block/mfmhd.c +++ b/drivers/acorn/block/mfmhd.c @@ -105,7 +105,6 @@ #include <linux/interrupt.h> #include <linux/kernel.h> #include <linux/timer.h> -#include <linux/tqueue.h> #include <linux/mm.h> #include <linux/errno.h> #include <linux/genhd.h> diff --git a/drivers/atm/Makefile b/drivers/atm/Makefile index 2d88513912c0..00c3ccb5debd 100644 --- a/drivers/atm/Makefile +++ b/drivers/atm/Makefile @@ -40,7 +40,7 @@ ifeq ($(CONFIG_ATM_FORE200E_PCA),y) fore_200e-objs += fore200e_pca_fw.o # guess the target endianess to choose the right PCA-200E firmware image ifeq ($(CONFIG_ATM_FORE200E_PCA_DEFAULT_FW),y) - CONFIG_ATM_FORE200E_PCA_FW = $(shell if test -n "`$(CC) -E -dM $(src)/../../include/asm/byteorder.h | grep ' __LITTLE_ENDIAN '`"; then echo pca200e.bin; else echo pca200e_ecd.bin2; fi) + CONFIG_ATM_FORE200E_PCA_FW = $(shell if test -n "`$(CC) -E -dM $(src)/../../include/asm/byteorder.h | grep ' __LITTLE_ENDIAN '`"; then echo $(obj)/pca200e.bin; else echo $(obj)/pca200e_ecd.bin2; fi) endif endif diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c index 8660312274f5..f72966037995 100644 --- a/drivers/atm/firestream.c +++ b/drivers/atm/firestream.c @@ -760,6 +760,7 @@ static void process_txdone_queue (struct fs_dev *dev, struct queue *q) default: /* Here we get the tx purge inhibit command ... */ /* Action, I believe, is "don't do anything". -- REW */ + ; } write_fs (dev, Q_RP(q->offset), Q_INCWRAP); diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c index 70a89fcb3ac4..25be9288a660 100644 --- a/drivers/atm/iphase.c +++ b/drivers/atm/iphase.c @@ -118,7 +118,7 @@ static void ia_enque_head_rtn_q (IARTN_Q *que, IARTN_Q * data) } static int ia_enque_rtn_q (IARTN_Q *que, struct desc_tbl_t data) { - IARTN_Q *entry = kmalloc(sizeof(*entry), GFP_KERNEL); + IARTN_Q *entry = kmalloc(sizeof(*entry), GFP_ATOMIC); if (!entry) return -1; entry->data = data; entry->next = NULL; @@ -202,8 +202,7 @@ static u16 get_desc (IADEV *dev, struct ia_vcc *iavcc) { ltimeout = dev->desc_tbl[i].iavcc->ltimeout; delta = jiffies - dev->desc_tbl[i].timestamp; if (delta >= ltimeout) { - IF_ABR(printk("RECOVER run!! desc_tbl %d = %d delta = %ld, - time = %ld\n", i,dev->desc_tbl[i].timestamp, delta, jiffies);) + IF_ABR(printk("RECOVER run!! desc_tbl %d = %d delta = %ld, time = %ld\n", i,dev->desc_tbl[i].timestamp, delta, jiffies);) if (dev->ffL.tcq_rd == dev->ffL.tcq_st) dev->ffL.tcq_rd = dev->ffL.tcq_ed; else @@ -624,6 +623,7 @@ static int ia_que_tx (IADEV *iadev) { struct ia_vcc *iavcc; static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb); num_desc = ia_avail_descs(iadev); + while (num_desc && (skb = skb_dequeue(&iadev->tx_backlog))) { if (!(vcc = ATM_SKB(skb)->vcc)) { dev_kfree_skb_any(skb); @@ -643,6 +643,7 @@ static int ia_que_tx (IADEV *iadev) { } return 0; } + void ia_tx_poll (IADEV *iadev) { struct atm_vcc *vcc = NULL; struct sk_buff *skb = NULL, *skb1 = NULL; @@ -1086,6 +1087,7 @@ static int rx_pkt(struct atm_dev *dev) int len; struct sk_buff *skb; u_int buf_addr, dma_addr; + iadev = INPH_IA_DEV(dev); if (iadev->rfL.pcq_rd == (readw(iadev->reass_reg+PCQ_WR_PTR)&0xffff)) { @@ -1171,7 +1173,8 @@ static int rx_pkt(struct atm_dev *dev) /* Build the DLE structure */ wr_ptr = iadev->rx_dle_q.write; - wr_ptr->sys_pkt_addr = virt_to_bus(skb->data); + wr_ptr->sys_pkt_addr = pci_map_single(iadev->pci, skb->data, + len, PCI_DMA_FROMDEVICE); wr_ptr->local_pkt_addr = buf_addr; wr_ptr->bytes = len; /* We don't know this do we ?? */ wr_ptr->mode = DMA_INT_ENABLE; @@ -1290,6 +1293,9 @@ static void rx_dle_intr(struct atm_dev *dev) struct cpcs_trailer *trailer; u_short length; struct ia_vcc *ia_vcc; + + pci_unmap_single(iadev->pci, iadev->rx_dle_q.write->sys_pkt_addr, + len, PCI_DMA_FROMDEVICE); /* no VCC related housekeeping done as yet. lets see */ vcc = ATM_SKB(skb)->vcc; if (!vcc) { @@ -1401,7 +1407,7 @@ static int rx_init(struct atm_dev *dev) IADEV *iadev; struct rx_buf_desc *buf_desc_ptr; unsigned long rx_pkt_start = 0; - u32 *odle_addr, *dle_addr; + void *dle_addr; struct abr_vc_table *abr_vc_table; u16 *vc_table; u16 *reass_table; @@ -1412,25 +1418,14 @@ static int rx_init(struct atm_dev *dev) iadev = INPH_IA_DEV(dev); // spin_lock_init(&iadev->rx_lock); - /* I need to initialize the DLEs somewhere. Lets see what I - need to do for this, hmmm... - - allocate memory for 256 DLEs. make sure that it starts - on a 4k byte address boundary. Program the start address - in Receive List address register. ..... to do for TX also - To make sure that it is a 4k byte boundary - allocate 8k and find - 4k byte boundary within. - ( (addr + (4k-1)) & ~(4k-1) ) - */ - /* allocate 8k bytes */ - odle_addr = kmalloc(2*sizeof(struct dle)*DLE_ENTRIES, GFP_KERNEL); - if (!odle_addr) - { - printk(KERN_ERR DEV_LABEL "can't allocate DLEs\n"); - return -ENOMEM; - } - /* find 4k byte boundary within the 8k allocated */ - dle_addr = (u32*)( ((u32)odle_addr+(4096-1)) & ~(4096-1) ); + /* Allocate 4k bytes - more aligned than needed (4k boundary) */ + dle_addr = pci_alloc_consistent(iadev->pci, DLE_TOTAL_SIZE, + &iadev->rx_dle_dma); + if (!dle_addr) { + printk(KERN_ERR DEV_LABEL "can't allocate DLEs\n"); + goto err_out; + } iadev->rx_dle_q.start = (struct dle*)dle_addr; iadev->rx_dle_q.read = iadev->rx_dle_q.start; iadev->rx_dle_q.write = iadev->rx_dle_q.start; @@ -1439,7 +1434,8 @@ static int rx_init(struct atm_dev *dev) DLE that can be used. */ /* write the upper 20 bits of the start address to rx list address register */ - writel(virt_to_bus(dle_addr) & 0xfffff000, iadev->dma+IPHASE5575_RX_LIST_ADDR); + writel(iadev->rx_dle_dma & 0xfffff000, + iadev->dma + IPHASE5575_RX_LIST_ADDR); IF_INIT(printk("Tx Dle list addr: 0x%08x value: 0x%0x\n", (u32)(iadev->dma+IPHASE5575_TX_LIST_ADDR), *(u32*)(iadev->dma+IPHASE5575_TX_LIST_ADDR)); @@ -1613,8 +1609,7 @@ static int rx_init(struct atm_dev *dev) { printk(KERN_ERR DEV_LABEL "itf %d couldn't get free page\n", dev->number); - kfree(odle_addr); - return -ENOMEM; + goto err_free_dle; } memset(iadev->rx_open, 0, 4*iadev->num_vc); iadev->rxing = 1; @@ -1622,6 +1617,12 @@ static int rx_init(struct atm_dev *dev) /* Mode Register */ writew(R_ONLINE, iadev->reass_reg+MODE_REG); return 0; + +err_free_dle: + pci_free_consistent(iadev->pci, DLE_TOTAL_SIZE, iadev->rx_dle_q.start, + iadev->rx_dle_dma); +err_out: + return -ENOMEM; } @@ -1686,6 +1687,12 @@ static void tx_dle_intr(struct atm_dev *dev) /* free the DMAed skb */ skb = skb_dequeue(&iadev->tx_dma_q); if (!skb) break; + + /* Revenge of the 2 dle (skb + trailer) used in ia_pkt_tx() */ + if (!((dle - iadev->tx_dle_q.start)%(2*sizeof(struct dle)))) { + pci_unmap_single(iadev->pci, dle->sys_pkt_addr, skb->len, + PCI_DMA_TODEVICE); + } vcc = ATM_SKB(skb)->vcc; if (!vcc) { printk("tx_dle_intr: vcc is null\n"); @@ -1878,7 +1885,7 @@ static int tx_init(struct atm_dev *dev) IADEV *iadev; struct tx_buf_desc *buf_desc_ptr; unsigned int tx_pkt_start; - u32 *dle_addr; + void *dle_addr; int i; u_short tcq_st_adr; u_short *tcq_start; @@ -1894,24 +1901,22 @@ static int tx_init(struct atm_dev *dev) IF_INIT(printk("Tx MASK REG: 0x%0x\n", readw(iadev->seg_reg+SEG_MASK_REG));) - /*---------- Initializing Transmit DLEs ----------*/ - /* allocating 8k memory for transmit DLEs */ - dle_addr = kmalloc(2*sizeof(struct dle)*DLE_ENTRIES, GFP_KERNEL); - if (!dle_addr) - { - printk(KERN_ERR DEV_LABEL "can't allocate TX DLEs\n"); - return -ENOMEM; - } - - /* find 4k byte boundary within the 8k allocated */ - dle_addr = (u32*)(((u32)dle_addr+(4096-1)) & ~(4096-1)); + + /* Allocate 4k (boundary aligned) bytes */ + dle_addr = pci_alloc_consistent(iadev->pci, DLE_TOTAL_SIZE, + &iadev->tx_dle_dma); + if (!dle_addr) { + printk(KERN_ERR DEV_LABEL "can't allocate DLEs\n"); + goto err_out; + } iadev->tx_dle_q.start = (struct dle*)dle_addr; iadev->tx_dle_q.read = iadev->tx_dle_q.start; iadev->tx_dle_q.write = iadev->tx_dle_q.start; iadev->tx_dle_q.end = (struct dle*)((u32)dle_addr+sizeof(struct dle)*DLE_ENTRIES); /* write the upper 20 bits of the start address to tx list address register */ - writel(virt_to_bus(dle_addr) & 0xfffff000, iadev->dma+IPHASE5575_TX_LIST_ADDR); + writel(iadev->tx_dle_dma & 0xfffff000, + iadev->dma + IPHASE5575_TX_LIST_ADDR); writew(0xffff, iadev->seg_reg+SEG_MASK_REG); writew(0, iadev->seg_reg+MODE_REG_0); writew(RESET_SEG, iadev->seg_reg+SEG_COMMAND_REG); @@ -1955,26 +1960,29 @@ static int tx_init(struct atm_dev *dev) buf_desc_ptr++; tx_pkt_start += iadev->tx_buf_sz; } - iadev->tx_buf = kmalloc(iadev->num_tx_desc*sizeof(caddr_t), GFP_KERNEL); + iadev->tx_buf = kmalloc(iadev->num_tx_desc*sizeof(struct cpcs_trailer_desc), GFP_KERNEL); if (!iadev->tx_buf) { printk(KERN_ERR DEV_LABEL " couldn't get mem\n"); - return -EAGAIN; + goto err_free_dle; } for (i= 0; i< iadev->num_tx_desc; i++) { + struct cpcs_trailer *cpcs; - iadev->tx_buf[i] = kmalloc(sizeof(struct cpcs_trailer), - GFP_KERNEL|GFP_DMA); - if(!iadev->tx_buf[i]) { + cpcs = kmalloc(sizeof(*cpcs), GFP_KERNEL|GFP_DMA); + if(!cpcs) { printk(KERN_ERR DEV_LABEL " couldn't get freepage\n"); - return -EAGAIN; + goto err_free_tx_bufs; } + iadev->tx_buf[i].cpcs = cpcs; + iadev->tx_buf[i].dma_addr = pci_map_single(iadev->pci, + cpcs, sizeof(*cpcs), PCI_DMA_TODEVICE); } iadev->desc_tbl = kmalloc(iadev->num_tx_desc * sizeof(struct desc_tbl_t), GFP_KERNEL); if (!iadev->desc_tbl) { printk(KERN_ERR DEV_LABEL " couldn't get mem\n"); - return -EAGAIN; + goto err_free_all_tx_bufs; } /* Communication Queues base address */ @@ -2103,7 +2111,7 @@ static int tx_init(struct atm_dev *dev) iadev->testTable = kmalloc(sizeof(long)*iadev->num_vc, GFP_KERNEL); if (!iadev->testTable) { printk("Get freepage failed\n"); - return -EAGAIN; + goto err_free_desc_tbl; } for(i=0; i<iadev->num_vc; i++) { @@ -2112,7 +2120,7 @@ static int tx_init(struct atm_dev *dev) iadev->testTable[i] = kmalloc(sizeof(struct testTable_t), GFP_KERNEL); if (!iadev->testTable[i]) - return -ENOMEM; + goto err_free_test_tables; iadev->testTable[i]->lastTime = 0; iadev->testTable[i]->fract = 0; iadev->testTable[i]->vc_status = VC_UBR; @@ -2163,7 +2171,30 @@ static int tx_init(struct atm_dev *dev) iadev->tx_pkt_cnt = 0; iadev->rate_limit = iadev->LineRate / 3; - return 0; + return 0; + +err_free_test_tables: + while (--i >= 0) + kfree(iadev->testTable[i]); + kfree(iadev->testTable); +err_free_desc_tbl: + kfree(iadev->desc_tbl); +err_free_all_tx_bufs: + i = iadev->num_tx_desc; +err_free_tx_bufs: + while (--i >= 0) { + struct cpcs_trailer_desc *desc = iadev->tx_buf + i; + + pci_unmap_single(iadev->pci, desc->dma_addr, + sizeof(*desc->cpcs), PCI_DMA_TODEVICE); + kfree(desc->cpcs); + } + kfree(iadev->tx_buf); +err_free_dle: + pci_free_consistent(iadev->pci, DLE_TOTAL_SIZE, iadev->tx_dle_q.start, + iadev->tx_dle_dma); +err_out: + return -ENOMEM; } static void ia_int(int irq, void *dev_id, struct pt_regs *regs) @@ -2421,10 +2452,37 @@ static unsigned char ia_phy_get(struct atm_dev *dev, unsigned long addr) return readl(INPH_IA_DEV(dev)->phy+addr); } +static void ia_free_tx(IADEV *iadev) +{ + int i; + + kfree(iadev->desc_tbl); + for (i = 0; i < iadev->num_vc; i++) + kfree(iadev->testTable[i]); + kfree(iadev->testTable); + for (i = 0; i < iadev->num_tx_desc; i++) { + struct cpcs_trailer_desc *desc = iadev->tx_buf + i; + + pci_unmap_single(iadev->pci, desc->dma_addr, + sizeof(*desc->cpcs), PCI_DMA_TODEVICE); + kfree(desc->cpcs); + } + kfree(iadev->tx_buf); + pci_free_consistent(iadev->pci, DLE_TOTAL_SIZE, iadev->tx_dle_q.start, + iadev->tx_dle_dma); +} + +static void ia_free_rx(IADEV *iadev) +{ + kfree(iadev->rx_open); + pci_free_consistent(iadev->pci, DLE_TOTAL_SIZE, iadev->rx_dle_q.start, + iadev->rx_dle_dma); +} + static int __init ia_start(struct atm_dev *dev) { IADEV *iadev; - int error = 1; + int error; unsigned char phy; u32 ctrl_reg; IF_EVENT(printk(">ia_start\n");) @@ -2432,7 +2490,8 @@ static int __init ia_start(struct atm_dev *dev) if (request_irq(iadev->irq, &ia_int, SA_SHIRQ, DEV_LABEL, dev)) { printk(KERN_ERR DEV_LABEL "(itf %d): IRQ%d is already in use\n", dev->number, iadev->irq); - return -EAGAIN; + error = -EAGAIN; + goto err_out; } /* @@@ should release IRQ on error */ /* enabling memory + master */ @@ -2442,8 +2501,8 @@ static int __init ia_start(struct atm_dev *dev) { printk(KERN_ERR DEV_LABEL "(itf %d): can't enable memory+" "master (0x%x)\n",dev->number, error); - free_irq(iadev->irq, dev); - return -EIO; + error = -EIO; + goto err_free_irq; } udelay(10); @@ -2477,15 +2536,11 @@ static int __init ia_start(struct atm_dev *dev) ia_hw_type(iadev); error = tx_init(dev); - if (error) { - free_irq(iadev->irq, dev); - return error; - } + if (error) + goto err_free_irq; error = rx_init(dev); - if (error) { - free_irq(iadev->irq, dev); - return error; - } + if (error) + goto err_free_tx; ctrl_reg = readl(iadev->reg+IPHASE5575_BUS_CONTROL_REG); writel(ctrl_reg | CTRL_FE_RST, iadev->reg+IPHASE5575_BUS_CONTROL_REG); @@ -2498,35 +2553,38 @@ static int __init ia_start(struct atm_dev *dev) else printk("IA: utopia,rev.%0x\n",phy);) - if (iadev->phy_type & FE_25MBIT_PHY) { + if (iadev->phy_type & FE_25MBIT_PHY) ia_mb25_init(iadev); - return 0; - } - if (iadev->phy_type & (FE_DS3_PHY | FE_E3_PHY)) { + else if (iadev->phy_type & (FE_DS3_PHY | FE_E3_PHY)) ia_suni_pm7345_init(iadev); - return 0; - } - - error = suni_init(dev); - if (error) { - free_irq(iadev->irq, dev); - return error; - } - - /* Enable interrupt on loss of signal SUNI_RSOP_CIE 0x10 - SUNI_RSOP_CIE_LOSE - 0x04 - */ - ia_phy_put(dev, ia_phy_get(dev,0x10) | 0x04, 0x10); -#if 0 - error = dev->phy->start(dev); - if (error) { - free_irq(iadev->irq, dev); - return error; - } + else { + error = suni_init(dev); + if (error) + goto err_free_rx; + /* + * Enable interrupt on loss of signal + * SUNI_RSOP_CIE - 0x10 + * SUNI_RSOP_CIE_LOSE - 0x04 + */ + ia_phy_put(dev, ia_phy_get(dev, 0x10) | 0x04, 0x10); +#ifndef MODULE + error = dev->phy->start(dev); + if (error) + goto err_free_rx; #endif - /* Get iadev->carrier_detect status */ - IaFrontEndIntr(iadev); - return 0; + /* Get iadev->carrier_detect status */ + IaFrontEndIntr(iadev); + } + return 0; + +err_free_rx: + ia_free_rx(iadev); +err_free_tx: + ia_free_tx(iadev); +err_free_irq: + free_irq(iadev->irq, dev); +err_out: + return error; } static void ia_close(struct atm_vcc *vcc) @@ -2835,10 +2893,10 @@ static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) { struct tx_buf_desc *buf_desc_ptr; int desc; int comp_code; - unsigned int addr; int total_len, pad, last; struct cpcs_trailer *trailer; struct ia_vcc *iavcc; + iadev = INPH_IA_DEV(vcc->dev); iavcc = INPH_IA_VCC(vcc); if (!iavcc->txing) { @@ -2923,13 +2981,9 @@ static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) { IF_TX(printk("ia packet len:%d padding:%d\n", total_len, pad);) /* Put the packet in a tx buffer */ - if (!iadev->tx_buf[desc-1]) - printk("couldn't get free page\n"); - + trailer = iadev->tx_buf[desc-1].cpcs; IF_TX(printk("Sent: skb = 0x%x skb->data: 0x%x len: %d, desc: %d\n", (u32)skb, (u32)skb->data, skb->len, desc);) - addr = virt_to_bus(skb->data); - trailer = (struct cpcs_trailer*)iadev->tx_buf[desc-1]; trailer->control = 0; /*big endian*/ trailer->length = ((skb->len & 0xff) << 8) | ((skb->len & 0xff00) >> 8); @@ -2945,6 +2999,7 @@ static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) { buf_desc_ptr = (struct tx_buf_desc *)(iadev->seg_ram+TX_DESC_BASE); buf_desc_ptr += desc; /* points to the corresponding entry */ buf_desc_ptr->desc_mode = AAL5 | EOM_EN | APP_CRC32 | CMPL_INT; + /* Huh ? p.115 of users guide describes this as a read-only register */ writew(TRANSMIT_DONE, iadev->seg_reg+SEG_INTR_STATUS_REG); buf_desc_ptr->vc_index = vcc->vci; buf_desc_ptr->bytes = total_len; @@ -2955,7 +3010,8 @@ static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) { /* Build the DLE structure */ wr_ptr = iadev->tx_dle_q.write; memset((caddr_t)wr_ptr, 0, sizeof(*wr_ptr)); - wr_ptr->sys_pkt_addr = addr; + wr_ptr->sys_pkt_addr = pci_map_single(iadev->pci, skb->data, + skb->len, PCI_DMA_TODEVICE); wr_ptr->local_pkt_addr = (buf_desc_ptr->buf_start_hi << 16) | buf_desc_ptr->buf_start_lo; /* wr_ptr->bytes = swap(total_len); didn't seem to affect ?? */ @@ -2973,7 +3029,7 @@ static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) { wr_ptr = iadev->tx_dle_q.start; /* Build trailer dle */ - wr_ptr->sys_pkt_addr = virt_to_bus(iadev->tx_buf[desc-1]); + wr_ptr->sys_pkt_addr = iadev->tx_buf[desc-1].dma_addr; wr_ptr->local_pkt_addr = ((buf_desc_ptr->buf_start_hi << 16) | buf_desc_ptr->buf_start_lo) + total_len - sizeof(struct cpcs_trailer); @@ -3124,128 +3180,130 @@ static const struct atmdev_ops ops = { .owner = THIS_MODULE, }; - -static int __init ia_detect(void) +static int __devinit ia_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) { struct atm_dev *dev; IADEV *iadev; unsigned long flags; - int index = 0; - struct pci_dev *prev_dev; - if (!pci_present()) { - printk(KERN_ERR DEV_LABEL " driver but no PCI BIOS ?\n"); - return 0; - } + int ret; + iadev = kmalloc(sizeof(*iadev), GFP_KERNEL); - if (!iadev) return -ENOMEM; - memset((char*)iadev, 0, sizeof(*iadev)); - prev_dev = NULL; - while((iadev->pci = pci_find_device(PCI_VENDOR_ID_IPHASE, - PCI_DEVICE_ID_IPHASE_5575, prev_dev))) { - IF_INIT(printk("ia detected at bus:%d dev: %d function:%d\n", - iadev->pci->bus->number, PCI_SLOT(iadev->pci->devfn), - PCI_FUNC(iadev->pci->devfn));) - if (pci_enable_device(iadev->pci)) break; - dev = atm_dev_register(DEV_LABEL, &ops, -1, NULL); - if (!dev) break; - IF_INIT(printk(DEV_LABEL "registered at (itf :%d)\n", - dev->number);) - INPH_IA_DEV(dev) = iadev; - // TODO: multi_board using ia_boards logic in cleanup_module - ia_dev[index] = iadev; - _ia_dev[index] = dev; - IF_INIT(printk("dev_id = 0x%x iadev->LineRate = %d \n", - (u32)dev, iadev->LineRate);) - iadev_count++; - spin_lock_init(&iadev->misc_lock); - spin_lock_irqsave(&iadev->misc_lock, flags); - if (ia_init(dev) || ia_start(dev)) { - atm_dev_deregister(dev); - IF_INIT(printk("IA register failed!\n");) - ia_dev[index] = NULL; - _ia_dev[index] = NULL; - iadev_count--; - spin_unlock_irqrestore(&iadev->misc_lock, flags); - return -EINVAL; - } - spin_unlock_irqrestore(&iadev->misc_lock, flags); - IF_EVENT(printk("iadev_count = %d\n", iadev_count);) - prev_dev = iadev->pci; - iadev->next_board = ia_boards; - ia_boards = dev; - iadev = kmalloc(sizeof(*iadev), GFP_KERNEL); - if (!iadev) break; - memset((char*)iadev, 0, sizeof(*iadev)); - index++; - dev = NULL; - } - return index; -} - + if (!iadev) { + ret = -ENOMEM; + goto err_out; + } + memset(iadev, 0, sizeof(*iadev)); + iadev->pci = pdev; + + IF_INIT(printk("ia detected at bus:%d dev: %d function:%d\n", + pdev->bus->number, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn));) + if (pci_enable_device(pdev)) { + ret = -ENODEV; + goto err_out_free_iadev; + } + dev = atm_dev_register(DEV_LABEL, &ops, -1, NULL); + if (!dev) { + ret = -ENOMEM; + goto err_out_disable_dev; + } + INPH_IA_DEV(dev) = iadev; + IF_INIT(printk(DEV_LABEL "registered at (itf :%d)\n", dev->number);) + IF_INIT(printk("dev_id = 0x%x iadev->LineRate = %d \n", (u32)dev, + iadev->LineRate);) + + ia_dev[iadev_count] = iadev; + _ia_dev[iadev_count] = dev; + iadev_count++; + spin_lock_init(&iadev->misc_lock); + /* First fixes first. I don't want to think about this now. */ + spin_lock_irqsave(&iadev->misc_lock, flags); + if (ia_init(dev) || ia_start(dev)) { + IF_INIT(printk("IA register failed!\n");) + iadev_count--; + ia_dev[iadev_count] = NULL; + _ia_dev[iadev_count] = NULL; + spin_unlock_irqrestore(&iadev->misc_lock, flags); + ret = -EINVAL; + goto err_out_deregister_dev; + } + spin_unlock_irqrestore(&iadev->misc_lock, flags); + IF_EVENT(printk("iadev_count = %d\n", iadev_count);) + + iadev->next_board = ia_boards; + ia_boards = dev; + + pci_set_drvdata(pdev, dev); + + return 0; + +err_out_deregister_dev: + atm_dev_deregister(dev); +err_out_disable_dev: + pci_disable_device(pdev); +err_out_free_iadev: + kfree(iadev); +err_out: + return ret; +} + +static void __devexit ia_remove_one(struct pci_dev *pdev) +{ + struct atm_dev *dev = pci_get_drvdata(pdev); + IADEV *iadev = INPH_IA_DEV(dev); + + ia_phy_put(dev, ia_phy_get(dev,0x10) & ~(0x4), 0x10); + udelay(1); + + /* De-register device */ + free_irq(iadev->irq, dev); + iadev_count--; + ia_dev[iadev_count] = NULL; + _ia_dev[iadev_count] = NULL; + atm_dev_deregister(dev); + IF_EVENT(printk("iav deregistered at (itf:%d)\n", dev->number);) + + iounmap((void *) iadev->base); + pci_disable_device(pdev); + + ia_free_rx(iadev); + ia_free_tx(iadev); + + kfree(iadev); +} + +static struct pci_device_id ia_pci_tbl[] __devinitdata = { + { PCI_VENDOR_ID_IPHASE, 0x0008, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_IPHASE, 0x0009, PCI_ANY_ID, PCI_ANY_ID, }, + { 0,} +}; +MODULE_DEVICE_TABLE(pci, ia_pci_tbl); + +static struct pci_driver ia_driver = { + .name = DEV_LABEL, + .id_table = ia_pci_tbl, + .probe = ia_init_one, + .remove = ia_remove_one, +}; + static int __init ia_module_init(void) -{ - IF_EVENT(printk(">ia init_module\n");) - if (!ia_detect()) { +{ + int ret; + + ret = pci_module_init(&ia_driver); + if (ret >= 0) { + ia_timer.expires = jiffies + 3*HZ; + add_timer(&ia_timer); + } else printk(KERN_ERR DEV_LABEL ": no adapter found\n"); - return -ENXIO; - } - ia_timer.expires = jiffies + 3*HZ; - add_timer(&ia_timer); - - return 0; -} - - + return ret; +} + static void __exit ia_module_exit(void) -{ - struct atm_dev *dev; - IADEV *iadev; - unsigned short command; - int i, j= 0; - - IF_EVENT(printk(">ia cleanup_module\n");) - if (MOD_IN_USE) - printk("ia: module in use\n"); +{ + pci_unregister_driver(&ia_driver); + del_timer(&ia_timer); - while(ia_dev[j]) - { - dev = ia_boards; - iadev = INPH_IA_DEV(dev); - ia_boards = iadev->next_board; - - /* disable interrupt of lost signal */ - ia_phy_put(dev, ia_phy_get(dev,0x10) & ~(0x4), 0x10); - udelay(1); - - /* De-register device */ - atm_dev_deregister(dev); - IF_EVENT(printk("iav deregistered at (itf:%d)\n", dev->number);) - for (i= 0; i< iadev->num_tx_desc; i++) - kfree(iadev->tx_buf[i]); - kfree(iadev->tx_buf); - /* Disable memory mapping and busmastering */ - if (pci_read_config_word(iadev->pci, - PCI_COMMAND, &command) != 0) - { - printk("ia: can't read PCI_COMMAND.\n"); - } - command &= ~(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); - if (pci_write_config_word(iadev->pci, - PCI_COMMAND, command) != 0) - { - printk("ia: can't write PCI_COMMAND.\n"); - } - free_irq(iadev->irq, dev); - iounmap((void *) iadev->base); - kfree(iadev); - j++; - } - /* and voila whatever we tried seems to work. I don't know if it will - fix suni errors though. Really doubt that. */ - for (i = 0; i<8; i++) { - ia_dev[i] = NULL; - _ia_dev[i] = NULL; - } } module_init(ia_module_init); diff --git a/drivers/atm/iphase.h b/drivers/atm/iphase.h index d3fbd40c7b09..24acc4387a0a 100644 --- a/drivers/atm/iphase.h +++ b/drivers/atm/iphase.h @@ -200,7 +200,13 @@ struct cpcs_trailer u_short length; u_int crc32; }; - + +struct cpcs_trailer_desc +{ + struct cpcs_trailer *cpcs; + dma_addr_t dma_addr; +}; + struct ia_vcc { int rxing; @@ -272,6 +278,7 @@ struct ext_vc #define DLE_ENTRIES 256 #define DMA_INT_ENABLE 0x0002 /* use for both Tx and Rx */ #define TX_DLE_PSI 0x0001 +#define DLE_TOTAL_SIZE (sizeof(struct dle)*DLE_ENTRIES) /* Descriptor List Entries (DLE) */ struct dle @@ -1017,7 +1024,7 @@ typedef struct iadev_t { struct wait_queue *close_wait; struct wait_queue *timeout_wait; #endif - caddr_t *tx_buf; + struct cpcs_trailer_desc *tx_buf; u16 num_tx_desc, tx_buf_sz, rate_limit; u32 tx_cell_cnt, tx_pkt_cnt; u32 MAIN_VC_TABLE_ADDR, EXT_VC_TABLE_ADDR, ABR_SCHED_TABLE_ADDR; @@ -1063,7 +1070,9 @@ typedef struct iadev_t { struct desc_tbl_t *desc_tbl; u_short host_tcq_wr; struct testTable_t **testTable; -} IADEV; + dma_addr_t tx_dle_dma; + dma_addr_t rx_dle_dma; +} IADEV; #define INPH_IA_DEV(d) ((IADEV *) (d)->dev_data) diff --git a/drivers/atm/lanai.c b/drivers/atm/lanai.c index 60c36f7fed7d..8ca6798f0796 100644 --- a/drivers/atm/lanai.c +++ b/drivers/atm/lanai.c @@ -2108,8 +2108,7 @@ static inline int __init lanai_pci_start(struct lanai_dev *lanai) } result = pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &w); if (result != PCIBIOS_SUCCESSFUL) { - printk(KERN_ERR DEV_LABEL "(itf %d): can't read "" - PCI_SUBSYSTEM_ID: %d\n", lanai->number, result); + printk(KERN_ERR DEV_LABEL "(itf %d): can't read PCI_SUBSYSTEM_ID: %d\n", lanai->number, result); return -EINVAL; } if ((result = check_board_id_and_rev("PCI", w, NULL)) != 0) diff --git a/drivers/atm/zatm.c b/drivers/atm/zatm.c index 04ed4dd34714..6aa0fa7e5715 100644 --- a/drivers/atm/zatm.c +++ b/drivers/atm/zatm.c @@ -1260,13 +1260,13 @@ static void zatm_int(int irq,void *dev_id,struct pt_regs *regs) /* don't handle RD */ if (reason & uPD98401_INT_SPE) printk(KERN_ALERT DEV_LABEL "(itf %d): system parity " - "error at 0x%08x\n",dev->number,zin(ADDR)); + "error at 0x%08lx\n",dev->number,zin(ADDR)); if (reason & uPD98401_INT_CPE) printk(KERN_ALERT DEV_LABEL "(itf %d): control memory " - "parity error at 0x%08x\n",dev->number,zin(ADDR)); + "parity error at 0x%08lx\n",dev->number,zin(ADDR)); if (reason & uPD98401_INT_SBE) { printk(KERN_ALERT DEV_LABEL "(itf %d): system bus " - "error at 0x%08x\n",dev->number,zin(ADDR)); + "error at 0x%08lx\n",dev->number,zin(ADDR)); event_dump(); } /* don't handle IND */ @@ -1448,7 +1448,7 @@ static int __init zatm_init(struct atm_dev *dev) } while (t0 > t1 || t1 > t2); /* loop if wrapping ... */ zatm_dev->khz = t2-2*t1+t0; - printk(KERN_NOTICE DEV_LABEL "(itf %d): uPD98401 %d.%d at %d.%03d " + printk(KERN_NOTICE DEV_LABEL "(itf %d): uPD98401 %ld.%ld at %d.%03d " "MHz\n",dev->number, (zin(VER) & uPD98401_MAJOR) >> uPD98401_MAJOR_SHIFT, zin(VER) & uPD98401_MINOR,zatm_dev->khz/1000,zatm_dev->khz % 1000); diff --git a/drivers/block/xd.h b/drivers/block/xd.h index eb74f70dbaab..2848f8164956 100644 --- a/drivers/block/xd.h +++ b/drivers/block/xd.h @@ -109,7 +109,6 @@ static int xd_manual_geo_init (char *command); static u_char xd_detect (u_char *controller, unsigned int *address); static u_char xd_initdrives (void (*init_drive)(u_char drive)); -static int xd_open (struct inode *inode,struct file *file); static void do_xd_request (request_queue_t * q); static int xd_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg); static int xd_readwrite (u_char operation,u_char drive,char *buffer,u_int block,u_int count); diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c index 67dcad9138da..42cc8ac768ee 100644 --- a/drivers/bluetooth/bluecard_cs.c +++ b/drivers/bluetooth/bluecard_cs.c @@ -456,27 +456,27 @@ static void bluecard_receive(bluecard_info_t *info, unsigned int offset) if (info->rx_count == 0) { int dlen; - hci_event_hdr *eh; - hci_acl_hdr *ah; - hci_sco_hdr *sh; + struct hci_event_hdr *eh; + struct hci_acl_hdr *ah; + struct hci_sco_hdr *sh; switch (info->rx_state) { case RECV_WAIT_EVENT_HEADER: - eh = (hci_event_hdr *)(info->rx_skb->data); + eh = (struct hci_event_hdr *)(info->rx_skb->data); info->rx_state = RECV_WAIT_DATA; info->rx_count = eh->plen; break; case RECV_WAIT_ACL_HEADER: - ah = (hci_acl_hdr *)(info->rx_skb->data); + ah = (struct hci_acl_hdr *)(info->rx_skb->data); dlen = __le16_to_cpu(ah->dlen); info->rx_state = RECV_WAIT_DATA; info->rx_count = dlen; break; case RECV_WAIT_SCO_HEADER: - sh = (hci_sco_hdr *)(info->rx_skb->data); + sh = (struct hci_sco_hdr *)(info->rx_skb->data); info->rx_state = RECV_WAIT_DATA; info->rx_count = sh->dlen; break; diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c index 460652790b07..f37d44b2da4b 100644 --- a/drivers/bluetooth/bt3c_cs.c +++ b/drivers/bluetooth/bt3c_cs.c @@ -318,27 +318,27 @@ static void bt3c_receive(bt3c_info_t *info) if (info->rx_count == 0) { int dlen; - hci_event_hdr *eh; - hci_acl_hdr *ah; - hci_sco_hdr *sh; + struct hci_event_hdr *eh; + struct hci_acl_hdr *ah; + struct hci_sco_hdr *sh; switch (info->rx_state) { case RECV_WAIT_EVENT_HEADER: - eh = (hci_event_hdr *)(info->rx_skb->data); + eh = (struct hci_event_hdr *)(info->rx_skb->data); info->rx_state = RECV_WAIT_DATA; info->rx_count = eh->plen; break; case RECV_WAIT_ACL_HEADER: - ah = (hci_acl_hdr *)(info->rx_skb->data); + ah = (struct hci_acl_hdr *)(info->rx_skb->data); dlen = __le16_to_cpu(ah->dlen); info->rx_state = RECV_WAIT_DATA; info->rx_count = dlen; break; case RECV_WAIT_SCO_HEADER: - sh = (hci_sco_hdr *)(info->rx_skb->data); + sh = (struct hci_sco_hdr *)(info->rx_skb->data); info->rx_state = RECV_WAIT_DATA; info->rx_count = sh->dlen; break; diff --git a/drivers/cdrom/gscd.c b/drivers/cdrom/gscd.c index 44ed8327f795..4dfd3d4728fb 100644 --- a/drivers/cdrom/gscd.c +++ b/drivers/cdrom/gscd.c @@ -268,7 +268,7 @@ repeat: goto out; if (req->cmd != READ) { - printk("GSCD: bad cmd %d\n", req->cmd); + printk("GSCD: bad cmd %d\n", rq_data_dir(req)); end_request(req, 0); goto repeat; } diff --git a/drivers/char/dz.c b/drivers/char/dz.c index 89f6bad5838d..da38ee34d8e2 100644 --- a/drivers/char/dz.c +++ b/drivers/char/dz.c @@ -34,7 +34,6 @@ Qua Jun 27 15:02:26 BRT 2001 #include <linux/mm.h> #include <linux/major.h> #include <linux/param.h> -#include <linux/tqueue.h> #include <linux/interrupt.h> #include <linux/serial.h> #include <linux/serialP.h> diff --git a/drivers/char/i810-tco.c b/drivers/char/i810-tco.c index c186ad1e385b..3697dd0f81b3 100644 --- a/drivers/char/i810-tco.c +++ b/drivers/char/i810-tco.c @@ -244,9 +244,9 @@ static int i810tco_ioctl (struct inode *inode, struct file *file, int options, retval = -EINVAL; static struct watchdog_info ident = { - options: WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING, - firmware_version: 0, - identity: "i810 TCO timer", + .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING, + .firmware_version = 0, + .identity = "i810 TCO timer", }; switch (cmd) { default: @@ -371,17 +371,17 @@ static unsigned char __init i810tco_getdevice (void) } static struct file_operations i810tco_fops = { - owner: THIS_MODULE, - write: i810tco_write, - ioctl: i810tco_ioctl, - open: i810tco_open, - release: i810tco_release, + .owner = THIS_MODULE, + .write = i810tco_write, + .ioctl = i810tco_ioctl, + .open = i810tco_open, + .release = i810tco_release, }; static struct miscdevice i810tco_miscdev = { - minor: WATCHDOG_MINOR, - name: "watchdog", - fops: &i810tco_fops, + .minor = WATCHDOG_MINOR, + .name = "watchdog", + .fops = &i810tco_fops, }; static int __init watchdog_init (void) diff --git a/drivers/char/ip2/i2lib.c b/drivers/char/ip2/i2lib.c index 3d3711c1eff2..e3ce78253334 100644 --- a/drivers/char/ip2/i2lib.c +++ b/drivers/char/ip2/i2lib.c @@ -84,8 +84,8 @@ static void iiSendPendingMail(i2eBordStrPtr); static void serviceOutgoingFifo(i2eBordStrPtr); // Functions defined in ip2.c as part of interrupt handling -static void do_input(i2ChanStrPtr); -static void do_status(i2ChanStrPtr); +static void do_input(void *); +static void do_status(void *); //*************** //* Debug Data * @@ -333,10 +333,8 @@ i2InitChannels ( i2eBordStrPtr pB, int nChannels, i2ChanStrPtr pCh) pCh->ClosingWaitTime = 30*HZ; // Initialize task queue objects - pCh->tqueue_input.routine = (void(*)(void*)) do_input; - pCh->tqueue_input.data = pCh; - pCh->tqueue_status.routine = (void(*)(void*)) do_status; - pCh->tqueue_status.data = pCh; + INIT_WORK(&pCh->tqueue_input, do_input, pCh); + INIT_WORK(&pCh->tqueue_status, do_status, pCh); #ifdef IP2DEBUG_TRACE pCh->trace = ip2trace; diff --git a/drivers/char/ip2main.c b/drivers/char/ip2main.c index 0dd0c527c380..ac3dd272b45f 100644 --- a/drivers/char/ip2main.c +++ b/drivers/char/ip2main.c @@ -281,8 +281,8 @@ static void ip2_interrupt_bh(i2eBordStrPtr pB); static void ip2_interrupt(int irq, void *dev_id, struct pt_regs * regs); static void ip2_poll(unsigned long arg); static inline void service_all_boards(void); -static inline void do_input(i2ChanStrPtr pCh); -static inline void do_status(i2ChanStrPtr pCh); +static void do_input(void *p); +static void do_status(void *p); static void ip2_wait_until_sent(PTTY,int); @@ -1422,9 +1422,9 @@ ip2_poll(unsigned long arg) ip2trace (ITRC_NO_PORT, ITRC_INTR, ITRC_RETURN, 0 ); } -static inline void -do_input( i2ChanStrPtr pCh ) +static void do_input(void *p) { + i2ChanStrPtr pCh = p; unsigned long flags; ip2trace(CHANN, ITRC_INPUT, 21, 0 ); @@ -1445,8 +1445,7 @@ do_input( i2ChanStrPtr pCh ) } // code duplicated from n_tty (ldisc) -static inline void -isig(int sig, struct tty_struct *tty, int flush) +static inline void isig(int sig, struct tty_struct *tty, int flush) { if (tty->pgrp > 0) kill_pg(tty->pgrp, sig, 1); @@ -1457,9 +1456,9 @@ isig(int sig, struct tty_struct *tty, int flush) } } -static inline void -do_status( i2ChanStrPtr pCh ) +static void do_status(void *p) { + i2ChanStrPtr pCh = p; int status; status = i2GetStatus( pCh, (I2_BRK|I2_PAR|I2_FRA|I2_OVR) ); diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c index 0bd3573facc0..9119510dd38a 100644 --- a/drivers/char/istallion.c +++ b/drivers/char/istallion.c @@ -3371,8 +3371,7 @@ static inline int stli_initports(stlibrd_t *brdp) portp->baud_base = STL_BAUDBASE; portp->close_delay = STL_CLOSEDELAY; portp->closing_wait = 30 * HZ; - portp->tqhangup.routine = stli_dohangup; - portp->tqhangup.data = portp; + INIT_WORK(&portp->tqhangup, stli_dohangup, portp); init_waitqueue_head(&portp->open_wait); init_waitqueue_head(&portp->close_wait); init_waitqueue_head(&portp->raw_wait); diff --git a/drivers/char/specialix.c b/drivers/char/specialix.c index c04abce4a6c3..60a2a0ca2a0c 100644 --- a/drivers/char/specialix.c +++ b/drivers/char/specialix.c @@ -90,7 +90,6 @@ #include <linux/fcntl.h> #include <linux/major.h> #include <linux/delay.h> -#include <linux/tqueue.h> #include <linux/version.h> #include <linux/pci.h> diff --git a/drivers/char/stallion.c b/drivers/char/stallion.c index 1c539767fdb9..c77e65892295 100644 --- a/drivers/char/stallion.c +++ b/drivers/char/stallion.c @@ -2343,8 +2343,7 @@ static int __init stl_initports(stlbrd_t *brdp, stlpanel_t *panelp) portp->closing_wait = 30 * HZ; portp->normaltermios = stl_deftermios; portp->callouttermios = stl_deftermios; - portp->tqueue.routine = stl_offintr; - portp->tqueue.data = portp; + INIT_WORK(&portp->tqueue, stl_offintr, portp); init_waitqueue_head(&portp->open_wait); init_waitqueue_head(&portp->close_wait); portp->stats.brd = portp->brdnr; @@ -4128,7 +4127,7 @@ static void stl_cd1400txisr(stlpanel_t *panelp, int ioaddr) (test_bit(ASYI_TXLOW, &portp->istate) == 0))) { set_bit(ASYI_TXLOW, &portp->istate); MOD_INC_USE_COUNT; - if (schedule_task(&portp->tqueue) == 0) + if (schedule_work(&portp->tqueue) == 0) MOD_DEC_USE_COUNT; } diff --git a/drivers/char/tpqic02.c b/drivers/char/tpqic02.c index 45fdc494a0a8..a8c153f6b90e 100644 --- a/drivers/char/tpqic02.c +++ b/drivers/char/tpqic02.c @@ -116,26 +116,28 @@ * card+drive info if runtime configuration has been selected. */ -static struct mtconfiginfo qic02_tape_dynconf = /* user settable */ -{ 0, 0, BOGUS_IRQ, 0, 0, TPQD_DEFAULT_FLAGS, }; +static struct mtconfiginfo qic02_tape_dynconf = { + /* user settable */ + 0, 0, BOGUS_IRQ, 0, 0, TPQD_DEFAULT_FLAGS, +}; static struct qic02_ccb qic02_tape_ccb; /* private stuff */ #else -unsigned long qic02_tape_debug = TPQD_DEFAULT_FLAGS; +static unsigned long qic02_tape_debug = TPQD_DEFAULT_FLAGS; # if ((QIC02_TAPE_IFC!=WANGTEK) && (QIC02_TAPE_IFC!=ARCHIVE) && (QIC02_TAPE_IFC!=MOUNTAIN)) # error No valid interface card specified # endif #endif /* CONFIG_QIC02_DYNCONF */ -static volatile int ctlbits; /* control reg bits for tape interface */ +static int ctlbits; /* control reg bits for tape interface */ static wait_queue_head_t qic02_tape_transfer; /* sync rw with interrupts */ -static volatile struct mtget ioctl_status; /* current generic status */ +static struct mtget ioctl_status; /* current generic status */ -static volatile struct tpstatus tperror; /* last drive status */ +static struct tpstatus tperror; /* last drive status */ static char rcs_revision[] = "$Revision: 1.10 $"; static char rcs_date[] = "$Date: 1997/01/26 07:13:20 $"; @@ -145,32 +147,34 @@ static char rcs_date[] = "$Date: 1997/01/26 07:13:20 $"; * Some variables need `volatile' because they may be modified * by an interrupt. */ -static volatile flag status_dead = YES; /* device is legally dead until proven alive */ +static flag status_dead = YES; /* device is legally dead until proven alive */ static flag status_zombie = YES; /* it's `zombie' until irq/dma allocated */ -static volatile flag status_bytes_wr = NO; /* write FM at close or not */ -static volatile flag status_bytes_rd = NO; /* (rd|wr) used for rewinding */ +static flag status_bytes_wr = NO; /* write FM at close or not */ +static flag status_bytes_rd = NO; /* (rd|wr) used for rewinding */ static volatile unsigned long status_cmd_pending; /* cmd in progress */ -static volatile flag status_expect_int = NO; /* ready for interrupts */ -static volatile flag status_timer_on = NO; /* using time-out */ -static volatile int status_error; /* int handler may detect error */ -static volatile flag status_eof_detected = NO; /* end of file */ -static volatile flag status_eom_detected = NO; /* end of recorded media */ -static volatile flag status_eot_detected = NO; /* end of tape */ -static volatile flag doing_read = NO; -static volatile flag doing_write = NO; - -static volatile unsigned long dma_bytes_todo; -static volatile unsigned long dma_bytes_done; +static flag status_expect_int = NO; /* ready for interrupts */ +static flag status_timer_on = NO; /* using time-out */ +static int status_error; /* int handler may detect error */ +static flag status_eof_detected = NO; /* end of file */ +static flag status_eom_detected = NO; /* end of recorded media */ +static flag status_eot_detected = NO; /* end of tape */ +static flag doing_read = NO; +static flag doing_write = NO; + +static unsigned long dma_bytes_todo; +static unsigned long dma_bytes_done; static volatile unsigned dma_mode; /* !=0 also means DMA in use */ static flag need_rewind = YES; static kdev_t current_tape_dev; static int extra_blocks_left = BLOCKS_BEYOND_EW; - static struct timer_list tp_timer; +static unsigned long tape_open; /* Guard open one only */ +static DECLARE_MUTEX(tape_op); /* Serialize tape operations */ + /* return_*_eof: * NO: not at EOF, * YES: tell app EOF was reached (return 0). @@ -183,6 +187,7 @@ static struct timer_list tp_timer; * move on to the next file. * */ + static flag return_read_eof = NO; /* set to signal app EOF was reached */ static flag return_write_eof = NO; static flag reported_read_eof = NO; /* set when we've done that */ @@ -248,70 +253,34 @@ static struct exception_list_type { const char *msg; /* EXC_nr attribute should match with tpqic02.h */ } exception_list[] = { - { - 0, 0, "Unknown exception status code", /* extra: 0 */ }, - { - ~(0), TP_ST0 | TP_CNI | TP_USL | TP_WRP, - "Drive not online" /* 1 */ }, - /* Drive presence goes before cartridge presence. */ - { - ~(TP_WRP | TP_USL), TP_ST0 | TP_CNI, + { 0, 0, "Unknown exception status code", /* extra: 0 */ }, + { ~(0), TP_ST0 | TP_CNI | TP_USL | TP_WRP, "Drive not online" /* 1 */ }, /* Drive presence goes before cartridge presence. */ + { ~(TP_WRP | TP_USL), TP_ST0 | TP_CNI, /* My Wangtek 5150EQ sometimes reports a status code * of 0x00e0, which is not a valid exception code, but * I think it should be recognized as "NO CARTRIDGE". */ - "Cartridge not in place" /* 2 */ }, - { - (unsigned short) ~(TP_ST1 | TP_BOM), (TP_ST0 | TP_WRP), - "Write protected cartridge" /* 3 */ }, - { - (unsigned short) ~(TP_ST1 | TP_EOR), (TP_ST0 | TP_EOM), - "End of media" /* 4 */ }, - { - ~TP_WRP, TP_ST0 | TP_UDA | TP_ST1 | TP_BOM, - "Read or Write abort. Rewind tape." /* 5 */ }, - { - ~TP_WRP, TP_ST0 | TP_UDA, - "Read error. Bad block transferred." /* 6 */ }, - { - ~TP_WRP, TP_ST0 | TP_UDA | TP_BNL, - "Read error. Filler block transferred." /* 7 */ }, - { - ~TP_WRP, TP_ST0 | TP_UDA | TP_BNL | TP_ST1 | TP_NDT, - "Read error. No data detected." /* 8 */ }, - { - ~TP_WRP, - TP_ST0 | TP_EOM | TP_UDA | TP_BNL | TP_ST1 | - TP_NDT, "Read error. No data detected. EOM." /* 9 */ }, - { - ~(TP_WRP | TP_MBD | TP_PAR | TP_EOR), - TP_ST0 | TP_UDA | TP_BNL | TP_ST1 | TP_NDT | - TP_BOM, - "Read error. No data detected. BOM." /* 10 */ }, - { - ~(TP_WRP | TP_EOM), TP_ST0 | TP_FIL, + "Cartridge not in place" /* 2 */ }, + { (unsigned short) ~(TP_ST1 | TP_BOM), (TP_ST0 | TP_WRP), "Write protected cartridge" /* 3 */ }, + { (unsigned short) ~(TP_ST1 | TP_EOR), (TP_ST0 | TP_EOM), "End of media" /* 4 */ }, + { ~TP_WRP, TP_ST0 | TP_UDA | TP_ST1 | TP_BOM, "Read or Write abort. Rewind tape." /* 5 */ }, + { ~TP_WRP, TP_ST0 | TP_UDA, "Read error. Bad block transferred." /* 6 */ }, + { ~TP_WRP, TP_ST0 | TP_UDA | TP_BNL, "Read error. Filler block transferred." /* 7 */ }, + { ~TP_WRP, TP_ST0 | TP_UDA | TP_BNL | TP_ST1 | TP_NDT, "Read error. No data detected." /* 8 */ }, + { ~TP_WRP, TP_ST0 | TP_EOM | TP_UDA | TP_BNL | TP_ST1 | TP_NDT, "Read error. No data detected. EOM." /* 9 */ }, + { ~(TP_WRP | TP_MBD | TP_PAR | TP_EOR), TP_ST0 | TP_UDA | TP_BNL | TP_ST1 | TP_NDT | TP_BOM, "Read error. No data detected. BOM." /* 10 */ }, + { ~(TP_WRP | TP_EOM), TP_ST0 | TP_FIL, /* Status 0x0089 (EOM & FM) is viewed as an FM, * because it can only happen during a read. * EOM is checked separately for an FM condition. */ - "File mark detected" /* 11 */ }, - { - ~(TP_ST0 | TP_CNI | TP_USL | TP_WRP | TP_BOM), - TP_ST1 | TP_ILL, "Illegal command" /* 12 */ }, - { - ~(TP_ST0 | TP_CNI | TP_USL | TP_WRP | TP_BOM), - TP_ST1 | TP_POR, "Reset occurred" /* 13 */ }, - { - ~TP_WRP, TP_ST0 | TP_FIL | TP_MBD, /* NOTE: ST1 not set! */ - "Marginal block detected" /* 14 */ }, - { - ~(TP_ST0 | TP_WRP | TP_EOM | TP_UDA | TP_BNL | TP_FIL | - TP_NDT), TP_ST1 | TP_EOR, - /********** Is the extra TP_NDT really needed Eddy? **********/ - "End of recorded media" /* extra: 15 */ }, + "File mark detected" /* 11 */ }, + { ~(TP_ST0 | TP_CNI | TP_USL | TP_WRP | TP_BOM), TP_ST1 | TP_ILL, "Illegal command" /* 12 */ }, + { ~(TP_ST0 | TP_CNI | TP_USL | TP_WRP | TP_BOM), TP_ST1 | TP_POR, "Reset occurred" /* 13 */ }, + { ~TP_WRP, TP_ST0 | TP_FIL | TP_MBD, /* NOTE: ST1 not set! */ "Marginal block detected" /* 14 */ }, + { ~(TP_ST0 | TP_WRP | TP_EOM | TP_UDA | TP_BNL | TP_FIL | TP_NDT), TP_ST1 | TP_EOR, /********** Is the extra TP_NDT really needed Eddy? **********/ "End of recorded media" /* extra: 15 */ }, /* 15 is returned when SEEKEOD completes successfully */ - { - ~(TP_WRP | TP_ST0), TP_ST1 | TP_BOM, "Beginning of media" /* extra: 16 */ } + { ~(TP_WRP | TP_ST0), TP_ST1 | TP_BOM, "Beginning of media" /* extra: 16 */ } }; #define NR_OF_EXC (sizeof(exception_list)/sizeof(struct exception_list_type)) @@ -333,24 +302,12 @@ static void tpqputs(unsigned long flags, const char *s) } /* tpqputs */ -/* Perform byte order swapping for a 16-bit word. - * - * [FIXME] This should probably be in include/asm/ - * ([FIXME] i486 can do this faster) - */ -static inline void byte_swap_w(volatile unsigned short *w) -{ - int t = *w; - *w = (t >> 8) | ((t & 0xff) << 8); -} - - - /* Init control register bits on interface card. * For Archive, interrupts must be enabled explicitly. * Wangtek interface card requires ONLINE to be set, Archive SC402/SC499R * cards keep it active all the time. */ + static void ifc_init(void) { if (QIC02_TAPE_IFC == WANGTEK) { /* || (QIC02_TAPE_IFC == EVEREX) */ @@ -374,10 +331,8 @@ static void report_qic_exception(unsigned n) tpqputs(TPQD_ALWAYS, "Oops -- report_qic_exception"); n = 0; } - if (TPQDBG(SENSE_TEXT) || n == 0) { - printk(TPQIC02_NAME ": sense: %s\n", - exception_list[n].msg); - } + if (TPQDBG(SENSE_TEXT) || n == 0) + printk(TPQIC02_NAME ": sense: %s\n", exception_list[n].msg); } /* report_qic_exception */ @@ -395,9 +350,7 @@ static int decode_qic_exception_nr(unsigned s) return i; } } - printk(TPQIC02_NAME - ": decode_qic_exception_nr: exception(%x) not recognized\n", - s); + printk(TPQIC02_NAME ": decode_qic_exception_nr: exception(%x) not recognized\n", s); return 0; } /* decode_qic_exception_nr */ @@ -477,15 +430,13 @@ static int tape_reset(int verbose) /* KLUDGE FOR G++ BUG */ { int stat = inb_p(QIC02_STAT_PORT); - status_dead = - ((stat & QIC02_STAT_RESETMASK) != QIC02_STAT_RESETVAL); + status_dead = ((stat & QIC02_STAT_RESETMASK) != QIC02_STAT_RESETVAL); } /* if successful, inb(STAT) returned RESETVAL */ - if (status_dead == YES) { + if (status_dead == YES) printk(TPQIC02_NAME ": reset failed!\n"); - } else if (verbose) { + else if (verbose) printk(TPQIC02_NAME ": reset successful\n"); - } return (status_dead == YES) ? TE_DEAD : TE_OK; } /* tape_reset */ @@ -528,11 +479,10 @@ static int notify_cmd(char cmd, short ignore_ex) * it could be *much* longer! */ while ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) && (--i > 0)) - /*skip */ ; + udelay(1); /* wait for ready */ if (i == 0) { - tpqputs(TPQD_ALWAYS, - "timed out waiting for ready in notify_cmd"); + tpqputs(TPQD_ALWAYS, "timed out waiting for ready in notify_cmd"); status_dead = YES; return TE_TIM; } @@ -541,7 +491,7 @@ static int notify_cmd(char cmd, short ignore_ex) i = TAPE_NOTIFY_TIMEOUT; /* according to the specs this one should never time-out */ while (((inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) == 0) && (--i > 0)) - /*skip */ ; + udelay(1); /* wait for not ready */ if (i == 0) { tpqputs(TPQD_ALWAYS, "timed out waiting for !ready in notify_cmd"); @@ -568,7 +518,7 @@ static int wait_for_ready(time_t timeout) */ spin_t = 50; while (((stat = inb_p(QIC02_STAT_PORT) & QIC02_STAT_MASK) == QIC02_STAT_MASK) && (--spin_t > 0)) - /*SKIP*/; + udelay(1); if ((stat & QIC02_STAT_READY) == 0) return TE_OK; /* covers 99.99% of all calls */ @@ -580,9 +530,11 @@ static int wait_for_ready(time_t timeout) spin_t += jiffies; /* FIXME...*/ - while (((stat = inb_p(QIC02_STAT_PORT) & QIC02_STAT_MASK) == QIC02_STAT_MASK) - && time_before(jiffies, spin_t)) - schedule(); /* don't waste all the CPU time */ + while (((stat = inb_p(QIC02_STAT_PORT) & QIC02_STAT_MASK) == QIC02_STAT_MASK) && time_before(jiffies, spin_t)) + { + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(1); /* don't waste all the CPU time */ + } if ((stat & QIC02_STAT_READY) == 0) return TE_OK; @@ -611,8 +563,7 @@ static int wait_for_ready(time_t timeout) } if ((stat & QIC02_STAT_EXCEPTION) == 0) { - tpqputs(TPQD_ALWAYS, - "exception detected after waiting_for_ready"); + tpqputs(TPQD_ALWAYS, "exception detected after waiting_for_ready"); return TE_EX; } else { return TE_OK; @@ -627,7 +578,6 @@ static int send_qic02_data(char sb[], unsigned size, int ignore_ex) int i, stat; for (i = 0; i < size; i++) { - stat = wait_for_ready(TIM_S); if (stat != TE_OK) return stat; @@ -700,9 +650,12 @@ static int rdstatus(char *stp, unsigned size, char qcmd) * de-schedule immediately, we waste a lot of time because a * task switch is much longer than we usually have to wait here. */ - n = 1000; /* 500 is not enough on a 486/33 */ + n = 700; while ((n > 0) && ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_MASK) == QIC02_STAT_MASK)) + { + udelay(1); n--; /* wait for ready or exception or timeout */ + } if (n == 0) { /* n (above) should be chosen such that on your machine * you rarely ever see the message below, and it should @@ -711,7 +664,10 @@ static int rdstatus(char *stp, unsigned size, char qcmd) /* FIXME */ tpqputs(TPQD_ALWAYS, "waiting looong in rdstatus() -- drive dead?"); while ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_MASK) == QIC02_STAT_MASK) - schedule(); + { + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(1); + } tpqputs(TPQD_ALWAYS, "finished waiting in rdstatus()"); } @@ -737,12 +693,12 @@ static int rdstatus(char *stp, unsigned size, char qcmd) *q = inb_p(QIC02_DATA_PORT); /* read status byte */ if (TP_DIAGS(current_tape_dev)) - printk("[%1d]=0x%x ", q - stp, - (unsigned) (*q) & 0xff); + printk("[%1d]=0x%x ", q - stp, (unsigned) (*q) & 0xff); outb_p(ctlbits | QIC02_CTL_REQUEST, QIC02_CTL_PORT); /* set request */ - while ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) == 0); /* wait for not ready */ + while ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) == 0) + cpu_relax(); /* wait for not ready */ udelay(22); /* delay >20 usec */ @@ -754,7 +710,7 @@ static int rdstatus(char *stp, unsigned size, char qcmd) * My drive doesn't seem to need it here yet, but others do? */ while (inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) - /*skip */ ; + cpu_relax(); /* wait for ready */ if (TP_DIAGS(current_tape_dev)) @@ -772,13 +728,8 @@ static int rdstatus(char *stp, unsigned size, char qcmd) static int get_status(volatile struct tpstatus *stp) { int stat = rdstatus((char *) stp, TPSTATSIZE, QCMD_RD_STAT); -#if defined(__i386__) || defined (__x86_64__) - byte_swap_w(&(stp->dec)); - byte_swap_w(&(stp->urc)); -#else -#warning Undefined architecture - /* should probably swap status bytes #definition */ -#endif + stp->dec = be16_to_cpu(stp->dec); + stp->urc = be16_to_cpu(stp->urc); return stat; } /* get_status */ @@ -823,8 +774,7 @@ static int tp_sense(int ignore) static void finish_rw(int cmd); if (TPQDBG(SENSE_TEXT)) - printk(TPQIC02_NAME ": tp_sense(ignore=0x%x) enter\n", - ignore); + printk(TPQIC02_NAME ": tp_sense(ignore=0x%x) enter\n", ignore); /* sense() is not allowed during a read or write cycle */ if (doing_write == YES) @@ -842,11 +792,8 @@ static int tp_sense(int ignore) if (err & (TP_ST0 | TP_ST1)) printk(TPQIC02_NAME ": tp_sense: status: %x, error count: %d, underruns: %d\n", tperror.exs, tperror.dec, tperror.urc); - else if ((tperror.dec != 0) || (tperror.urc != 0) - || TPQDBG(SENSE_CNTS)) - printk(TPQIC02_NAME - ": tp_sense: no hard errors, soft error count: %d, underruns: %d\n", - tperror.dec, tperror.urc); + else if ((tperror.dec != 0) || (tperror.urc != 0) || TPQDBG(SENSE_CNTS)) + printk(TPQIC02_NAME ": tp_sense: no hard errors, soft error count: %d, underruns: %d\n", tperror.dec, tperror.urc); /* Set generic status. HP-UX defines these, but some extra would * be useful. Problem is to remain compatible. [Do we want to be @@ -909,9 +856,7 @@ static int wait_for_rewind(time_t timeout) stat = inb(QIC02_STAT_PORT) & QIC02_STAT_MASK; if (TPQDBG(REWIND)) - printk(TPQIC02_NAME - ": Waiting for (re-)wind to finish: stat=0x%x\n", - stat); + printk(TPQIC02_NAME ": Waiting for (re-)wind to finish: stat=0x%x\n", stat); stat = wait_for_ready(timeout); @@ -946,13 +891,13 @@ static int ll_do_qic_cmd(int cmd, time_t timeout) stat = TE_OK; } if (stat != TE_OK) { - printk(TPQIC02_NAME ": ll_do_qic_cmd(%x, %ld) failed\n", - cmd, (long) timeout); + printk(TPQIC02_NAME ": ll_do_qic_cmd(%x, %ld) failed\n", cmd, (long) timeout); return -EIO; } #if OBSOLETE /* wait for ready since it may not be active immediately after reading status */ - while ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) != 0); + while ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) != 0) + cpu_relax(); #endif stat = send_qic02_cmd(cmd, timeout, 0); /* (checks for exceptions) */ @@ -982,21 +927,16 @@ static int ll_do_qic_cmd(int cmd, time_t timeout) /* sense() will set eof/eom as required */ if (stat == TE_EX) { if (tp_sense(TP_WRP | TP_BOM | TP_EOM | TP_FIL) != TE_OK) { - printk(TPQIC02_NAME - ": Exception persist in ll_do_qic_cmd[1](%x, %ld)", - cmd, (long) timeout); + printk(TPQIC02_NAME ": Exception persist in ll_do_qic_cmd[1](%x, %ld)", cmd, (long) timeout); status_dead = YES; return -ENXIO; /* if rdstatus fails too, we're in trouble */ } } else if (stat != TE_OK) { - printk(TPQIC02_NAME - ": ll_do_qic_cmd: send_qic02_cmd failed, stat = 0x%x\n", - stat); + printk(TPQIC02_NAME ": ll_do_qic_cmd: send_qic02_cmd failed, stat = 0x%x\n", stat); return -EIO; /*** -EIO is probably not always appropriate */ } - if (timeout == TIM_R) stat = wait_for_rewind(timeout); else @@ -1007,18 +947,14 @@ static int ll_do_qic_cmd(int cmd, time_t timeout) TP_EOR | TP_NDT | TP_UDA | TP_BNL | TP_WRP | TP_BOM | TP_EOM | TP_FIL : TP_WRP | TP_BOM | TP_EOM | TP_FIL)) != TE_OK) { - printk(TPQIC02_NAME - ": Exception persist in ll_do_qic_cmd[2](%x, %ld)\n", - cmd, (long) timeout); + printk(TPQIC02_NAME ": Exception persist in ll_do_qic_cmd[2](%x, %ld)\n", cmd, (long) timeout); if (cmd != QCMD_RD_FM) status_dead = YES; return -ENXIO; /* if rdstatus fails too, we're in trouble */ } } else if (stat != TE_OK) { - printk(TPQIC02_NAME - ": ll_do_qic_cmd %x: wait failed, stat == 0x%x\n", - cmd, stat); + printk(TPQIC02_NAME ": ll_do_qic_cmd %x: wait failed, stat == 0x%x\n", cmd, stat); return -EIO; } return 0; @@ -1052,30 +988,30 @@ static int ll_do_qic_cmd(int cmd, time_t timeout) static void terminate_read(int cmd) { - if (doing_read == YES) { - doing_read = NO; - if (cmd != QCMD_RD_FM) { - /* if the command is a RFM, there is no need to do this - * because a RFM will legally terminate the read-cycle. - */ - tpqputs(TPQD_ALWAYS, "terminating pending read-cycle"); + if (doing_read != YES) + return; + + doing_read = NO; + + if (cmd == QCMD_RD_FM) + return; + + /* if the command is a RFM, there is no need to do this + * because a RFM will legally terminate the read-cycle. + */ + tpqputs(TPQD_ALWAYS, "terminating pending read-cycle"); - /* I'm not too sure about this part -- hhb */ - if (QIC02_TAPE_IFC == MOUNTAIN) { - /* Mountain reference says can terminate by de-asserting online */ - ctlbits &= ~MTN_QIC02_CTL_ONLINE; - } + /* I'm not too sure about this part -- hhb */ + if (QIC02_TAPE_IFC == MOUNTAIN) { + /* Mountain reference says can terminate by de-asserting online */ + ctlbits &= ~MTN_QIC02_CTL_ONLINE; + } - if (tp_sense(TP_FIL | TP_EOM | TP_WRP) != TE_OK) { - tpqputs(TPQD_ALWAYS, - "finish_rw[read1]: ignore the 2 lines above"); - if (is_exception()) { - if (tp_sense - (TP_ILL | TP_FIL | TP_EOM | - TP_WRP) != TE_OK) - tpqputs(TPQD_ALWAYS,"finish_rw[read2]: read cycle error"); - } - } + if (tp_sense(TP_FIL | TP_EOM | TP_WRP) != TE_OK) { + tpqputs(TPQD_ALWAYS, "finish_rw[read1]: ignore the 2 lines above"); + if (is_exception()) { + if (tp_sense(TP_ILL | TP_FIL | TP_EOM | TP_WRP) != TE_OK) + tpqputs(TPQD_ALWAYS,"finish_rw[read2]: read cycle error"); } } } /* terminate_read */ @@ -1085,23 +1021,23 @@ static void terminate_write(int cmd) { int stat; - if (doing_write == YES) { - doing_write = NO; - /* Finish writing by appending a FileMark at the end. */ - if (cmd != QCMD_WRT_FM) { - /* finish off write cycle */ - stat = ll_do_qic_cmd(QCMD_WRT_FM, TIM_M); - if (stat != TE_OK) - tpqputs(TPQD_ALWAYS, - "Couldn't finish write cycle properly"); - (void) tp_sense(0); - } - /* If there is an EOF token waiting to be returned to - * the (writing) application, discard it now. - * We could be at EOT, so don't reset return_write_eof. - */ - reported_write_eof = YES; + if (doing_write != YES) + return; + + doing_write = NO; + /* Finish writing by appending a FileMark at the end. */ + if (cmd != QCMD_WRT_FM) { + /* finish off write cycle */ + stat = ll_do_qic_cmd(QCMD_WRT_FM, TIM_M); + if (stat != TE_OK) + tpqputs(TPQD_ALWAYS, "Couldn't finish write cycle properly"); + (void) tp_sense(0); } + /* If there is an EOF token waiting to be returned to + * the (writing) application, discard it now. + * We could be at EOT, so don't reset return_write_eof. + */ + reported_write_eof = YES; } /* terminate_write */ @@ -1109,8 +1045,7 @@ static void terminate_write(int cmd) static void finish_rw(int cmd) { if (wait_for_ready(TIM_S) != TE_OK) { - tpqputs(TPQD_ALWAYS, - "error: drive not ready in finish_rw() !"); + tpqputs(TPQD_ALWAYS, "error: drive not ready in finish_rw() !"); return; } terminate_read(cmd); @@ -1172,8 +1107,7 @@ static int do_ioctl_cmd(int cmd) case MTBSF: if (TP_HAVE_BSF) { - tpqputs(TPQD_IOCTLS, - "MTBSF backward searching filemark -- optional command"); + tpqputs(TPQD_IOCTLS, "MTBSF backward searching filemark -- optional command"); if ((mode_access == WRITE) && status_bytes_wr) return -EACCES; stat = do_qic_cmd(QCMD_RD_FM_BCK, TIM_F); @@ -1243,7 +1177,7 @@ static int do_ioctl_cmd(int cmd) case MTNOP: tpqputs(TPQD_IOCTLS, "MTNOP setting status only"); - /********** should do `read position' for drives that support it **********/ + /********** should do `read position' for drives that support it **********/ return (tp_sense(-1) == TE_OK) ? 0 : -EIO; /**** check return codes ****/ case MTRETEN: @@ -1377,12 +1311,7 @@ static int do_ioctl_cmd(int cmd) /* dma_transfer(): This routine is called for every 512 bytes to be read * from/written to the tape controller. Speed is important here! * (There must be enough time left for the hd controller!) - * When other devices use DMA they must ensure they use un-interruptible - * double byte accesses to the DMA controller. Floppy.c is ok. - * Must have interrupts disabled when this function is invoked, - * otherwise, the double-byte transfers to the DMA controller will not - * be atomic. That could lead to nasty problems when they are interrupted - * by other DMA interrupt-routines. + * The dma lock protects the DMA controller * * This routine merely does the least possible to keep * the transfers going: @@ -1407,8 +1336,7 @@ static inline void dma_transfer(void) flags = claim_dma_lock(); clear_dma_ff(QIC02_TAPE_DMA); set_dma_mode(QIC02_TAPE_DMA, dma_mode); - set_dma_addr(QIC02_TAPE_DMA, - isa_virt_to_bus(buffaddr) + dma_bytes_done); + set_dma_addr(QIC02_TAPE_DMA, isa_virt_to_bus(buffaddr) + dma_bytes_done); set_dma_count(QIC02_TAPE_DMA, TAPE_BLKSIZE); /* start tape DMA controller */ @@ -1452,13 +1380,12 @@ static int start_dma(short mode, unsigned long bytes_todo) /* assume 'bytes_todo'>0 */ { int stat; - unsigned long flags; tpqputs(TPQD_DEBUG, "start_dma() enter"); TPQDEB( {printk(TPQIC02_NAME ": doing_read==%d, doing_write==%d\n", doing_read, doing_write);}) - dma_bytes_done = 0; + dma_bytes_done = 0; dma_bytes_todo = bytes_todo; status_error = NO; /* dma_mode!=0 indicates that the dma controller is in use */ @@ -1484,17 +1411,14 @@ static int start_dma(short mode, unsigned long bytes_todo) /* TP_CNI should now be handled in open(). -Hennus */ #endif - stat = - tp_sense(((mode == - WRITE) ? 0 : TP_WRP) | TP_BOM | TP_FIL); + stat = tp_sense(((mode == WRITE) ? 0 : TP_WRP) | TP_BOM | TP_FIL); if (stat != TE_OK) return stat; #if OBSOLETE /************* not needed iff rd_status() would wait for ready!!!!!! **********/ if (wait_for_ready(TIM_S) != TE_OK) { /*** not sure this is needed ***/ - tpqputs(TPQD_ALWAYS, - "wait_for_ready failed in start_dma"); + tpqputs(TPQD_ALWAYS, "wait_for_ready failed in start_dma"); return -EIO; } #endif @@ -1507,11 +1431,9 @@ static int start_dma(short mode, unsigned long bytes_todo) /* Tell the controller the data direction */ /* r/w, timeout medium, check exceptions, sets status_cmd_pending. */ - stat = send_qic02_cmd((mode == WRITE) - ? QCMD_WRT_DATA : QCMD_RD_DATA, TIM_M, 0); + stat = send_qic02_cmd((mode == WRITE) ? QCMD_WRT_DATA : QCMD_RD_DATA, TIM_M, 0); if (stat != TE_OK) { - printk(TPQIC02_NAME ": start_dma: init %s failed\n", - (mode == WRITE) ? "write" : "read"); + printk(TPQIC02_NAME ": start_dma: init %s failed\n", (mode == WRITE) ? "write" : "read"); (void) tp_sense(0); return stat; } @@ -1529,10 +1451,8 @@ static int start_dma(short mode, unsigned long bytes_todo) doing_write = YES; break; default: - printk(TPQIC02_NAME - ": requested unknown mode %d\n", mode); - panic(TPQIC02_NAME - ": invalid mode in start_dma()"); + printk(TPQIC02_NAME ": requested unknown mode %d\n", mode); + panic(TPQIC02_NAME ": invalid mode in start_dma()"); } } else if (is_exception()) { @@ -1541,8 +1461,7 @@ static int start_dma(short mode, unsigned long bytes_todo) * * ******** this also affects EOF/EOT handling! ************ */ - tpqputs(TPQD_ALWAYS, - "detected exception in start_dma() while transfer in progress"); + tpqputs(TPQD_ALWAYS, "detected exception in start_dma() while transfer in progress"); status_error = YES; return TE_END; } @@ -1557,10 +1476,7 @@ static int start_dma(short mode, unsigned long bytes_todo) /* initiate first data block read from/write to the tape controller */ - save_flags(flags); - cli(); dma_transfer(); - restore_flags(flags); TPQPUTS("start_dma() end"); return TE_OK; @@ -1594,7 +1510,6 @@ static void end_dma(unsigned long *bytes_done) else if (QIC02_TAPE_IFC == ARCHIVE) outb_p(0, AR_RESET_DMA_PORT); else { /* QIC02_TAPE_IFC == MOUNTAIN */ - /* Clear control bits, de-select ONLINE during tp_sense */ ctlbits &= ~MTN_QIC02_CTL_ONLINE; } @@ -1605,7 +1520,6 @@ static void end_dma(unsigned long *bytes_done) stat = tp_sense((dma_mode == READ) ? TP_WRP : 0); /* no return here -- got to clean up first! */ } else { /* if (QIC02_TAPE_IFC == MOUNTAIN) */ - outb_p(ctlbits, QIC02_CTL_PORT); } @@ -1718,8 +1632,7 @@ static void qic02_tape_interrupt(int irq, void *dev_id, * - something went wrong * So don't continue with the next block. */ - tpqputs(TPQD_ALWAYS, - "isr: exception on tape controller"); + tpqputs(TPQD_ALWAYS, "isr: exception on tape controller"); printk(" status %02x\n", stat); status_error = TE_EX; @@ -1740,16 +1653,14 @@ static void qic02_tape_interrupt(int irq, void *dev_id, */ if (QIC02_TAPE_IFC == WANGTEK) /* I think this is a drive-dependency, not IFC -- hhb */ if (stat & QIC02_STAT_READY) { /* not ready */ - tpqputs(TPQD_ALWAYS, - "isr: ? Tape controller not ready"); + tpqputs(TPQD_ALWAYS, "isr: ? Tape controller not ready"); r = 1; } flags = claim_dma_lock(); if ((i = get_dma_residue(QIC02_TAPE_DMA)) != 0) { - printk(TPQIC02_NAME ": dma_residue == %x !!!\n", - i); + printk(TPQIC02_NAME ": dma_residue == %x !!!\n", i); r = 1; /* big trouble, but can't do much about it... */ } @@ -1774,8 +1685,7 @@ static void qic02_tape_interrupt(int irq, void *dev_id, dma_transfer(); } } else { - printk(TPQIC02_NAME ": Unexpected interrupt, stat == %x\n", - inb(QIC02_STAT_PORT)); + printk(TPQIC02_NAME ": Unexpected interrupt, stat == %x\n", inb(QIC02_STAT_PORT)); } } /* qic02_tape_interrupt */ @@ -1812,10 +1722,8 @@ static void qic02_tape_interrupt(int irq, void *dev_id, * request would return the EOF flag for the previous file. */ -static ssize_t qic02_tape_read(struct file *filp, char *buf, size_t count, - loff_t * ppos) +static ssize_t qic02_tape_read(struct file *filp, char *buf, size_t count, loff_t * ppos) { - int err; kdev_t dev = filp->f_dentry->d_inode->i_rdev; unsigned short flags = filp->f_flags; unsigned long bytes_todo, bytes_done, total_bytes_done = 0; @@ -1827,11 +1735,8 @@ static ssize_t qic02_tape_read(struct file *filp, char *buf, size_t count, } if (TP_DIAGS(current_tape_dev)) - /* can't print a ``long long'' (for filp->f_pos), so chop it */ - printk(TPQIC02_NAME - ": request READ, minor=%x, buf=%p, count=%lx" - ", pos=%lx, flags=%x\n", minor(dev), buf, - (long) count, (unsigned long) filp->f_pos, flags); + printk(TPQIC02_NAME ": request READ, minor=%x, buf=%p, count=%lx, pos=%Lx, flags=%x\n", minor(dev), buf, + (long) count, filp->f_pos, flags); if (count % TAPE_BLKSIZE) { /* Only allow mod 512 bytes at a time. */ tpqputs(TPQD_BLKSZ, "Wrong block size"); @@ -1858,10 +1763,7 @@ static ssize_t qic02_tape_read(struct file *filp, char *buf, size_t count, /* Must ensure that user program sees exactly one EOF token (==0) */ if (return_read_eof == YES) { if (TPQDBG(DEBUG)) { - printk - ("read: return_read_eof==%d, reported_read_eof==%d, total_bytes_done==%lu\n", - return_read_eof, reported_read_eof, - total_bytes_done); + printk("read: return_read_eof==%d, reported_read_eof==%d, total_bytes_done==%lu\n", return_read_eof, reported_read_eof, total_bytes_done); } if (reported_read_eof == NO) { @@ -1897,7 +1799,6 @@ static ssize_t qic02_tape_read(struct file *filp, char *buf, size_t count, } } - /*****************************/ if (bytes_todo == 0) { return total_bytes_done; } @@ -1905,9 +1806,7 @@ static ssize_t qic02_tape_read(struct file *filp, char *buf, size_t count, if (bytes_todo > 0) { /* start reading data */ if (is_exception()) { -/****************************************/ - tpqputs(TPQD_DMAX, - "is_exception() before start_dma()!"); + tpqputs(TPQD_DMAX, "is_exception() before start_dma()!"); } /****************************************************************** @@ -1919,12 +1818,11 @@ static ssize_t qic02_tape_read(struct file *filp, char *buf, size_t count, stat = start_dma(READ, bytes_todo); if (stat == TE_OK) { /* Wait for transfer to complete, interrupt should wake us */ - while (dma_mode != 0) { - sleep_on(&qic02_tape_transfer); - } - if (status_error) { + + wait_event(qic02_tape_transfer, dma_mode != 0); + + if (status_error) return_read_eof = YES; - } } else if (stat != TE_END) { /* should do sense() on error here */ @@ -1938,8 +1836,7 @@ static ssize_t qic02_tape_read(struct file *filp, char *buf, size_t count, } end_dma(&bytes_done); if (bytes_done > bytes_todo) { - tpqputs(TPQD_ALWAYS, - "read: Oops, read more bytes than requested"); + tpqputs(TPQD_ALWAYS, "read: Oops, read more bytes than requested"); return -EIO; } /* copy buffer to user-space in one go */ @@ -1949,15 +1846,12 @@ static ssize_t qic02_tape_read(struct file *filp, char *buf, size_t count, } #if 1 /* Checks Ton's patch below */ - if ((return_read_eof == NO) - && (status_eof_detected == YES)) { - printk(TPQIC02_NAME - ": read(): return_read_eof=%d, status_eof_detected=YES. return_read_eof:=YES\n", + if ((return_read_eof == NO) && (status_eof_detected == YES)) { + printk(TPQIC02_NAME ": read(): return_read_eof=%d, status_eof_detected=YES. return_read_eof:=YES\n", return_read_eof); } #endif - if ((bytes_todo != bytes_done) - || (status_eof_detected == YES)) { + if ((bytes_todo != bytes_done) || (status_eof_detected == YES)) { /* EOF or EOM detected. return EOF next time. */ return_read_eof = YES; } @@ -2006,10 +1900,8 @@ static ssize_t qic02_tape_read(struct file *filp, char *buf, size_t count, * tape device again. The driver will detect an exception status in (No Cartridge) * and force a rewind. After that tar may continue writing. */ -static ssize_t qic02_tape_write(struct file *filp, const char *buf, - size_t count, loff_t * ppos) +static ssize_t qic02_tape_write(struct file *filp, const char *buf, size_t count, loff_t * ppos) { - int err; kdev_t dev = filp->f_dentry->d_inode->i_rdev; unsigned short flags = filp->f_flags; unsigned long bytes_todo, bytes_done, total_bytes_done = 0; @@ -2020,11 +1912,8 @@ static ssize_t qic02_tape_write(struct file *filp, const char *buf, } if (TP_DIAGS(current_tape_dev)) { - /* can't print a ``long long'' (for filp->f_pos), so chop it */ - printk(TPQIC02_NAME ": request WRITE, minor=%x, buf=%p" - ", count=%lx, pos=%lx, flags=%x\n", - minor(dev), buf, - (long) count, (unsigned long) filp->f_pos, flags); + printk(TPQIC02_NAME ": request WRITE, minor=%x, buf=%p, count=%lx, pos=%Lx, flags=%x\n", + minor(dev), buf, (long) count, filp->f_pos, flags); } if (count % TAPE_BLKSIZE) { /* only allow mod 512 bytes at a time */ @@ -2063,8 +1952,7 @@ static ssize_t qic02_tape_write(struct file *filp, const char *buf, if (reported_write_eof == NO) { if (bytes_todo > 0) { - tpqputs(TPQD_ALWAYS, - "partial write"); + tpqputs(TPQD_ALWAYS, "partial write"); /* partial write signals EOF to user program */ } reported_write_eof = YES; @@ -2091,22 +1979,18 @@ static ssize_t qic02_tape_write(struct file *filp, const char *buf, ***** fail and write() will return ENXIO error *****/ if (start_dma(WRITE, bytes_todo) != TE_OK) { - tpqputs(TPQD_ALWAYS, - "write: start_dma() failed"); + tpqputs(TPQD_ALWAYS, "write: start_dma() failed"); /* should do sense() on error here */ return -ENXIO; /*********** FIXTHIS **************/ } /* Wait for write to complete, interrupt should wake us. */ - while ((status_error == 0) && (dma_mode != 0)) { - sleep_on(&qic02_tape_transfer); - } + wait_event(qic02_tape_transfer, (status_error == 0 && dma_mode != 0)); end_dma(&bytes_done); if (bytes_done > bytes_todo) { - tpqputs(TPQD_ALWAYS, - "write: Oops, wrote more bytes than requested"); + tpqputs(TPQD_ALWAYS, "write: Oops, wrote more bytes than requested"); return -EIO; } /* If the dma-transfer was aborted because of an exception, @@ -2123,13 +2007,11 @@ static ssize_t qic02_tape_write(struct file *filp, const char *buf, */ if (status_error) { if (status_eom_detected == YES) { - tpqputs(TPQD_ALWAYS, - "write: EW detected"); + tpqputs(TPQD_ALWAYS, "write: EW detected"); return_write_eof = YES; } else { /* probably EXC_RWA */ - tpqputs(TPQD_ALWAYS, - "write: dma: error in writing"); + tpqputs(TPQD_ALWAYS, "write: dma: error in writing"); return -EIO; } } @@ -2193,8 +2075,7 @@ static int qic02_tape_open_no_use_count(struct inode *inode, if (TP_DIAGS(dev)) { - printk("qic02_tape_open: dev=%s, flags=%x ", - kdevname(dev), flags); + printk("qic02_tape_open: dev=%s, flags=%x ", kdevname(dev), flags); } if (minor(dev) == 255) { /* special case for resetting */ @@ -2210,11 +2091,9 @@ static int qic02_tape_open_no_use_count(struct inode *inode, return 0; } - /* Only one at a time from here on... */ - if (file_count(filp) > 1) { /* filp->f_count==1 for the first open() */ + if(test_and_set_bit(0, &tape_open)) return -EBUSY; - } - + if (status_zombie == YES) { /* no irq/dma/port stuff allocated yet, no reset done * yet, so return until MTSETCONFIG has been done. @@ -2256,13 +2135,13 @@ static int qic02_tape_open_no_use_count(struct inode *inode, if (s == TE_OK) { /* Try to clear cartridge-changed status for Archive-2150L */ if ((tperror.exs & TP_ST0) && (tperror.exs & TP_CNI)) { - s = tp_sense(TP_WRP | TP_EOM | TP_BOM | TP_CNI | - TP_EOR); + s = tp_sense(TP_WRP | TP_EOM | TP_BOM | TP_CNI | TP_EOR); } } if (s != TE_OK) { tpqputs(TPQD_ALWAYS, "open: sense() failed"); + clear_bit(0, &tape_open); return -EIO; } @@ -2272,6 +2151,7 @@ static int qic02_tape_open_no_use_count(struct inode *inode, */ if ((tperror.exs & TP_ST0) && (tperror.exs & TP_CNI)) { tpqputs(TPQD_ALWAYS, "No tape present."); + clear_bit(0, &tape_open); return -EIO; } @@ -2280,15 +2160,13 @@ static int qic02_tape_open_no_use_count(struct inode *inode, */ /* not allowed to do QCMD_DENS_* unless tape is rewound */ - if ((TP_DENS(dev) != 0) - && (TP_DENS(current_tape_dev) != TP_DENS(dev))) { + if ((TP_DENS(dev) != 0) && (TP_DENS(current_tape_dev) != TP_DENS(dev))) { /* force rewind if minor bits have changed, * i.e. user wants to use tape in different format. * [assuming single drive operation] */ if (TP_HAVE_DENS) { - tpqputs(TPQD_REWIND, - "Density minor bits have changed. Forcing rewind."); + tpqputs(TPQD_REWIND, "Density minor bits have changed. Forcing rewind."); need_rewind = YES; } } else { @@ -2318,8 +2196,7 @@ static int qic02_tape_open_no_use_count(struct inode *inode, } else { status_dead = NO; if (tp_sense(~(TP_ST1 | TP_ILL)) != TE_OK) { - tpqputs(TPQD_ALWAYS, - "open: tp_sense() failed\n"); + tpqputs(TPQD_ALWAYS, "open: tp_sense() failed\n"); status_dead = YES; /* try reset next time */ return -EIO; } @@ -2343,12 +2220,10 @@ static int qic02_tape_open_no_use_count(struct inode *inode, dens = TP_DENS(dev); } - if (dens < sizeof(format_names) / sizeof(char *)) { - printk(TPQIC02_NAME ": format: %s%s\n", - (dens != 0) ? "QIC-" : "", format_names[dens]); - } else { + if (dens < sizeof(format_names) / sizeof(char *)) + printk(TPQIC02_NAME ": format: %s%s\n", (dens != 0) ? "QIC-" : "", format_names[dens]); + else tpqputs(TPQD_REWIND, "Wait for retensioning..."); - } switch (TP_DENS(dev)) { case 0: /* Minor 0 is for drives without set-density support */ @@ -2406,12 +2281,12 @@ static int qic02_tape_release(struct inode *inode, struct file *filp) /* Rewind only if minor number requires it AND * read/writes have been done. ************* IS THIS CORRECT?????????? */ - if ((TP_REWCLOSE(dev)) - && (status_bytes_rd | status_bytes_wr)) { + if ((TP_REWCLOSE(dev)) && (status_bytes_rd | status_bytes_wr)) { tpqputs(TPQD_REWIND, "release: Doing rewind..."); (void) do_qic_cmd(QCMD_REWIND, TIM_R); } } + clear_bit(0, &tape_open); return 0; } /* qic02_tape_release */ @@ -2512,47 +2387,32 @@ static int update_ifc_masks(int ifc) /* ioctl allows user programs to rewind the tape and stuff like that */ -static int qic02_tape_ioctl(struct inode *inode, struct file *filp, - unsigned int iocmd, unsigned long ioarg) +static int qic02_tape_ioctl(struct inode *inode, struct file *filp, unsigned int iocmd, unsigned long ioarg) { int error; - int dev_maj = major(inode->i_rdev); int c; struct mtop operation; unsigned char blk_addr[6]; struct mtpos ioctl_tell; - if (TP_DIAGS(current_tape_dev)) { - printk(TPQIC02_NAME ": ioctl(%4x, %4x, %4lx)\n", dev_maj, - iocmd, ioarg); - } + if (TP_DIAGS(current_tape_dev)) + printk(TPQIC02_NAME ": ioctl(%4x, %4lx)\n", iocmd, ioarg); - if (!inode || !ioarg) { + if (!inode) return -EINVAL; - } /* check iocmd first */ - if (dev_maj != QIC02_TAPE_MAJOR) { - printk(TPQIC02_NAME ": Oops! Wrong device?\n"); - /* A panic() would be appropriate here */ - return -ENODEV; - } - c = _IOC_NR(iocmd); #ifdef CONFIG_QIC02_DYNCONF if (c == _IOC_NR(MTIOCGETCONFIG)) { CHECK_IOC_SIZE(mtconfiginfo); - if (copy_to_user - ((char *) ioarg, (char *) &qic02_tape_dynconf, - sizeof(qic02_tape_dynconf))) { + if (copy_to_user((char *) ioarg, (char *) &qic02_tape_dynconf, sizeof(qic02_tape_dynconf))) return -EFAULT; - } return 0; - } else if (c == _IOC_NR(MTIOCSETCONFIG)) { /* One should always do a MTIOCGETCONFIG first, then update * user-settings, then write back with MTIOCSETCONFIG. @@ -2562,24 +2422,19 @@ static int qic02_tape_ioctl(struct inode *inode, struct file *filp, CHECK_IOC_SIZE(mtconfiginfo); - if (!capable(CAP_SYS_ADMIN)) { + if (!capable(CAP_SYS_RAWIO)) return -EPERM; - } - if ((doing_read != NO) || (doing_write != NO)) { + if (doing_read != NO || doing_write != NO) return -EBUSY; - } - if (status_zombie == NO) { + if (status_zombie == NO) qic02_release_resources(); /* and go zombie */ - } /* copy struct from user space to kernel space */ - if (copy_from_user - ((char *) &qic02_tape_dynconf, (char *) ioarg, - sizeof(qic02_tape_dynconf))) { + if (copy_from_user((char *) &qic02_tape_dynconf, (char *) ioarg, sizeof(qic02_tape_dynconf))) return -EFAULT; - } + return update_ifc_masks(qic02_tape_dynconf.ifc_type); } if (status_zombie == YES) { @@ -2591,11 +2446,8 @@ static int qic02_tape_ioctl(struct inode *inode, struct file *filp, CHECK_IOC_SIZE(mtop); /* copy mtop struct from user space to kernel space */ - if (copy_from_user - ((char *) &operation, (char *) ioarg, - sizeof(operation))) { + if (copy_from_user((char *) &operation, (char *) ioarg, sizeof(operation))) return -EFAULT; - } /* ---note: mt_count is signed, negative seeks must be * --- translated to seeks in opposite direction! @@ -2605,42 +2457,32 @@ static int qic02_tape_ioctl(struct inode *inode, struct file *filp, * --- tape at the beginning of the current file. */ - if (TP_DIAGS(current_tape_dev)) { - printk("OP op=%4x, count=%4x\n", operation.mt_op, - operation.mt_count); - } + if (TP_DIAGS(current_tape_dev)) + printk("OP op=%4x, count=%4x\n", operation.mt_op, operation.mt_count); - if (operation.mt_count < 0) { - tpqputs(TPQD_ALWAYS, - "Warning: negative mt_count ignored"); - } + if (operation.mt_count < 0) + tpqputs(TPQD_ALWAYS, "Warning: negative mt_count ignored"); ioctl_status.mt_resid = operation.mt_count; if (operation.mt_op == MTSEEK) { - if (!TP_HAVE_SEEK) { + if (!TP_HAVE_SEEK) return -ENOTTY; - } - seek_addr_buf[0] = - (operation.mt_count >> 16) & 0xff; - seek_addr_buf[1] = - (operation.mt_count >> 8) & 0xff; + seek_addr_buf[0] = (operation.mt_count >> 16) & 0xff; + seek_addr_buf[1] = (operation.mt_count >> 8) & 0xff; seek_addr_buf[2] = (operation.mt_count) & 0xff; - if (operation.mt_count >> 24) { + if (operation.mt_count >> 24) return -EINVAL; - } - if ((error = do_ioctl_cmd(operation.mt_op)) != 0) { + + if ((error = do_ioctl_cmd(operation.mt_op)) != 0) return error; - } ioctl_status.mt_resid = 0; } else { while (operation.mt_count > 0) { operation.mt_count--; - if ((error = - do_ioctl_cmd(operation.mt_op)) != 0) { + if ((error = do_ioctl_cmd(operation.mt_op)) != 0) return error; - } ioctl_status.mt_resid = operation.mt_count; } @@ -2648,9 +2490,8 @@ static int qic02_tape_ioctl(struct inode *inode, struct file *filp, return 0; } else if (c == _IOC_NR(MTIOCGET)) { - if (TP_DIAGS(current_tape_dev)) { + if (TP_DIAGS(current_tape_dev)) printk("GET "); - } CHECK_IOC_SIZE(mtget); @@ -2660,55 +2501,75 @@ static int qic02_tape_ioctl(struct inode *inode, struct file *filp, */ /* copy results to user space */ - if (copy_to_user - ((char *) ioarg, (char *) &ioctl_status, - sizeof(ioctl_status))) { + if (copy_to_user((char *) ioarg, (char *) &ioctl_status, sizeof(ioctl_status))) return -EFAULT; - } return 0; } else if (TP_HAVE_TELL && (c == _IOC_NR(MTIOCPOS))) { - if (TP_DIAGS(current_tape_dev)) { + if (TP_DIAGS(current_tape_dev)) printk("POS "); - } CHECK_IOC_SIZE(mtpos); tpqputs(TPQD_IOCTLS, "MTTELL reading block address"); - if ((doing_read == YES) || (doing_write == YES)) { + if (doing_read == YES || doing_write == YES) finish_rw(AR_QCMDV_TELL_BLK); - } - c = rdstatus((char *) blk_addr, sizeof(blk_addr), - AR_QCMDV_TELL_BLK); - if (c != TE_OK) { + c = rdstatus((char *) blk_addr, sizeof(blk_addr), AR_QCMDV_TELL_BLK); + if (c != TE_OK) return -EIO; - } - ioctl_tell.mt_blkno = - (blk_addr[3] << 16) | (blk_addr[4] << 8) | blk_addr[5]; + ioctl_tell.mt_blkno = (blk_addr[3] << 16) | (blk_addr[4] << 8) | blk_addr[5]; /* copy results to user space */ - if (copy_to_user - ((char *) ioarg, (char *) &ioctl_tell, - sizeof(ioctl_tell))) { + if (copy_to_user((char *) ioarg, (char *) &ioctl_tell, sizeof(ioctl_tell))) return -EFAULT; - } return 0; - } else { + } else return -ENOTTY; /* Other cmds not supported. */ - } } /* qic02_tape_ioctl */ +static ssize_t qic02_do_tape_read(struct file *filp, char *buf, size_t count, loff_t * ppos) +{ + int err; + + down(&tape_op); + err = qic02_tape_read(filp, buf, count, ppos); + up(&tape_op); + + return err; +} + +static ssize_t qic02_do_tape_write(struct file *filp, const char *buf, size_t count, loff_t * ppos) +{ + int err; + + down(&tape_op); + err = qic02_tape_write(filp, buf, count, ppos); + up(&tape_op); + + return err; +} + +static int qic02_do_tape_ioctl(struct inode *inode, struct file *filp, unsigned int iocmd, unsigned long ioarg) +{ + int err; + + down(&tape_op); + err = qic02_tape_ioctl(inode, filp, iocmd, ioarg); + up(&tape_op); + + return err; +} /* These are (most) of the interface functions: */ static struct file_operations qic02_tape_fops = { owner:THIS_MODULE, llseek:no_llseek, - read:qic02_tape_read, - write:qic02_tape_write, - ioctl:qic02_tape_ioctl, + read:qic02_do_tape_read, + write:qic02_do_tape_write, + ioctl:qic02_do_tape_ioctl, open:qic02_tape_open, release:qic02_tape_release, }; @@ -2719,10 +2580,8 @@ static void qic02_release_resources(void) free_irq(QIC02_TAPE_IRQ, NULL); free_dma(QIC02_TAPE_DMA); release_region(QIC02_TAPE_PORT, QIC02_TAPE_PORT_RANGE); - if (buffaddr) { - free_pages((unsigned long) buffaddr, - get_order(TPQBUF_SIZE)); - } + if (buffaddr) + free_pages((unsigned long) buffaddr, get_order(TPQBUF_SIZE)); buffaddr = 0; /* Better to cause a panic than overwite someone else */ status_zombie = YES; } /* qic02_release_resources */ @@ -2733,49 +2592,35 @@ static int qic02_get_resources(void) /* First perform some checks. If one of them fails, * the tape driver will not be registered to the system. */ - if (QIC02_TAPE_IRQ > 16) { - tpqputs(TPQD_ALWAYS, "Bogus interrupt number."); - return -ENXIO; - } /* for DYNCONF, allocating IO, DMA and IRQ should not be done until * the config parameters have been set using MTSETCONFIG. */ /* Grab the IO region. */ - if (!request_region(QIC02_TAPE_PORT, QIC02_TAPE_PORT_RANGE, - TPQIC02_NAME)) { - printk(TPQIC02_NAME - ": IO space at 0x%x [%d ports] already reserved\n", + if (!request_region(QIC02_TAPE_PORT, QIC02_TAPE_PORT_RANGE, TPQIC02_NAME)) { + printk(TPQIC02_NAME ": IO space at 0x%x [%d ports] already reserved\n", QIC02_TAPE_PORT, QIC02_TAPE_PORT_RANGE); return -ENXIO; } /* get IRQ */ - if (request_irq - (QIC02_TAPE_IRQ, qic02_tape_interrupt, SA_INTERRUPT, "QIC-02", - NULL)) { - printk(TPQIC02_NAME - ": can't allocate IRQ%d for QIC-02 tape\n", - QIC02_TAPE_IRQ); + if (request_irq(QIC02_TAPE_IRQ, qic02_tape_interrupt, SA_INTERRUPT, "QIC-02", NULL)) { + printk(TPQIC02_NAME ": can't allocate IRQ%d for QIC-02 tape\n", QIC02_TAPE_IRQ); release_region(QIC02_TAPE_PORT, QIC02_TAPE_PORT_RANGE); return -EBUSY; } /* After IRQ, allocate DMA channel */ if (request_dma(QIC02_TAPE_DMA, "QIC-02")) { - printk(TPQIC02_NAME - ": can't allocate DMA%d for QIC-02 tape\n", - QIC02_TAPE_DMA); + printk(TPQIC02_NAME ": can't allocate DMA%d for QIC-02 tape\n", QIC02_TAPE_DMA); free_irq(QIC02_TAPE_IRQ, NULL); release_region(QIC02_TAPE_PORT, QIC02_TAPE_PORT_RANGE); return -EBUSY; } /* Setup the page-address for the dma transfer. */ - buffaddr = - (void *) __get_dma_pages(GFP_KERNEL, get_order(TPQBUF_SIZE)); - + buffaddr = (void *) __get_dma_pages(GFP_KERNEL, get_order(TPQBUF_SIZE)); if (!buffaddr) { qic02_release_resources(); return -EBUSY; /* Not ideal, EAGAIN perhaps? */ @@ -2783,8 +2628,7 @@ static int qic02_get_resources(void) memset(buffaddr, 0, TPQBUF_SIZE); - printk(TPQIC02_NAME - ": Settings: IRQ %d, DMA %d, IO 0x%x, IFC %s\n", + printk(TPQIC02_NAME ": Settings: IRQ %d, DMA %d, IO 0x%x, IFC %s\n", QIC02_TAPE_IRQ, QIC02_TAPE_DMA, ((QIC02_TAPE_IFC == ARCHIVE) || (QIC02_TAPE_IFC == MOUNTAIN)) ? @@ -2794,11 +2638,9 @@ static int qic02_get_resources(void) ARCHIVE) ? "Archive" : "Wangtek")); - if (tape_reset(0) != TE_OK - || tp_sense(TP_WRP | TP_POR | TP_CNI) != TE_OK) { + if (tape_reset(0) != TE_OK || tp_sense(TP_WRP | TP_POR | TP_CNI) != TE_OK) { /* No drive detected, so vanish */ - tpqputs(TPQD_ALWAYS, - "No drive detected -- releasing IO/IRQ/DMA."); + tpqputs(TPQD_ALWAYS, "No drive detected -- releasing IO/IRQ/DMA."); status_dead = YES; qic02_release_resources(); return -EIO; @@ -2812,13 +2654,11 @@ static int qic02_get_resources(void) int __init qic02_tape_init(void) { if (TPSTATSIZE != 6) { - printk(TPQIC02_NAME - ": internal error: tpstatus struct incorrect!\n"); + printk(TPQIC02_NAME ": internal error: tpstatus struct incorrect!\n"); return -ENODEV; } if ((TPQBUF_SIZE < 512) || (TPQBUF_SIZE >= 0x10000)) { - printk(TPQIC02_NAME - ": internal error: DMA buffer size out of range\n"); + printk(TPQIC02_NAME ": internal error: DMA buffer size out of range\n"); return -ENODEV; } @@ -2837,19 +2677,16 @@ int __init qic02_tape_init(void) # error # endif rcs_revision, rcs_date); - if (qic02_get_resources()) { + if (qic02_get_resources()) return -ENODEV; - } #else - printk(TPQIC02_NAME ": Runtime config, %s, %s\n", - rcs_revision, rcs_date); + printk(TPQIC02_NAME ": Runtime config, %s, %s\n", rcs_revision, rcs_date); #endif printk(TPQIC02_NAME ": DMA buffers: %u blocks\n", NR_BLK_BUF); /* If we got this far, install driver functions */ - if (register_chrdev - (QIC02_TAPE_MAJOR, TPQIC02_NAME, &qic02_tape_fops)) { - printk(TPQIC02_NAME ": Unable to get chrdev major %d\n", - QIC02_TAPE_MAJOR); + if (register_chrdev(QIC02_TAPE_MAJOR, TPQIC02_NAME, &qic02_tape_fops)) + { + printk(TPQIC02_NAME ": Unable to get chrdev major %d\n", QIC02_TAPE_MAJOR); #ifndef CONFIG_QIC02_DYNCONF qic02_release_resources(); #endif @@ -2894,11 +2731,9 @@ int __init qic02_tape_init(void) tp_timer.function = qic02_tape_times_out; #ifndef CONFIG_QIC02_DYNCONF - if (tape_reset(0) != TE_OK - || tp_sense(TP_WRP | TP_POR | TP_CNI) != TE_OK) { + if (tape_reset(0) != TE_OK || tp_sense(TP_WRP | TP_POR | TP_CNI) != TE_OK) { /* No drive detected, so vanish */ - tpqputs(TPQD_ALWAYS, - "No drive detected -- driver going on vacation..."); + tpqputs(TPQD_ALWAYS, "No drive detected -- driver going on vacation..."); qic02_release_resources(); status_dead = YES; return -ENODEV; @@ -2927,10 +2762,10 @@ int __init qic02_tape_init(void) void cleanup_module(void) { - if (status_zombie == NO) { - qic02_release_resources(); - } unregister_chrdev(QIC02_TAPE_MAJOR, TPQIC02_NAME); + if (status_zombie == NO) + qic02_release_resources(); + devfs_find_and_unregister(NULL, "ntpqic11", QIC02_TAPE_MAJOR, 2, DEVFS_SPECIAL_CHR, 0); devfs_find_and_unregister(NULL, "tpqic11", QIC02_TAPE_MAJOR, 3, diff --git a/drivers/char/vme_scc.c b/drivers/char/vme_scc.c index 253640918960..3002e579ae3a 100644 --- a/drivers/char/vme_scc.c +++ b/drivers/char/vme_scc.c @@ -29,7 +29,6 @@ #include <linux/fcntl.h> #include <linux/major.h> #include <linux/delay.h> -#include <linux/tqueue.h> #include <linux/version.h> #include <linux/slab.h> #include <linux/miscdevice.h> diff --git a/drivers/ide/Config.in b/drivers/ide/Config.in index 2d66de4cb6c2..8ef894e663ef 100644 --- a/drivers/ide/Config.in +++ b/drivers/ide/Config.in @@ -99,12 +99,12 @@ if [ "$CONFIG_BLK_DEV_IDE" != "n" ]; then if [ "$CONFIG_SIBYTE_SWARM" = "y" ]; then bool ' SWARM onboard IDE support' CONFIG_BLK_DEV_IDE_SWARM fi - if [ "$CONFIG_ARCH_ACORN" = "y" ]; then - dep_bool ' ICS IDE interface support' CONFIG_BLK_DEV_IDE_ICSIDE $CONFIG_ARCH_ACORN - dep_bool ' ICS DMA support' CONFIG_BLK_DEV_IDEDMA_ICS $CONFIG_BLK_DEV_IDE_ICSIDE - dep_bool ' Use ICS DMA by default' CONFIG_IDEDMA_ICS_AUTO $CONFIG_BLK_DEV_IDEDMA_ICS + if [ "$CONFIG_ARM" = "y" ]; then + dep_tristate ' ICS IDE interface support' CONFIG_BLK_DEV_IDE_ICSIDE $CONFIG_ARCH_ACORN + dep_mbool ' ICS DMA support' CONFIG_BLK_DEV_IDEDMA_ICS $CONFIG_BLK_DEV_IDE_ICSIDE + dep_mbool ' Use ICS DMA by default' CONFIG_IDEDMA_ICS_AUTO $CONFIG_BLK_DEV_IDEDMA_ICS define_bool CONFIG_BLK_DEV_IDEDMA $CONFIG_BLK_DEV_IDEDMA_ICS - dep_bool ' RapIDE interface support' CONFIG_BLK_DEV_IDE_RAPIDE $CONFIG_ARCH_ACORN + dep_tristate ' RapIDE interface support' CONFIG_BLK_DEV_IDE_RAPIDE $CONFIG_ARCH_ACORN fi if [ "$CONFIG_AMIGA" = "y" ]; then dep_bool ' Amiga Gayle IDE interface support' CONFIG_BLK_DEV_GAYLE $CONFIG_AMIGA diff --git a/drivers/ide/arm/icside.c b/drivers/ide/arm/icside.c index cc5a6366653b..c83081e75ff7 100644 --- a/drivers/ide/arm/icside.c +++ b/drivers/ide/arm/icside.c @@ -1,7 +1,7 @@ /* * linux/drivers/ide/icside.c * - * Copyright (c) 1996,1997 Russell King. + * Copyright (c) 1996-2002 Russell King. * * Changelog: * 08-Jun-1996 RMK Created @@ -20,25 +20,13 @@ #include <linux/hdreg.h> #include <linux/ide.h> #include <linux/pci.h> +#include <linux/device.h> #include <linux/init.h> #include <asm/dma.h> #include <asm/ecard.h> #include <asm/io.h> -#include "ide-noise.h" - -/* - * FIXME: We want to drop the the MACRO CRAP! - * - * ec->iops->in{b/w/l} - * ec->iops->in{b/w/l}_p - * ec->iops->out{b/w/l} - * ec->iops->out{b/w/l}_p - * - * the new core supports clean MMIO calls and other goodies - */ - /* * Maximum number of interfaces per card */ @@ -86,10 +74,10 @@ static struct cardinfo icside_cardinfo_v6_2 = { ICS_ARCIN_V6_IDESTEPPING }; -static const card_ids icside_cids[] = { - { MANU_ICS, PROD_ICS_IDE }, - { MANU_ICS2, PROD_ICS2_IDE }, - { 0xffff, 0xffff } +struct icside_state { + unsigned int channel; + unsigned int enabled; + unsigned int irq_port; }; typedef enum { @@ -133,10 +121,21 @@ static const expansioncard_ops_t icside_ops_arcin_v5 = { */ static void icside_irqenable_arcin_v6 (struct expansion_card *ec, int irqnr) { - unsigned int ide_base_port = (unsigned int)ec->irq_data; + struct icside_state *state = ec->irq_data; + unsigned int base = state->irq_port; + + state->enabled = 1; - outb(0, ide_base_port + ICS_ARCIN_V6_INTROFFSET_1); - outb(0, ide_base_port + ICS_ARCIN_V6_INTROFFSET_2); + switch (state->channel) { + case 0: + outb(0, base + ICS_ARCIN_V6_INTROFFSET_1); + inb(base + ICS_ARCIN_V6_INTROFFSET_2); + break; + case 1: + outb(0, base + ICS_ARCIN_V6_INTROFFSET_2); + inb(base + ICS_ARCIN_V6_INTROFFSET_1); + break; + } } /* Prototype: icside_irqdisable_arcin_v6 (struct expansion_card *ec, int irqnr) @@ -144,10 +143,12 @@ static void icside_irqenable_arcin_v6 (struct expansion_card *ec, int irqnr) */ static void icside_irqdisable_arcin_v6 (struct expansion_card *ec, int irqnr) { - unsigned int ide_base_port = (unsigned int)ec->irq_data; + struct icside_state *state = ec->irq_data; + + state->enabled = 0; - inb(ide_base_port + ICS_ARCIN_V6_INTROFFSET_1); - inb(ide_base_port + ICS_ARCIN_V6_INTROFFSET_2); + inb (state->irq_port + ICS_ARCIN_V6_INTROFFSET_1); + inb (state->irq_port + ICS_ARCIN_V6_INTROFFSET_2); } /* Prototype: icside_irqprobe(struct expansion_card *ec) @@ -155,10 +156,10 @@ static void icside_irqdisable_arcin_v6 (struct expansion_card *ec, int irqnr) */ static int icside_irqpending_arcin_v6(struct expansion_card *ec) { - unsigned int ide_base_port = (unsigned int)ec->irq_data; + struct icside_state *state = ec->irq_data; - return inb(ide_base_port + ICS_ARCIN_V6_INTRSTAT_1) & 1 || - inb(ide_base_port + ICS_ARCIN_V6_INTRSTAT_2) & 1; + return inb(state->irq_port + ICS_ARCIN_V6_INTRSTAT_1) & 1 || + inb(state->irq_port + ICS_ARCIN_V6_INTRSTAT_2) & 1; } static const expansioncard_ops_t icside_ops_arcin_v6 = { @@ -221,6 +222,39 @@ static iftype_t __init icside_identifyif (struct expansion_card *ec) return iftype; } +/* + * Handle routing of interrupts. This is called before + * we write the command to the drive. + */ +static void icside_maskproc(ide_drive_t *drive, int mask) +{ + ide_hwif_t *hwif = HWIF(drive); + struct icside_state *state = hwif->hw.priv; + unsigned long flags; + + local_irq_save(flags); + + state->channel = hwif->channel; + + if (state->enabled && !mask) { + switch (hwif->channel) { + case 0: + outb(0, state->irq_port + ICS_ARCIN_V6_INTROFFSET_1); + inb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_2); + break; + case 1: + outb(0, state->irq_port + ICS_ARCIN_V6_INTROFFSET_2); + inb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_1); + break; + } + } else { + inb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_2); + inb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_1); + } + + local_irq_restore(flags); +} + #ifdef CONFIG_BLK_DEV_IDEDMA_ICS /* * SG-DMA support. @@ -234,125 +268,119 @@ static iftype_t __init icside_identifyif (struct expansion_card *ec) #define NR_ENTRIES 256 #define TABLE_SIZE (NR_ENTRIES * 8) -static int ide_build_sglist(ide_hwif_t *hwif, struct request *rq) +static void ide_build_sglist(ide_drive_t *drive, struct request *rq) { - struct buffer_head *bh; + ide_hwif_t *hwif = drive->hwif; struct scatterlist *sg = hwif->sg_table; - int nents = 0; + int nents; + + BUG_ON(hwif->sg_dma_active); + + if (rq->flags & REQ_DRIVE_TASKFILE) { + ide_task_t *args = rq->special; + + if (args->command_type == IDE_DRIVE_TASK_RAW_WRITE) + hwif->sg_dma_direction = PCI_DMA_TODEVICE; + else + hwif->sg_dma_direction = PCI_DMA_FROMDEVICE; + + memset(sg, 0, sizeof(*sg)); + sg->page = virt_to_page(rq->buffer); + sg->offset = ((unsigned long)rq->buffer) & ~PAGE_MASK; + sg->length = rq->nr_sectors * SECTOR_SIZE; + nents = 1; + } else { + nents = blk_rq_map_sg(&drive->queue, rq, sg); + + if (rq_data_dir(rq) == READ) + hwif->sg_dma_direction = PCI_DMA_FROMDEVICE; + else + hwif->sg_dma_direction = PCI_DMA_TODEVICE; + } - if (rq->cmd == READ) - hwif->sg_dma_direction = PCI_DMA_FROMDEVICE; - else - hwif->sg_dma_direction = PCI_DMA_TODEVICE; - bh = rq->bh; - do { - unsigned char *virt_addr = bh->b_data; - unsigned int size = bh->b_size; - - while ((bh = bh->b_reqnext) != NULL) { - if ((virt_addr + size) != (unsigned char *)bh->b_data) - break; - size += bh->b_size; - } - memset(&sg[nents], 0, sizeof(*sg)); - sg[nents].address = virt_addr; - sg[nents].length = size; - nents++; - } while (bh != NULL); + nents = pci_map_sg(NULL, sg, nents, hwif->sg_dma_direction); - return pci_map_sg(NULL, sg, nents, hwif->sg_dma_direction); + hwif->sg_nents = nents; } -static int -icside_build_dmatable(ide_drive_t *drive, int reading) -{ - return HWIF(drive)->sg_nents = ide_build_sglist(HWIF(drive), HWGROUP(drive)->rq); -} -/* Teardown mappings after DMA has completed. */ -static void icside_destroy_dmatable(ide_drive_t *drive) +/* + * Configure the IOMD to give the appropriate timings for the transfer + * mode being requested. We take the advice of the ATA standards, and + * calculate the cycle time based on the transfer mode, and the EIDE + * MW DMA specs that the drive provides in the IDENTIFY command. + * + * We have the following IOMD DMA modes to choose from: + * + * Type Active Recovery Cycle + * A 250 (250) 312 (550) 562 (800) + * B 187 250 437 + * C 125 (125) 125 (375) 250 (500) + * D 62 125 187 + * + * (figures in brackets are actual measured timings) + * + * However, we also need to take care of the read/write active and + * recovery timings: + * + * Read Write + * Mode Active -- Recovery -- Cycle IOMD type + * MW0 215 50 215 480 A + * MW1 80 50 50 150 C + * MW2 70 25 25 120 C + */ +static int icside_set_speed(ide_drive_t *drive, u8 xfer_mode) { - struct scatterlist *sg = HWIF(drive)->sg_table; - int nents = HWIF(drive)->sg_nents; - - pci_unmap_sg(NULL, sg, nents, HWIF(drive)->sg_dma_direction); -} + int on = 0, cycle_time = 0, use_dma_info = 0; -static int -icside_config_if(ide_drive_t *drive, int xfer_mode) -{ - int func = ide_dma_off; + /* + * Limit the transfer speed to MW_DMA_2. + */ + if (xfer_mode > XFER_MW_DMA_2) + xfer_mode = XFER_MW_DMA_2; switch (xfer_mode) { case XFER_MW_DMA_2: - /* - * The cycle time is limited to 250ns by the r/w - * pulse width (90ns), however we should still - * have a maximum burst transfer rate of 8MB/s. - */ - drive->drive_data = 250; + cycle_time = 250; + use_dma_info = 1; break; case XFER_MW_DMA_1: - drive->drive_data = 250; + cycle_time = 250; + use_dma_info = 1; break; case XFER_MW_DMA_0: - drive->drive_data = 480; + cycle_time = 480; break; - default: - drive->drive_data = 0; + case XFER_SW_DMA_2: + case XFER_SW_DMA_1: + case XFER_SW_DMA_0: + cycle_time = 480; break; } - if (!drive->init_speed) - drive->init_speed = (u8) xfer_mode; + /* + * If we're going to be doing MW_DMA_1 or MW_DMA_2, we should + * take care to note the values in the ID... + */ + if (use_dma_info && drive->id->eide_dma_time > cycle_time) + cycle_time = drive->id->eide_dma_time; + + drive->drive_data = cycle_time; - if (drive->drive_data && - ide_config_drive_speed(drive, (u8) xfer_mode) == 0) - func = ide_dma_on; + if (cycle_time && ide_config_drive_speed(drive, xfer_mode) == 0) + on = 1; else drive->drive_data = 480; printk("%s: %s selected (peak %dMB/s)\n", drive->name, ide_xfer_verbose(xfer_mode), 2000 / drive->drive_data); - drive->current_speed = (u8) xfer_mode; + drive->current_speed = xfer_mode; - return func; -} - -static int -icside_set_speed(ide_drive_t *drive, u8 speed) -{ - return icside_config_if(drive, speed); -} - -/* - * dma_intr() is the handler for disk read/write DMA interrupts - */ -static ide_startstop_t icside_dmaintr(ide_drive_t *drive) -{ - u8 dma_stat = HWIF(drive)->ide_dma_end(drive); - /* get drive status */ - u8 stat = HWIF(drive)->INB(IDE_STATUS_REG); - int i; - - if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) { - if (!dma_stat) { - struct request *rq = HWGROUP(drive)->rq; - rq = HWGROUP(drive)->rq; - for (i = rq->nr_sectors; i > 0;) { - i -= rq->current_nr_sectors; - DRIVER(drive)->end_request(drive, 1); - } - return ide_stopped; - } - printk("%s: dma_intr: bad DMA status (dma_stat=%x)\n", - drive->name, dma_stat); - } - return DRIVER(drive)->error(drive, "dma_intr", stat); + return on; } /* @@ -361,16 +389,16 @@ static ide_startstop_t icside_dmaintr(ide_drive_t *drive) * This should be defined in one place only. */ struct drive_list_entry { - char * id_model; - char * id_firmware; + const char * id_model; + const char * id_firmware; }; -static struct drive_list_entry drive_whitelist [] = { +static const struct drive_list_entry drive_whitelist [] = { { "Micropolis 2112A", "ALL" }, { "CONNER CTMA 4000", "ALL" }, { "CONNER CTT8000-A", "ALL" }, { "ST34342A", "ALL" }, - { NULL, 0 } + { NULL, NULL } }; static struct drive_list_entry drive_blacklist [] = { @@ -407,10 +435,11 @@ static struct drive_list_entry drive_blacklist [] = { { "PLEXTOR CD-R PX-W8432T", "ALL" }, { "ATAPI CD-ROM DRIVE 40X MAXIMUM", "ALL" }, { "_NEC DV5800A", "ALL" }, - { NULL, 0 } + { NULL, NULL } }; -static int in_drive_list(struct hd_driveid *id, struct drive_list_entry * drive_table) +static int +in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table) { for ( ; drive_table->id_model ; drive_table++) if ((!strcmp(drive_table->id_model, id->model)) && @@ -420,41 +449,52 @@ static int in_drive_list(struct hd_driveid *id, struct drive_list_entry * drive_ return 0; } -/* - * For both Blacklisted and Whitelisted drives. - * This is setup to be called as an extern for future support - * to other special driver code. - */ -int check_drive_good_lists (ide_drive_t *drive) +static int icside_dma_host_off(ide_drive_t *drive) { - struct hd_driveid *id = drive->id; - return in_drive_list(id, drive_whitelist); + return 0; } -int check_drive_bad_lists (ide_drive_t *drive) +static int icside_dma_off_quietly(ide_drive_t *drive) { - struct hd_driveid *id = drive->id; - int blacklist = in_drive_list(id, drive_blacklist); - if (blacklist) - printk("%s: Disabling DMA for %s\n", drive->name, id->model); - return(blacklist); + drive->using_dma = 0; + return icside_dma_host_off(drive); +} + +static int icside_dma_off(ide_drive_t *drive) +{ + printk("%s: DMA disabled\n", drive->name); + return icside_dma_off_quietly(drive); +} + +static int icside_dma_host_on(ide_drive_t *drive) +{ + return 0; +} + +static int icside_dma_on(ide_drive_t *drive) +{ + drive->using_dma = 1; + return icside_dma_host_on(drive); } -int icside_dma_check(ide_drive_t *drive) +static int icside_dma_check(ide_drive_t *drive) { struct hd_driveid *id = drive->id; ide_hwif_t *hwif = HWIF(drive); - int autodma = hwif->autodma; int xfer_mode = XFER_PIO_2; + int on; - if (!id || !(id->capability & 1) || !autodma) - return hwif->ide_dma_off_quietly(drive); + if (!id || !(id->capability & 1) || !hwif->autodma) + goto out; /* * Consult the list of known "bad" drives */ - if (check_drive_bad_lists(drive)) - return hwif->ide_dma_off(drive); + if (in_drive_list(id, drive_blacklist)) { + printk("%s: Disabling DMA for %s (blacklisted)\n", + drive->name, id->model); + goto out; + } /* * Enable DMA on any drive that has multiword DMA @@ -473,192 +513,249 @@ int icside_dma_check(ide_drive_t *drive) /* * Consult the list of known "good" drives */ - if (check_drive_good_lists(drive)) { + if (in_drive_list(id, drive_whitelist)) { if (id->eide_dma_time > 150) goto out; xfer_mode = XFER_MW_DMA_1; } out: - if (icside_config_if(drive, xfer_mode)) - return hwif->ide_dma_on(drive); - return hwif->ide_dma_off(drive); -} + on = icside_set_speed(drive, xfer_mode); -int icside_dma_verbose(ide_drive_t *drive) -{ - printk(", DMA"); - return 1; + if (on) + return icside_dma_on(drive); + else + return icside_dma_off_quietly(drive); } -int icside_dma_test_irq(ide_drive_t *drive) +static int icside_dma_end(ide_drive_t *drive) { ide_hwif_t *hwif = HWIF(drive); - return inb((unsigned long)hwif->hw.priv) & 1; -} -int icside_dma_host_off(ide_drive_t *drive) -{ - return 0; -} + drive->waiting_for_dma = 0; -int icside_dma_off_quietly(ide_drive_t *drive) -{ - drive->using_dma = 0; - return icside_dma_host_off(drive); -} + disable_dma(hwif->hw.dma); -int icside_dma_off(ide_drive_t *drive) -{ - printk("%s: DMA disabled\n", drive->name); - return icside_dma_off_quietly(drive); -} + /* Teardown mappings after DMA has completed. */ + pci_unmap_sg(NULL, hwif->sg_table, hwif->sg_nents, + hwif->sg_dma_direction); -int icside_dma_host_on(ide_drive_t *drive) -{ - return 0; -} + hwif->sg_dma_active = 0; -int icside_dma_on(ide_drive_t *drive) -{ - drive->using_dma = 1; - return icside_dma_host_on(drive); + return get_dma_residue(hwif->hw.dma) != 0; } -int icside_dma_begin(ide_drive_t *drive) +static int icside_dma_begin(ide_drive_t *drive) { ide_hwif_t *hwif = HWIF(drive); + /* We can not enable DMA on both channels simultaneously. */ + BUG_ON(dma_channel_active(hwif->hw.dma)); enable_dma(hwif->hw.dma); return 0; } -int icside_dma_end(ide_drive_t *drive) +static int icside_dma_count(ide_drive_t *drive) { - ide_hwif_t *hwif = HWIF(drive); - - drive->waiting_for_dma = 0; - disable_dma(hwif->hw.dma); - icside_destroy_dmatable(drive); - return get_dma_residue(hwif->hw.dma) != 0; + return icside_dma_begin(drive); } -int icside_dma_count (ide_drive_t *drive) +/* + * dma_intr() is the handler for disk read/write DMA interrupts + */ +static ide_startstop_t icside_dmaintr(ide_drive_t *drive) { - return icside_dma_begin(drive); + unsigned int stat; + int dma_stat; + + dma_stat = icside_dma_end(drive); + stat = HWIF(drive)->INB(IDE_STATUS_REG); + if (OK_STAT(stat, DRIVE_READY, drive->bad_wstat | DRQ_STAT)) { + if (!dma_stat) { + struct request *rq = HWGROUP(drive)->rq; + int i; + + for (i = rq->nr_sectors; i > 0; ) { + i -= rq->current_nr_sectors; + DRIVER(drive)->end_request(drive, 1, rq->nr_sectors); + } + + return ide_stopped; + } + printk(KERN_ERR "%s: bad DMA status (dma_stat=%x)\n", + drive->name, dma_stat); + } + + return DRIVER(drive)->error(drive, __FUNCTION__, stat); } -int icside_dma_read(ide_drive_t *drive) +static int +icside_dma_common(ide_drive_t *drive, struct request *rq, + unsigned int dma_mode) { - ide_hwif_t *hwif = HWIF(drive); -// ide_task_t *args = HWGROUP(drive)->rq->special; - int count = 0; - u8 lba48 = (drive->addressing == 1) ? 1 : 0; - task_ioreg_t command = WIN_NOP; + ide_hwif_t *hwif = HWIF(drive); - count = icside_build_dmatable(drive, 1); - if (!count) - return 1; - disable_dma(hwif->hw.dma); + /* + * We can not enable DMA on both channels. + */ + BUG_ON(hwif->sg_dma_active); + BUG_ON(dma_channel_active(hwif->hw.dma)); + + ide_build_sglist(drive, rq); - /* Route the DMA signals to - * to the correct interface. + /* + * Ensure that we have the right interrupt routed. + */ + icside_maskproc(drive, 0); + + /* + * Route the DMA signals to the correct interface. */ - HWIF(drive)->OUTB(hwif->select_data, hwif->config_data); + outb(hwif->select_data, hwif->config_data); - /* Select the correct timing - * for this drive + /* + * Select the correct timing for this drive. */ set_dma_speed(hwif->hw.dma, drive->drive_data); - set_dma_sg(hwif->hw.dma, HWIF(drive)->sg_table, count); - set_dma_mode(hwif->hw.dma, DMA_MODE_READ); + /* + * Tell the DMA engine about the SG table and + * data direction. + */ + set_dma_sg(hwif->hw.dma, hwif->sg_table, hwif->sg_nents); + set_dma_mode(hwif->hw.dma, dma_mode); + + return 0; +} + +static int icside_dma_read(ide_drive_t *drive) +{ + struct request *rq = HWGROUP(drive)->rq; + task_ioreg_t cmd = WIN_NOP; + + if (icside_dma_common(drive, rq, DMA_MODE_READ)) + return 1; drive->waiting_for_dma = 1; + if (drive->media != ide_disk) return 0; - if (HWGROUP(drive)->handler != NULL) /* paranoia check */ - BUG(); - ide_set_handler(drive, &icside_dmaintr, WAIT_CMD, NULL); + BUG_ON(HWGROUP(drive)->handler != NULL); + + ide_set_handler(drive, icside_dmaintr, 2*WAIT_CMD, NULL); + /* * FIX ME to use only ACB ide_task_t args Struct */ #if 0 { - ide_task_t *args = HWGROUP(drive)->rq->special; + ide_task_t *args = rq->special; command = args->tfRegister[IDE_COMMAND_OFFSET]; } #else - command = (lba48) ? WIN_READDMA_EXT : WIN_READDMA; - if (HWGROUP(drive)->rq->flags & REQ_DRIVE_TASKFILE) { - ide_task_t *args = HWGROUP(drive)->rq->special; - command = args->tfRegister[IDE_COMMAND_OFFSET]; + if (rq->flags & REQ_DRIVE_TASKFILE) { + ide_task_t *args = rq->special; + cmd = args->tfRegister[IDE_COMMAND_OFFSET]; + } else if (drive->addressing == 1) { + cmd = WIN_READDMA_EXT; + } else { + cmd = WIN_READDMA; } #endif /* issue cmd to drive */ - HWIF(drive)->OUTB(command, IDE_COMMAND_REG); + HWIF(drive)->OUTB(cmd, IDE_COMMAND_REG); - return icside_dma_count(drive); + return icside_dma_begin(drive); } int icside_dma_write(ide_drive_t *drive) { - ide_hwif_t *hwif = HWIF(drive); -// ide_task_t *args = HWGROUP(drive)->rq->special; - int count = 0; - u8 lba48 = (drive->addressing == 1) ? 1 : 0; - task_ioreg_t command = WIN_NOP; + struct request *rq = HWGROUP(drive)->rq; + task_ioreg_t cmd = WIN_NOP; - count = icside_build_dmatable(drive, 0); - if (!count) + if (icside_dma_common(drive, rq, DMA_MODE_WRITE)) return 1; - disable_dma(hwif->hw.dma); - - /* Route the DMA signals to - * to the correct interface. - */ - HWIF(drive)->OUTB(hwif->select_data, hwif->config_data); - - /* Select the correct timing - * for this drive - */ - set_dma_speed(hwif->hw.dma, drive->drive_data); - - set_dma_sg(hwif->hw.dma, HWIF(drive)->sg_table, count); - set_dma_mode(hwif->hw.dma, DMA_MODE_WRITE); drive->waiting_for_dma = 1; + if (drive->media != ide_disk) return 0; - if (HWGROUP(drive)->handler != NULL) - BUG(); - ide_set_handler(drive, &icside_dmaintr, WAIT_CMD, NULL); + BUG_ON(HWGROUP(drive)->handler != NULL); + + ide_set_handler(drive, icside_dmaintr, 2*WAIT_CMD, NULL); + /* * FIX ME to use only ACB ide_task_t args Struct */ #if 0 { - ide_task_t *args = HWGROUP(drive)->rq->special; + ide_task_t *args = rq->special; command = args->tfRegister[IDE_COMMAND_OFFSET]; } #else - command = (lba48) ? WIN_WRITEDMA_EXT : WIN_WRITEDMA; - if (HWGROUP(drive)->rq->flags & REQ_DRIVE_TASKFILE) { - ide_task_t *args = HWGROUP(drive)->rq->special; - command = args->tfRegister[IDE_COMMAND_OFFSET]; + if (rq->flags & REQ_DRIVE_TASKFILE) { + ide_task_t *args = rq->special; + cmd = args->tfRegister[IDE_COMMAND_OFFSET]; + } else if (drive->addressing == 1) { + cmd = WIN_WRITEDMA_EXT; + } else { + cmd = WIN_WRITEDMA; } #endif /* issue cmd to drive */ - HWIF(drive)->OUTB(command, IDE_COMMAND_REG); + HWIF(drive)->OUTB(cmd, IDE_COMMAND_REG); - return icside_dma_count(drive); + return icside_dma_begin(drive); } -static int -icside_setup_dma(ide_hwif_t *hwif, int autodma) +static int icside_dma_test_irq(ide_drive_t *drive) +{ + ide_hwif_t *hwif = HWIF(drive); + struct icside_state *state = hwif->hw.priv; + + return inb(state->irq_port + + (hwif->channel ? + ICS_ARCIN_V6_INTRSTAT_2 : + ICS_ARCIN_V6_INTRSTAT_1)) & 1; +} + +static int icside_dma_verbose(ide_drive_t *drive) +{ + printk(", %s (peak %dMB/s)", + ide_xfer_verbose(drive->current_speed), + 2000 / drive->drive_data); + return 1; +} + +static int icside_dma_timeout(ide_drive_t *drive) { + printk(KERN_ERR "%s: DMA timeout occured: ", drive->name); + + if (icside_dma_test_irq(drive)) + return 0; + + ide_dump_status(drive, "DMA timeout", + HWIF(drive)->INB(IDE_STATUS_REG)); + + return icside_dma_end(drive); +} + +static int icside_dma_lostirq(ide_drive_t *drive) +{ + printk(KERN_ERR "%s: IRQ lost\n", drive->name); + return 1; +} + +static int icside_setup_dma(ide_hwif_t *hwif) +{ + int autodma = 0; + +#ifdef CONFIG_IDEDMA_ICS_AUTO + autodma = 1; +#endif + printk(" %s: SG-DMA", hwif->name); hwif->sg_table = kmalloc(sizeof(struct scatterlist) * NR_ENTRIES, @@ -666,40 +763,50 @@ icside_setup_dma(ide_hwif_t *hwif, int autodma) if (!hwif->sg_table) goto failed; - hwif->dmatable_cpu = NULL; - hwif->dmatable_dma = 0; - hwif->speedproc = icside_set_speed; - hwif->autodma = autodma; + hwif->dmatable_cpu = NULL; + hwif->dmatable_dma = 0; + hwif->speedproc = icside_set_speed; + hwif->autodma = autodma; - hwif->ide_dma_check = icside_dma_check; - hwif->ide_dma_host_off = icside_dma_host_off; + hwif->ide_dma_check = icside_dma_check; + hwif->ide_dma_host_off = icside_dma_host_off; hwif->ide_dma_off_quietly = icside_dma_off_quietly; - hwif->ide_dma_off = icside_dma_off; - hwif->ide_dma_host_on = icside_dma_host_on; - hwif->ide_dma_on = icside_dma_on; - hwif->ide_dma_read = icside_dma_read; - hwif->ide_dma_write = icside_dma_write; - hwif->ide_dma_count = icside_dma_count; - hwif->ide_dma_begin = icside_dma_begin; - hwif->ide_dma_end = icside_dma_end; - hwif->ide_dma_verbose = icside_dma_verbose; - hwif->ide_dma_bad_drive = check_drive_bad_lists; - hwif->ide_dma_good_drive = check_drive_good_lists; - hwif->ide_dma_test_irq = icside_dma_test_irq; - - printk(" capable%s\n", autodma ? - ", auto-enable" : ""); + hwif->ide_dma_off = icside_dma_off; + hwif->ide_dma_host_on = icside_dma_host_on; + hwif->ide_dma_on = icside_dma_on; + hwif->ide_dma_read = icside_dma_read; + hwif->ide_dma_write = icside_dma_write; + hwif->ide_dma_count = icside_dma_count; + hwif->ide_dma_begin = icside_dma_begin; + hwif->ide_dma_end = icside_dma_end; + hwif->ide_dma_test_irq = icside_dma_test_irq; + hwif->ide_dma_verbose = icside_dma_verbose; + hwif->ide_dma_timeout = icside_dma_timeout; + hwif->ide_dma_lostirq = icside_dma_lostirq; + + hwif->drives[0].autodma = autodma; + hwif->drives[1].autodma = autodma; + + printk(" capable%s\n", autodma ? ", auto-enable" : ""); return 1; failed: - printk(" -- ERROR, unable to allocate DMA table\n"); + printk(" disabled, unable to allocate DMA table\n"); return 0; } + +int ide_release_dma(ide_hwif_t *hwif) +{ + if (hwif->sg_table) { + kfree(hwif->sg_table); + hwif->sg_table = NULL; + } + return 1; +} #endif -static ide_hwif_t * -icside_find_hwif(unsigned long dataport) +static ide_hwif_t *icside_find_hwif(unsigned long dataport) { ide_hwif_t *hwif; int index; @@ -716,7 +823,7 @@ icside_find_hwif(unsigned long dataport) goto found; } - return NULL; + hwif = NULL; found: return hwif; } @@ -750,7 +857,7 @@ icside_setup(unsigned long base, struct cardinfo *info, int irq) return hwif; } -static int __init icside_register_v5(struct expansion_card *ec, int autodma) +static int __init icside_register_v5(struct expansion_card *ec) { unsigned long slot_port; ide_hwif_t *hwif; @@ -769,14 +876,15 @@ static int __init icside_register_v5(struct expansion_card *ec, int autodma) hwif = icside_setup(slot_port, &icside_cardinfo_v5, ec->irq); - return hwif ? 0 : -1; + return hwif ? 0 : -ENODEV; } -static int __init icside_register_v6(struct expansion_card *ec, int autodma) +static int __init icside_register_v6(struct expansion_card *ec) { unsigned long slot_port, port; + struct icside_state *state; ide_hwif_t *hwif, *mate; - int sel = 0; + unsigned int sel = 0; slot_port = ecard_address(ec, ECARD_IOC, ECARD_FAST); port = ecard_address(ec, ECARD_EASI, ECARD_FAST); @@ -788,88 +896,128 @@ static int __init icside_register_v6(struct expansion_card *ec, int autodma) outb(sel, slot_port); - ec->irq_data = (void *)port; - ec->ops = (expansioncard_ops_t *)&icside_ops_arcin_v6; - /* * Be on the safe side - disable interrupts */ inb(port + ICS_ARCIN_V6_INTROFFSET_1); inb(port + ICS_ARCIN_V6_INTROFFSET_2); + /* + * Find and register the interfaces. + */ hwif = icside_setup(port, &icside_cardinfo_v6_1, ec->irq); mate = icside_setup(port, &icside_cardinfo_v6_2, ec->irq); + if (!hwif || !mate) + return -ENODEV; + + state = kmalloc(sizeof(struct icside_state), GFP_KERNEL); + if (!state) + return -ENOMEM; + + state->channel = 0; + state->enabled = 0; + state->irq_port = port; + + ec->irq_data = state; + ec->ops = (expansioncard_ops_t *)&icside_ops_arcin_v6; + + hwif->maskproc = icside_maskproc; + hwif->channel = 0; + hwif->hw.priv = state; + hwif->mate = mate; + hwif->serialized = 1; + hwif->config_data = slot_port; + hwif->select_data = sel; + hwif->hw.dma = ec->dma; + + mate->maskproc = icside_maskproc; + mate->channel = 1; + mate->hw.priv = state; + mate->mate = hwif; + mate->serialized = 1; + mate->config_data = slot_port; + mate->select_data = sel | 1; + mate->hw.dma = ec->dma; + #ifdef CONFIG_BLK_DEV_IDEDMA_ICS - if (ec->dma != NO_DMA) { - if (request_dma(ec->dma, hwif->name)) - goto no_dma; - - if (hwif) { - hwif->config_data = slot_port; - hwif->select_data = sel; - hwif->hw.dma = ec->dma; - hwif->hw.priv = (void *) - (port + ICS_ARCIN_V6_INTRSTAT_1); - hwif->channel = 0; - icside_setup_dma(hwif, autodma); - hwif->drives[0].autodma = autodma; - hwif->drives[1].autodma = autodma; - } - if (mate) { - mate->config_data = slot_port; - mate->select_data = sel | 1; - mate->hw.dma = ec->dma; - mate->hw.priv = (void *) - (port + ICS_ARCIN_V6_INTRSTAT_2); - mate->channel = 1; - icside_setup_dma(mate, autodma); - mate->drives[0].autodma = autodma; - mate->drives[1].autodma = autodma; - } + if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) { + icside_setup_dma(hwif); + icside_setup_dma(mate); } -no_dma: #endif - return hwif || mate ? 0 : -1; + return 0; } -int __init icside_init(void) +static int __devinit +icside_probe(struct expansion_card *ec, const struct ecard_id *id) { - int autodma = 0; + int result; -#ifdef CONFIG_IDEDMA_ICS_AUTO - autodma = 1; -#endif + ecard_claim(ec); - ecard_startfind (); + switch (icside_identifyif(ec)) { + case ics_if_arcin_v5: + result = icside_register_v5(ec); + break; - do { - struct expansion_card *ec; - int result; + case ics_if_arcin_v6: + result = icside_register_v6(ec); + break; - ec = ecard_find(0, icside_cids); - if (ec == NULL) - break; + default: + result = -ENODEV; + break; + } - ecard_claim(ec); + if (result) + ecard_release(ec); + /* + * this locks the driver in-core - remove this + * comment and the two lines below when we can + * safely remove interfaces. + */ + else + MOD_INC_USE_COUNT; - switch (icside_identifyif(ec)) { - case ics_if_arcin_v5: - result = icside_register_v5(ec, autodma); - break; + return result; +} - case ics_if_arcin_v6: - result = icside_register_v6(ec, autodma); - break; +static void __devexit +icside_remove(struct expansion_card *ec) +{ + /* need to do more */ + ecard_release(ec); +} - default: - result = -1; - break; - } +static const struct ecard_id icside_ids[] = { + { MANU_ICS, PROD_ICS_IDE }, + { MANU_ICS2, PROD_ICS2_IDE }, + { 0xffff, 0xffff } +}; - if (result) - ecard_release(ec); - } while (1); +static struct ecard_driver icside_driver = { + .probe = icside_probe, + .remove = __devexit_p(icside_remove), + .id_table = icside_ids, + .drv = { + .name = "icside", + }, +}; - return 0; +static int __init icside_init(void) +{ + return ecard_register_driver(&icside_driver); } + +static void __exit icside_exit(void) +{ + ecard_remove_driver(&icside_driver); +} + +MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>"); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("ICS IDE driver"); + +module_init(icside_init); +module_exit(icside_exit); diff --git a/drivers/ide/arm/rapide.c b/drivers/ide/arm/rapide.c index b11c0d346c70..84757f420b82 100644 --- a/drivers/ide/arm/rapide.c +++ b/drivers/ide/arm/rapide.c @@ -1,11 +1,7 @@ /* * linux/drivers/ide/rapide.c * - * Copyright (c) 1996-1998 Russell King. - * - * Changelog: - * 08-06-1996 RMK Created - * 13-04-1998 RMK Added manufacturer and product IDs + * Copyright (c) 1996-2002 Russell King. */ #include <linux/module.h> @@ -17,20 +13,14 @@ #include <asm/ecard.h> -static card_ids __init rapide_cids[] = { - { MANU_YELLOWSTONE, PROD_YELLOWSTONE_RAPIDE32 }, - { 0xffff, 0xffff } -}; - -static struct expansion_card *ec[MAX_ECARDS]; -static int result[MAX_ECARDS]; - -static inline int rapide_register(struct expansion_card *ec) +static int __devinit +rapide_probe(struct expansion_card *ec, const struct ecard_id *id) { unsigned long port = ecard_address (ec, ECARD_MEMC, 0); hw_regs_t hw; + int i, ret; - int i; + ecard_claim(ec); memset(&hw, 0, sizeof(hw)); @@ -41,54 +31,53 @@ static inline int rapide_register(struct expansion_card *ec) hw.io_ports[IDE_CONTROL_OFFSET] = port + 0x206; hw.irq = ec->irq; - return ide_register_hw(&hw, NULL); -} - -int __init rapide_init(void) -{ - int i; + ret = ide_register_hw(&hw, NULL); - for (i = 0; i < MAX_ECARDS; i++) - ec[i] = NULL; + if (ret) + ecard_release(ec); + /* + * this locks the driver in-core - remove this + * comment and the two lines below when we can + * safely remove interfaces. + */ + else + MOD_INC_USE_COUNT; - ecard_startfind(); - - for (i = 0; ; i++) { - if ((ec[i] = ecard_find(0, rapide_cids)) == NULL) - break; + return ret; +} - ecard_claim(ec[i]); - result[i] = rapide_register(ec[i]); - } - for (i = 0; i < MAX_ECARDS; i++) - if (ec[i] && result[i] < 0) { - ecard_release(ec[i]); - ec[i] = NULL; - } - return 0; +static void __devexit rapide_remove(struct expansion_card *ec) +{ + /* need to do more */ + ecard_release(ec); } -#ifdef MODULE -MODULE_LICENSE("GPL"); +static struct ecard_id rapide_ids[] = { + { MANU_YELLOWSTONE, PROD_YELLOWSTONE_RAPIDE32 }, + { 0xffff, 0xffff } +}; -int init_module (void) +static struct ecard_driver rapide_driver = { + .probe = rapide_probe, + .remove = __devexit_p(rapide_remove), + .id_table = rapide_ids, + .drv = { + .name = "rapide", + }, +}; + +static int __init rapide_init(void) { - return rapide_init(); + return ecard_register_driver(&rapide_driver); } -void cleanup_module (void) +static void __exit rapide_exit(void) { - int i; - - for (i = 0; i < MAX_ECARDS; i++) - if (ec[i]) { - unsigned long port; - port = ecard_address(ec[i], ECARD_MEMC, 0); - - ide_unregister_port(port, ec[i]->irq, 16); - ecard_release(ec[i]); - ec[i] = NULL; - } + ecard_remove_driver(&rapide_driver); } -#endif +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Yellowstone RAPIDE driver"); + +module_init(rapide_init); +module_exit(rapide_exit); diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 3cb2ffff7c91..356999a5e878 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -166,6 +166,7 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd) printk("cdrom or floppy?, assuming "); if (drive->media != ide_cdrom) { printk ("FLOPPY"); + drive->removable = 1; break; } } diff --git a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c index 669aa275159c..fa6f13a8feec 100644 --- a/drivers/ide/pci/sis5513.c +++ b/drivers/ide/pci/sis5513.c @@ -10,7 +10,7 @@ * * SiS Taiwan : for direct support and hardware. * Daniela Engert : for initial ATA100 advices and numerous others. - * John Fremlin, Manfred Spraul : + * John Fremlin, Manfred Spraul, Dave Morgan : * for checking code correctness, providing patches. * * @@ -244,6 +244,14 @@ static struct pci_dev *host_dev = NULL; /* * Printing configuration */ +/* Used for chipset type printing at boot time */ +static char* chipset_capability[] = { + "ATA", "ATA 16", + "ATA 33", "ATA 66", + "ATA 100", "ATA 100", + "ATA 133", "ATA 133" +}; + #if defined(DISPLAY_SIS_TIMINGS) && defined(CONFIG_PROC_FS) #include <linux/stat.h> #include <linux/proc_fs.h> @@ -286,13 +294,6 @@ static char* cycle_time[] = { "15 CLK", "16 CLK" }; -static char* chipset_capability[] = { - "ATA", "ATA 16", - "ATA 33", "ATA 66", - "ATA 100", "ATA 100", - "ATA 133", "ATA 133" -}; - /* Generic add master or slave info function */ static char* get_drives_info (char *buffer, u8 pos) { diff --git a/drivers/ieee1394/ieee1394_types.h b/drivers/ieee1394/ieee1394_types.h index d30396111db1..850f88354126 100644 --- a/drivers/ieee1394/ieee1394_types.h +++ b/drivers/ieee1394/ieee1394_types.h @@ -7,6 +7,7 @@ #include <linux/version.h> #include <linux/list.h> #include <linux/init.h> +#include <linux/string.h> #include <asm/byteorder.h> diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index d8ff4fd44d55..08f8ec531aa4 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -1512,7 +1512,7 @@ static void sbp2_remove_device(struct sbp2scsi_host_info *hi, * physical dma in hardware). Mostly just here for debugging... */ static int sbp2_handle_physdma_write(struct hpsb_host *host, int nodeid, int destid, quadlet_t *data, - u64 addr, unsigned int length) + u64 addr, unsigned int length, u16 flags) { /* @@ -1528,7 +1528,7 @@ static int sbp2_handle_physdma_write(struct hpsb_host *host, int nodeid, int des * physical dma in hardware). Mostly just here for debugging... */ static int sbp2_handle_physdma_read(struct hpsb_host *host, int nodeid, quadlet_t *data, - u64 addr, unsigned int length) + u64 addr, unsigned int length, u16 flags) { /* diff --git a/drivers/isdn/hardware/eicon/capifunc.c b/drivers/isdn/hardware/eicon/capifunc.c index 0f55447453dc..414c4ac4c89f 100644 --- a/drivers/isdn/hardware/eicon/capifunc.c +++ b/drivers/isdn/hardware/eicon/capifunc.c @@ -173,7 +173,7 @@ static int find_free_id(void) } diva_os_leave_spin_lock (&ll_lock, &old_irql, "find free id"); return(num); -next_id: +next_id:; } diva_os_leave_spin_lock (&ll_lock, &old_irql, "find free id"); return(999); diff --git a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c index 222217885afd..ab44097d2e3a 100644 --- a/drivers/macintosh/adb.c +++ b/drivers/macintosh/adb.c @@ -35,7 +35,6 @@ #include <linux/init.h> #include <linux/delay.h> #include <linux/completion.h> -#include <linux/tqueue.h> #include <asm/uaccess.h> #ifdef CONFIG_PPC #include <asm/prom.h> diff --git a/drivers/md/Config.help b/drivers/md/Config.help index f892b7fae2f2..543ac06a2b51 100644 --- a/drivers/md/Config.help +++ b/drivers/md/Config.help @@ -122,3 +122,15 @@ CONFIG_MD_MULTIPATH If unsure, say N. +CONFIG_BLK_DEV_DM + Device-mapper is a low level volume manager. It works by allowing + people to specify mappings for ranges of logical sectors. Various + mapping types are available, in addition people may write their own + modules containing custom mappings if they wish. + + Higher level volume managers such as LVM2 use this driver. + + If you want to compile this as a module, say M here and read + <file:Documentation/modules.txt>. The module will be called dm-mod.o. + + If unsure, say N. diff --git a/drivers/md/Config.in b/drivers/md/Config.in index 8b442ff26eae..a4440af56d3d 100644 --- a/drivers/md/Config.in +++ b/drivers/md/Config.in @@ -14,5 +14,6 @@ dep_tristate ' RAID-4/RAID-5 mode' CONFIG_MD_RAID5 $CONFIG_BLK_DEV_MD dep_tristate ' Multipath I/O support' CONFIG_MD_MULTIPATH $CONFIG_BLK_DEV_MD dep_tristate ' Logical volume manager (LVM) support' CONFIG_BLK_DEV_LVM $CONFIG_MD +dep_tristate ' Device mapper support' CONFIG_BLK_DEV_DM $CONFIG_MD endmenu diff --git a/drivers/md/Makefile b/drivers/md/Makefile index 3016b63b2c2e..90821678ac55 100644 --- a/drivers/md/Makefile +++ b/drivers/md/Makefile @@ -2,8 +2,10 @@ # Makefile for the kernel software RAID and LVM drivers. # -export-objs := md.o xor.o +export-objs := md.o xor.o dm-table.o dm-target.o lvm-mod-objs := lvm.o lvm-snap.o lvm-fs.o +dm-mod-objs := dm.o dm-table.o dm-target.o dm-linear.o dm-stripe.o \ + dm-ioctl.o # Note: link order is important. All raid personalities # and xor.o must come before md.o, as they each initialise @@ -17,6 +19,7 @@ obj-$(CONFIG_MD_RAID5) += raid5.o xor.o obj-$(CONFIG_MD_MULTIPATH) += multipath.o obj-$(CONFIG_BLK_DEV_MD) += md.o obj-$(CONFIG_BLK_DEV_LVM) += lvm-mod.o +obj-$(CONFIG_BLK_DEV_DM) += dm-mod.o include $(TOPDIR)/Rules.make diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c new file mode 100644 index 000000000000..8684626c3e91 --- /dev/null +++ b/drivers/md/dm-ioctl.c @@ -0,0 +1,1129 @@ +/* + * Copyright (C) 2001, 2002 Sistina Software (UK) Limited. + * + * This file is released under the GPL. + */ + +#include "dm.h" + +#include <linux/module.h> +#include <linux/vmalloc.h> +#include <linux/compatmac.h> +#include <linux/miscdevice.h> +#include <linux/dm-ioctl.h> +#include <linux/init.h> +#include <linux/wait.h> +#include <linux/blk.h> +#include <linux/slab.h> + +#define DM_DRIVER_EMAIL "dm@uk.sistina.com" + +/*----------------------------------------------------------------- + * The ioctl interface needs to be able to look up devices by + * name or uuid. + *---------------------------------------------------------------*/ +struct hash_cell { + struct list_head name_list; + struct list_head uuid_list; + + char *name; + char *uuid; + struct mapped_device *md; + + /* I hate devfs */ + devfs_handle_t devfs_entry; +}; + +#define NUM_BUCKETS 64 +#define MASK_BUCKETS (NUM_BUCKETS - 1) +static struct list_head _name_buckets[NUM_BUCKETS]; +static struct list_head _uuid_buckets[NUM_BUCKETS]; + +static devfs_handle_t _dev_dir; +void dm_hash_remove_all(void); + +/* + * Guards access to all three tables. + */ +static DECLARE_RWSEM(_hash_lock); + +static void init_buckets(struct list_head *buckets) +{ + unsigned int i; + + for (i = 0; i < NUM_BUCKETS; i++) + INIT_LIST_HEAD(buckets + i); +} + +int dm_hash_init(void) +{ + init_buckets(_name_buckets); + init_buckets(_uuid_buckets); + _dev_dir = devfs_mk_dir(0, DM_DIR, NULL); + return 0; +} + +void dm_hash_exit(void) +{ + dm_hash_remove_all(); + devfs_unregister(_dev_dir); +} + +/*----------------------------------------------------------------- + * Hash function: + * We're not really concerned with the str hash function being + * fast since it's only used by the ioctl interface. + *---------------------------------------------------------------*/ +static unsigned int hash_str(const char *str) +{ + const unsigned int hash_mult = 2654435387U; + unsigned int h = 0; + + while (*str) + h = (h + (unsigned int) *str++) * hash_mult; + + return h & MASK_BUCKETS; +} + +/*----------------------------------------------------------------- + * Code for looking up a device by name + *---------------------------------------------------------------*/ +static struct hash_cell *__get_name_cell(const char *str) +{ + struct list_head *tmp; + struct hash_cell *hc; + unsigned int h = hash_str(str); + + list_for_each (tmp, _name_buckets + h) { + hc = list_entry(tmp, struct hash_cell, name_list); + if (!strcmp(hc->name, str)) + return hc; + } + + return NULL; +} + +static struct hash_cell *__get_uuid_cell(const char *str) +{ + struct list_head *tmp; + struct hash_cell *hc; + unsigned int h = hash_str(str); + + list_for_each (tmp, _uuid_buckets + h) { + hc = list_entry(tmp, struct hash_cell, uuid_list); + if (!strcmp(hc->uuid, str)) + return hc; + } + + return NULL; +} + +/*----------------------------------------------------------------- + * Inserting, removing and renaming a device. + *---------------------------------------------------------------*/ +static inline char *kstrdup(const char *str) +{ + char *r = kmalloc(strlen(str) + 1, GFP_KERNEL); + if (r) + strcpy(r, str); + return r; +} + +static struct hash_cell *alloc_cell(const char *name, const char *uuid, + struct mapped_device *md) +{ + struct hash_cell *hc; + + hc = kmalloc(sizeof(*hc), GFP_KERNEL); + if (!hc) + return NULL; + + hc->name = kstrdup(name); + if (!hc->name) { + kfree(hc); + return NULL; + } + + if (!uuid) + hc->uuid = NULL; + + else { + hc->uuid = kstrdup(uuid); + if (!hc->uuid) { + kfree(hc->name); + kfree(hc); + return NULL; + } + } + + INIT_LIST_HEAD(&hc->name_list); + INIT_LIST_HEAD(&hc->uuid_list); + hc->md = md; + return hc; +} + +static void free_cell(struct hash_cell *hc) +{ + if (hc) { + kfree(hc->name); + kfree(hc->uuid); + kfree(hc); + } +} + +/* + * devfs stuff. + */ +static int register_with_devfs(struct hash_cell *hc) +{ + kdev_t dev = dm_kdev(hc->md); + hc->devfs_entry = + devfs_register(_dev_dir, hc->name, DEVFS_FL_CURRENT_OWNER, + major(dev), minor(dev), + S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP, + &dm_blk_dops, NULL); + + return 0; +} + +static int unregister_with_devfs(struct hash_cell *hc) +{ + devfs_unregister(hc->devfs_entry); + return 0; +} + +/* + * The kdev_t and uuid of a device can never change once it is + * initially inserted. + */ +int dm_hash_insert(const char *name, const char *uuid, struct mapped_device *md) +{ + struct hash_cell *cell; + + /* + * Allocate the new cells. + */ + cell = alloc_cell(name, uuid, md); + if (!cell) + return -ENOMEM; + + /* + * Insert the cell into all three hash tables. + */ + down_write(&_hash_lock); + if (__get_name_cell(name)) + goto bad; + + list_add(&cell->name_list, _name_buckets + hash_str(name)); + + if (uuid) { + if (__get_uuid_cell(uuid)) { + list_del(&cell->name_list); + goto bad; + } + list_add(&cell->uuid_list, _uuid_buckets + hash_str(uuid)); + } + register_with_devfs(cell); + dm_get(md); + up_write(&_hash_lock); + + return 0; + + bad: + up_write(&_hash_lock); + free_cell(cell); + return -EBUSY; +} + +void __hash_remove(struct hash_cell *hc) +{ + /* remove from the dev hash */ + list_del(&hc->uuid_list); + list_del(&hc->name_list); + unregister_with_devfs(hc); + dm_put(hc->md); +} + +void dm_hash_remove_all(void) +{ + int i; + struct hash_cell *hc; + struct list_head *tmp, *n; + + down_write(&_hash_lock); + for (i = 0; i < NUM_BUCKETS; i++) { + list_for_each_safe (tmp, n, _name_buckets + i) { + hc = list_entry(tmp, struct hash_cell, name_list); + __hash_remove(hc); + } + } + up_write(&_hash_lock); +} + +int dm_hash_rename(const char *old, const char *new) +{ + char *new_name, *old_name; + struct hash_cell *hc; + + /* + * duplicate new. + */ + new_name = kstrdup(new); + if (!new_name) + return -ENOMEM; + + down_write(&_hash_lock); + + /* + * Is new free ? + */ + hc = __get_name_cell(new); + if (hc) { + DMWARN("asked to rename to an already existing name %s -> %s", + old, new); + up_write(&_hash_lock); + return -EBUSY; + } + + /* + * Is there such a device as 'old' ? + */ + hc = __get_name_cell(old); + if (!hc) { + DMWARN("asked to rename a non existent device %s -> %s", + old, new); + up_write(&_hash_lock); + return -ENXIO; + } + + /* + * rename and move the name cell. + */ + list_del(&hc->name_list); + old_name = hc->name; + hc->name = new_name; + list_add(&hc->name_list, _name_buckets + hash_str(new_name)); + + /* rename the device node in devfs */ + unregister_with_devfs(hc); + register_with_devfs(hc); + + up_write(&_hash_lock); + kfree(old_name); + return 0; +} + + +/*----------------------------------------------------------------- + * Implementation of the ioctl commands + *---------------------------------------------------------------*/ + +/* + * All the ioctl commands get dispatched to functions with this + * prototype. + */ +typedef int (*ioctl_fn)(struct dm_ioctl *param, struct dm_ioctl *user); + +/* + * Check a string doesn't overrun the chunk of + * memory we copied from userland. + */ +static int valid_str(char *str, void *begin, void *end) +{ + while (((void *) str >= begin) && ((void *) str < end)) + if (!*str++) + return 0; + + return -EINVAL; +} + +static int next_target(struct dm_target_spec *last, uint32_t next, + void *begin, void *end, + struct dm_target_spec **spec, char **params) +{ + *spec = (struct dm_target_spec *) + ((unsigned char *) last + next); + *params = (char *) (*spec + 1); + + if (*spec < (last + 1) || ((void *) *spec > end)) + return -EINVAL; + + return valid_str(*params, begin, end); +} + +static int populate_table(struct dm_table *table, struct dm_ioctl *args) +{ + int i = 0, r, first = 1; + struct dm_target_spec *spec; + char *params; + void *begin, *end; + + if (!args->target_count) { + DMWARN("populate_table: no targets specified"); + return -EINVAL; + } + + begin = (void *) args; + end = begin + args->data_size; + + for (i = 0; i < args->target_count; i++) { + + if (first) + r = next_target((struct dm_target_spec *) args, + args->data_start, + begin, end, &spec, ¶ms); + else + r = next_target(spec, spec->next, begin, end, + &spec, ¶ms); + + if (r) { + DMWARN("unable to find target"); + return -EINVAL; + } + + r = dm_table_add_target(table, spec->target_type, + spec->sector_start, spec->length, + params); + if (r) { + DMWARN("internal error adding target to table"); + return -EINVAL; + } + + first = 0; + } + + return dm_table_complete(table); +} + +/* + * Round up the ptr to the next 'align' boundary. Obviously + * 'align' must be a power of 2. + */ +static inline void *align_ptr(void *ptr, unsigned int align) +{ + align--; + return (void *) (((unsigned long) (ptr + align)) & ~align); +} + +/* + * Copies a dm_ioctl and an optional additional payload to + * userland. + */ +static int results_to_user(struct dm_ioctl *user, struct dm_ioctl *param, + void *data, uint32_t len) +{ + int r; + void *ptr = NULL; + + if (data) { + ptr = align_ptr(user + 1, sizeof(unsigned long)); + param->data_start = ptr - (void *) user; + } + + /* + * The version number has already been filled in, so we + * just copy later fields. + */ + r = copy_to_user(&user->data_size, ¶m->data_size, + sizeof(*param) - sizeof(param->version)); + if (r) + return -EFAULT; + + if (data) { + if (param->data_start + len > param->data_size) + return -ENOSPC; + + if (copy_to_user(ptr, data, len)) + r = -EFAULT; + } + + return r; +} + +/* + * Fills in a dm_ioctl structure, ready for sending back to + * userland. + */ +static int __info(struct mapped_device *md, struct dm_ioctl *param) +{ + struct dm_table *table; + struct block_device *bdev; + + param->flags = DM_EXISTS_FLAG; + if (dm_suspended(md)) + param->flags |= DM_SUSPEND_FLAG; + + param->dev = kdev_t_to_nr(dm_kdev(md)); + bdev = bdget(param->dev); + if (!bdev) + return -ENXIO; + + if (bdev_read_only(bdev)) + param->flags |= DM_READONLY_FLAG; + + param->open_count = bdev->bd_openers; + bdput(bdev); + + table = dm_get_table(md); + param->target_count = dm_table_get_num_targets(table); + dm_table_put(table); + + return 0; +} + +/* + * Always use UUID for lookups if it's present, otherwise use name. + */ +static inline struct mapped_device *find_device(struct dm_ioctl *param) +{ + struct hash_cell *hc; + struct mapped_device *md = NULL; + + down_read(&_hash_lock); + hc = *param->uuid ? __get_uuid_cell(param->uuid) : + __get_name_cell(param->name); + if (hc) { + md = hc->md; + + /* + * Sneakily write in both the name and the uuid + * while we have the cell. + */ + strncpy(param->name, hc->name, sizeof(param->name)); + if (hc->uuid) + strncpy(param->uuid, hc->uuid, sizeof(param->uuid) - 1); + else + param->uuid[0] = '\0'; + + dm_get(md); + } + up_read(&_hash_lock); + + return md; +} + +#define ALIGNMENT sizeof(int) +static void *_align(void *ptr, unsigned int a) +{ + register unsigned long align = --a; + + return (void *) (((unsigned long) ptr + align) & ~align); +} + +/* + * Copies device info back to user space, used by + * the create and info ioctls. + */ +static int info(struct dm_ioctl *param, struct dm_ioctl *user) +{ + struct mapped_device *md; + + param->flags = 0; + + md = find_device(param); + if (!md) + /* + * Device not found - returns cleared exists flag. + */ + goto out; + + __info(md, param); + dm_put(md); + + out: + return results_to_user(user, param, NULL, 0); +} + +static inline int get_mode(struct dm_ioctl *param) +{ + int mode = FMODE_READ | FMODE_WRITE; + + if (param->flags & DM_READONLY_FLAG) + mode = FMODE_READ; + + return mode; +} + +static int check_name(const char *name) +{ + if (strchr(name, '/')) { + DMWARN("invalid device name"); + return -EINVAL; + } + + return 0; +} + +static int create(struct dm_ioctl *param, struct dm_ioctl *user) +{ + int r; + struct dm_table *t; + struct mapped_device *md; + int minor; + + r = check_name(param->name); + if (r) + return r; + + r = dm_table_create(&t, get_mode(param)); + if (r) + return r; + + r = populate_table(t, param); + if (r) { + dm_table_put(t); + return r; + } + + minor = (param->flags & DM_PERSISTENT_DEV_FLAG) ? + minor(to_kdev_t(param->dev)) : -1; + + r = dm_create(minor, t, &md); + if (r) { + dm_table_put(t); + return r; + } + dm_table_put(t); /* md will have grabbed its own reference */ + + set_device_ro(dm_kdev(md), (param->flags & DM_READONLY_FLAG)); + r = dm_hash_insert(param->name, *param->uuid ? param->uuid : NULL, md); + dm_put(md); + + return r ? r : info(param, user); +} + +/* + * Build up the status struct for each target + */ +static int __status(struct mapped_device *md, struct dm_ioctl *param, + char *outbuf, int *len) +{ + int i, num_targets; + struct dm_target_spec *spec; + char *outptr; + status_type_t type; + struct dm_table *table = dm_get_table(md); + + if (param->flags & DM_STATUS_TABLE_FLAG) + type = STATUSTYPE_TABLE; + else + type = STATUSTYPE_INFO; + + outptr = outbuf; + + /* Get all the target info */ + num_targets = dm_table_get_num_targets(table); + for (i = 0; i < num_targets; i++) { + struct dm_target *ti = dm_table_get_target(table, i); + + if (outptr - outbuf + + sizeof(struct dm_target_spec) > param->data_size) { + dm_table_put(table); + return -ENOMEM; + } + + spec = (struct dm_target_spec *) outptr; + + spec->status = 0; + spec->sector_start = ti->begin; + spec->length = ti->len; + strncpy(spec->target_type, ti->type->name, + sizeof(spec->target_type)); + + outptr += sizeof(struct dm_target_spec); + + /* Get the status/table string from the target driver */ + if (ti->type->status) + ti->type->status(ti, type, outptr, + outbuf + param->data_size - outptr); + else + outptr[0] = '\0'; + + outptr += strlen(outptr) + 1; + _align(outptr, ALIGNMENT); + spec->next = outptr - outbuf; + } + + param->target_count = num_targets; + *len = outptr - outbuf; + dm_table_put(table); + + return 0; +} + +/* + * Return the status of a device as a text string for each + * target. + */ +static int get_status(struct dm_ioctl *param, struct dm_ioctl *user) +{ + struct mapped_device *md; + int len = 0; + int ret; + char *outbuf = NULL; + + md = find_device(param); + if (!md) + /* + * Device not found - returns cleared exists flag. + */ + goto out; + + /* We haven't a clue how long the resultant data will be so + just allocate as much as userland has allowed us and make sure + we don't overun it */ + outbuf = kmalloc(param->data_size, GFP_KERNEL); + if (!outbuf) + goto out; + /* + * Get the status of all targets + */ + __status(md, param, outbuf, &len); + + /* + * Setup the basic dm_ioctl structure. + */ + __info(md, param); + + out: + if (md) + dm_put(md); + + ret = results_to_user(user, param, outbuf, len); + + if (outbuf) + kfree(outbuf); + + return ret; +} + +/* + * Wait for a device to report an event + */ +static int wait_device_event(struct dm_ioctl *param, struct dm_ioctl *user) +{ + struct mapped_device *md; + struct dm_table *table; + DECLARE_WAITQUEUE(wq, current); + + md = find_device(param); + if (!md) + /* + * Device not found - returns cleared exists flag. + */ + goto out; + + /* + * Setup the basic dm_ioctl structure. + */ + __info(md, param); + + /* + * Wait for a notification event + */ + set_current_state(TASK_INTERRUPTIBLE); + table = dm_get_table(md); + dm_table_add_wait_queue(table, &wq); + dm_table_put(table); + dm_put(md); + + yield(); + set_current_state(TASK_RUNNING); + + out: + return results_to_user(user, param, NULL, 0); +} + +/* + * Retrieves a list of devices used by a particular dm device. + */ +static int dep(struct dm_ioctl *param, struct dm_ioctl *user) +{ + int count, r; + struct mapped_device *md; + struct list_head *tmp; + size_t len = 0; + struct dm_target_deps *deps = NULL; + struct dm_table *table; + + md = find_device(param); + if (!md) + goto out; + table = dm_get_table(md); + + /* + * Setup the basic dm_ioctl structure. + */ + __info(md, param); + + /* + * Count the devices. + */ + count = 0; + list_for_each(tmp, dm_table_get_devices(table)) + count++; + + /* + * Allocate a kernel space version of the dm_target_status + * struct. + */ + if (array_too_big(sizeof(*deps), sizeof(*deps->dev), count)) { + dm_table_put(table); + dm_put(md); + return -ENOMEM; + } + + len = sizeof(*deps) + (sizeof(*deps->dev) * count); + deps = kmalloc(len, GFP_KERNEL); + if (!deps) { + dm_table_put(table); + dm_put(md); + return -ENOMEM; + } + + /* + * Fill in the devices. + */ + deps->count = count; + count = 0; + list_for_each(tmp, dm_table_get_devices(table)) { + struct dm_dev *dd = list_entry(tmp, struct dm_dev, list); + deps->dev[count++] = dd->bdev->bd_dev; + } + dm_table_put(table); + dm_put(md); + + out: + r = results_to_user(user, param, deps, len); + + kfree(deps); + return r; +} + +static int remove(struct dm_ioctl *param, struct dm_ioctl *user) +{ + struct hash_cell *hc; + + down_write(&_hash_lock); + hc = *param->uuid ? __get_uuid_cell(param->uuid) : + __get_name_cell(param->name); + if (!hc) { + DMWARN("device doesn't appear to be in the dev hash table."); + up_write(&_hash_lock); + return -EINVAL; + } + + __hash_remove(hc); + up_write(&_hash_lock); + return 0; +} + +static int remove_all(struct dm_ioctl *param, struct dm_ioctl *user) +{ + dm_hash_remove_all(); + return 0; +} + +static int suspend(struct dm_ioctl *param, struct dm_ioctl *user) +{ + int r; + struct mapped_device *md; + + md = find_device(param); + if (!md) + return -ENXIO; + + if (param->flags & DM_SUSPEND_FLAG) + r = dm_suspend(md); + else + r = dm_resume(md); + + dm_put(md); + return r; +} + +static int reload(struct dm_ioctl *param, struct dm_ioctl *user) +{ + int r; + struct mapped_device *md; + struct dm_table *t; + + r = dm_table_create(&t, get_mode(param)); + if (r) + return r; + + r = populate_table(t, param); + if (r) { + dm_table_put(t); + return r; + } + + md = find_device(param); + if (!md) { + dm_table_put(t); + return -ENXIO; + } + + r = dm_swap_table(md, t); + if (r) { + dm_put(md); + dm_table_put(t); + return r; + } + + set_device_ro(dm_kdev(md), (param->flags & DM_READONLY_FLAG)); + dm_put(md); + + r = info(param, user); + return r; +} + +static int rename(struct dm_ioctl *param, struct dm_ioctl *user) +{ + int r; + char *new_name = (char *) param + param->data_start; + + if (valid_str(new_name, (void *) param, + (void *) param + param->data_size)) { + DMWARN("Invalid new logical volume name supplied."); + return -EINVAL; + } + + r = check_name(new_name); + if (r) + return r; + + return dm_hash_rename(param->name, new_name); +} + + +/*----------------------------------------------------------------- + * Implementation of open/close/ioctl on the special char + * device. + *---------------------------------------------------------------*/ +static ioctl_fn lookup_ioctl(unsigned int cmd) +{ + static struct { + int cmd; + ioctl_fn fn; + } _ioctls[] = { + {DM_VERSION_CMD, NULL}, /* version is dealt with elsewhere */ + {DM_REMOVE_ALL_CMD, remove_all}, + {DM_DEV_CREATE_CMD, create}, + {DM_DEV_REMOVE_CMD, remove}, + {DM_DEV_RELOAD_CMD, reload}, + {DM_DEV_RENAME_CMD, rename}, + {DM_DEV_SUSPEND_CMD, suspend}, + {DM_DEV_DEPS_CMD, dep}, + {DM_DEV_STATUS_CMD, info}, + {DM_TARGET_STATUS_CMD, get_status}, + {DM_TARGET_WAIT_CMD, wait_device_event}, + }; + + return (cmd >= ARRAY_SIZE(_ioctls)) ? NULL : _ioctls[cmd].fn; +} + +/* + * As well as checking the version compatibility this always + * copies the kernel interface version out. + */ +static int check_version(int cmd, struct dm_ioctl *user) +{ + uint32_t version[3]; + int r = 0; + + if (copy_from_user(version, user->version, sizeof(version))) + return -EFAULT; + + if ((DM_VERSION_MAJOR != version[0]) || + (DM_VERSION_MINOR < version[1])) { + DMWARN("ioctl interface mismatch: " + "kernel(%u.%u.%u), user(%u.%u.%u), cmd(%d)", + DM_VERSION_MAJOR, DM_VERSION_MINOR, + DM_VERSION_PATCHLEVEL, + version[0], version[1], version[2], cmd); + r = -EINVAL; + } + + /* + * Fill in the kernel version. + */ + version[0] = DM_VERSION_MAJOR; + version[1] = DM_VERSION_MINOR; + version[2] = DM_VERSION_PATCHLEVEL; + if (copy_to_user(user->version, version, sizeof(version))) + return -EFAULT; + + return r; +} + +static void free_params(struct dm_ioctl *param) +{ + vfree(param); +} + +static int copy_params(struct dm_ioctl *user, struct dm_ioctl **param) +{ + struct dm_ioctl tmp, *dmi; + + if (copy_from_user(&tmp, user, sizeof(tmp))) + return -EFAULT; + + if (tmp.data_size < sizeof(tmp)) + return -EINVAL; + + dmi = (struct dm_ioctl *) vmalloc(tmp.data_size); + if (!dmi) + return -ENOMEM; + + if (copy_from_user(dmi, user, tmp.data_size)) { + vfree(dmi); + return -EFAULT; + } + + *param = dmi; + return 0; +} + +static int validate_params(uint cmd, struct dm_ioctl *param) +{ + /* Unless creating, either name of uuid but not both */ + if (cmd != DM_DEV_CREATE_CMD) { + if ((!*param->uuid && !*param->name) || + (*param->uuid && *param->name)) { + DMWARN("one of name or uuid must be supplied"); + return -EINVAL; + } + } + + /* Ensure strings are terminated */ + param->name[DM_NAME_LEN - 1] = '\0'; + param->uuid[DM_UUID_LEN - 1] = '\0'; + + return 0; +} + +static int ctl_ioctl(struct inode *inode, struct file *file, + uint command, ulong u) +{ + int r = 0, cmd; + struct dm_ioctl *param; + struct dm_ioctl *user = (struct dm_ioctl *) u; + ioctl_fn fn = NULL; + + /* only root can play with this */ + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + + if (_IOC_TYPE(command) != DM_IOCTL) + return -ENOTTY; + + cmd = _IOC_NR(command); + + /* + * Check the interface version passed in. This also + * writes out the kernels interface version. + */ + r = check_version(cmd, user); + if (r) + return r; + + /* + * Nothing more to do for the version command. + */ + if (cmd == DM_VERSION_CMD) + return 0; + + fn = lookup_ioctl(cmd); + if (!fn) { + DMWARN("dm_ctl_ioctl: unknown command 0x%x", command); + return -ENOTTY; + } + + /* + * Copy the parameters into kernel space. + */ + r = copy_params(user, ¶m); + if (r) + return r; + + r = validate_params(cmd, param); + if (r) { + free_params(param); + return r; + } + + r = fn(param, user); + free_params(param); + return r; +} + +static struct file_operations _ctl_fops = { + .ioctl = ctl_ioctl, + .owner = THIS_MODULE, +}; + +static devfs_handle_t _ctl_handle; + +static struct miscdevice _dm_misc = { + .minor = MISC_DYNAMIC_MINOR, + .name = DM_NAME, + .fops = &_ctl_fops +}; + +/* + * Create misc character device and link to DM_DIR/control. + */ +int __init dm_interface_init(void) +{ + int r; + char rname[64]; + + r = dm_hash_init(); + if (r) + return r; + + r = misc_register(&_dm_misc); + if (r) { + DMERR("misc_register failed for control device"); + dm_hash_exit(); + return r; + } + + r = devfs_generate_path(_dm_misc.devfs_handle, rname + 3, + sizeof rname - 3); + if (r == -ENOSYS) + return 0; /* devfs not present */ + + if (r < 0) { + DMERR("devfs_generate_path failed for control device"); + goto failed; + } + + strncpy(rname + r, "../", 3); + r = devfs_mk_symlink(NULL, DM_DIR "/control", + DEVFS_FL_DEFAULT, rname + r, &_ctl_handle, NULL); + if (r) { + DMERR("devfs_mk_symlink failed for control device"); + goto failed; + } + devfs_auto_unregister(_dm_misc.devfs_handle, _ctl_handle); + + DMINFO("%d.%d.%d%s initialised: %s", DM_VERSION_MAJOR, + DM_VERSION_MINOR, DM_VERSION_PATCHLEVEL, DM_VERSION_EXTRA, + DM_DRIVER_EMAIL); + return 0; + + failed: + dm_hash_exit(); + misc_deregister(&_dm_misc); + return r; +} + +void dm_interface_exit(void) +{ + dm_hash_exit(); + + if (misc_deregister(&_dm_misc) < 0) + DMERR("misc_deregister failed for control device"); +} diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c new file mode 100644 index 000000000000..6f5f2630f9a1 --- /dev/null +++ b/drivers/md/dm-linear.c @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2001 Sistina Software (UK) Limited. + * + * This file is released under the GPL. + */ + +#include "dm.h" + +#include <linux/module.h> +#include <linux/init.h> +#include <linux/blkdev.h> +#include <linux/bio.h> +#include <linux/slab.h> + +/* + * Linear: maps a linear range of a device. + */ +struct linear_c { + struct dm_dev *dev; + sector_t start; +}; + +/* + * Construct a linear mapping: <dev_path> <offset> + */ +static int linear_ctr(struct dm_target *ti, int argc, char **argv) +{ + struct linear_c *lc; + + if (argc != 2) { + ti->error = "dm-linear: Not enough arguments"; + return -EINVAL; + } + + lc = kmalloc(sizeof(*lc), GFP_KERNEL); + if (lc == NULL) { + ti->error = "dm-linear: Cannot allocate linear context"; + return -ENOMEM; + } + + if (sscanf(argv[1], SECTOR_FORMAT, &lc->start) != 1) { + ti->error = "dm-linear: Invalid device sector"; + goto bad; + } + + if (dm_get_device(ti, argv[0], ti->begin, ti->len, + dm_table_get_mode(ti->table), &lc->dev)) { + ti->error = "dm-linear: Device lookup failed"; + goto bad; + } + + ti->private = lc; + return 0; + + bad: + kfree(lc); + return -EINVAL; +} + +static void linear_dtr(struct dm_target *ti) +{ + struct linear_c *lc = (struct linear_c *) ti->private; + + dm_put_device(ti, lc->dev); + kfree(lc); +} + +static int linear_map(struct dm_target *ti, struct bio *bio) +{ + struct linear_c *lc = (struct linear_c *) ti->private; + + bio->bi_bdev = lc->dev->bdev; + bio->bi_sector = lc->start + (bio->bi_sector - ti->begin); + + return 1; +} + +static int linear_status(struct dm_target *ti, status_type_t type, + char *result, int maxlen) +{ + struct linear_c *lc = (struct linear_c *) ti->private; + + switch (type) { + case STATUSTYPE_INFO: + result[0] = '\0'; + break; + + case STATUSTYPE_TABLE: + snprintf(result, maxlen, "%s " SECTOR_FORMAT, + kdevname(to_kdev_t(lc->dev->bdev->bd_dev)), lc->start); + break; + } + return 0; +} + +static struct target_type linear_target = { + .name = "linear", + .module = THIS_MODULE, + .ctr = linear_ctr, + .dtr = linear_dtr, + .map = linear_map, + .status = linear_status, +}; + +int __init dm_linear_init(void) +{ + int r = dm_register_target(&linear_target); + + if (r < 0) + DMERR("linear: register failed %d", r); + + return r; +} + +void dm_linear_exit(void) +{ + int r = dm_unregister_target(&linear_target); + + if (r < 0) + DMERR("linear: unregister failed %d", r); +} diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c new file mode 100644 index 000000000000..abd27339d91c --- /dev/null +++ b/drivers/md/dm-stripe.c @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2001 Sistina Software (UK) Limited. + * + * This file is released under the GPL. + */ + +#include "dm.h" + +#include <linux/module.h> +#include <linux/init.h> +#include <linux/blkdev.h> +#include <linux/bio.h> +#include <linux/slab.h> + +struct stripe { + struct dm_dev *dev; + sector_t physical_start; +}; + +struct stripe_c { + uint32_t stripes; + + /* The size of this target / num. stripes */ + uint32_t stripe_width; + + /* stripe chunk size */ + uint32_t chunk_shift; + sector_t chunk_mask; + + struct stripe stripe[0]; +}; + +static inline struct stripe_c *alloc_context(int stripes) +{ + size_t len; + + if (array_too_big(sizeof(struct stripe_c), sizeof(struct stripe), + stripes)) + return NULL; + + len = sizeof(struct stripe_c) + (sizeof(struct stripe) * stripes); + + return kmalloc(len, GFP_KERNEL); +} + +/* + * Parse a single <dev> <sector> pair + */ +static int get_stripe(struct dm_target *ti, struct stripe_c *sc, + int stripe, char **argv) +{ + sector_t start; + + if (sscanf(argv[1], SECTOR_FORMAT, &start) != 1) + return -EINVAL; + + if (dm_get_device(ti, argv[0], start, sc->stripe_width, + dm_table_get_mode(ti->table), + &sc->stripe[stripe].dev)) + return -ENXIO; + + sc->stripe[stripe].physical_start = start; + return 0; +} + +/* + * FIXME: Nasty function, only present because we can't link + * against __moddi3 and __divdi3. + * + * returns a == b * n + */ +static int multiple(sector_t a, sector_t b, sector_t *n) +{ + sector_t acc, prev, i; + + *n = 0; + while (a >= b) { + for (acc = b, prev = 0, i = 1; + acc <= a; + prev = acc, acc <<= 1, i <<= 1) + ; + + a -= prev; + *n += i >> 1; + } + + return a == 0; +} + +/* + * Construct a striped mapping. + * <number of stripes> <chunk size (2^^n)> [<dev_path> <offset>]+ + */ +static int stripe_ctr(struct dm_target *ti, int argc, char **argv) +{ + struct stripe_c *sc; + sector_t width; + uint32_t stripes; + uint32_t chunk_size; + char *end; + int r, i; + + if (argc < 2) { + ti->error = "dm-stripe: Not enough arguments"; + return -EINVAL; + } + + stripes = simple_strtoul(argv[0], &end, 10); + if (*end) { + ti->error = "dm-stripe: Invalid stripe count"; + return -EINVAL; + } + + chunk_size = simple_strtoul(argv[1], &end, 10); + if (*end) { + ti->error = "dm-stripe: Invalid chunk_size"; + return -EINVAL; + } + + if (!multiple(ti->len, stripes, &width)) { + ti->error = "dm-stripe: Target length not divisable by " + "number of stripes"; + return -EINVAL; + } + + sc = alloc_context(stripes); + if (!sc) { + ti->error = "dm-stripe: Memory allocation for striped context " + "failed"; + return -ENOMEM; + } + + sc->stripes = stripes; + sc->stripe_width = width; + ti->split_io = chunk_size; + + /* + * chunk_size is a power of two + */ + if (!chunk_size || (chunk_size & (chunk_size - 1))) { + ti->error = "dm-stripe: Invalid chunk size"; + kfree(sc); + return -EINVAL; + } + + sc->chunk_mask = ((sector_t) chunk_size) - 1; + for (sc->chunk_shift = 0; chunk_size; sc->chunk_shift++) + chunk_size >>= 1; + sc->chunk_shift--; + + /* + * Get the stripe destinations. + */ + for (i = 0; i < stripes; i++) { + if (argc < 2) { + ti->error = "dm-stripe: Not enough destinations " + "specified"; + kfree(sc); + return -EINVAL; + } + + argv += 2; + + r = get_stripe(ti, sc, i, argv); + if (r < 0) { + ti->error = "dm-stripe: Couldn't parse stripe " + "destination"; + while (i--) + dm_put_device(ti, sc->stripe[i].dev); + kfree(sc); + return r; + } + } + + ti->private = sc; + return 0; +} + +static void stripe_dtr(struct dm_target *ti) +{ + unsigned int i; + struct stripe_c *sc = (struct stripe_c *) ti->private; + + for (i = 0; i < sc->stripes; i++) + dm_put_device(ti, sc->stripe[i].dev); + + kfree(sc); +} + +static int stripe_map(struct dm_target *ti, struct bio *bio) +{ + struct stripe_c *sc = (struct stripe_c *) ti->private; + + sector_t offset = bio->bi_sector - ti->begin; + uint32_t chunk = (uint32_t) (offset >> sc->chunk_shift); + uint32_t stripe = chunk % sc->stripes; /* 32bit modulus */ + chunk = chunk / sc->stripes; + + bio->bi_bdev = sc->stripe[stripe].dev->bdev; + bio->bi_sector = sc->stripe[stripe].physical_start + + (chunk << sc->chunk_shift) + (offset & sc->chunk_mask); + return 1; +} + +static int stripe_status(struct dm_target *ti, + status_type_t type, char *result, int maxlen) +{ + struct stripe_c *sc = (struct stripe_c *) ti->private; + int offset; + int i; + + switch (type) { + case STATUSTYPE_INFO: + result[0] = '\0'; + break; + + case STATUSTYPE_TABLE: + offset = snprintf(result, maxlen, "%d " SECTOR_FORMAT, + sc->stripes, sc->chunk_mask + 1); + for (i = 0; i < sc->stripes; i++) { + offset += + snprintf(result + offset, maxlen - offset, + " %s " SECTOR_FORMAT, + kdevname(to_kdev_t(sc->stripe[i].dev->bdev->bd_dev)), + sc->stripe[i].physical_start); + } + break; + } + return 0; +} + +static struct target_type stripe_target = { + .name = "striped", + .module = THIS_MODULE, + .ctr = stripe_ctr, + .dtr = stripe_dtr, + .map = stripe_map, + .status = stripe_status, +}; + +int __init dm_stripe_init(void) +{ + int r; + + r = dm_register_target(&stripe_target); + if (r < 0) + DMWARN("striped target registration failed"); + + return r; +} + +void dm_stripe_exit(void) +{ + if (dm_unregister_target(&stripe_target)) + DMWARN("striped target unregistration failed"); + + return; +} diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c new file mode 100644 index 000000000000..4178ac4ea1c3 --- /dev/null +++ b/drivers/md/dm-table.c @@ -0,0 +1,736 @@ +/* + * Copyright (C) 2001 Sistina Software (UK) Limited. + * + * This file is released under the GPL. + */ + +#include "dm.h" + +#include <linux/module.h> +#include <linux/vmalloc.h> +#include <linux/blkdev.h> +#include <linux/namei.h> +#include <linux/ctype.h> +#include <linux/slab.h> +#include <asm/atomic.h> + +#define MAX_DEPTH 16 +#define NODE_SIZE L1_CACHE_BYTES +#define KEYS_PER_NODE (NODE_SIZE / sizeof(sector_t)) +#define CHILDREN_PER_NODE (KEYS_PER_NODE + 1) + +struct dm_table { + atomic_t holders; + + /* btree table */ + int depth; + int counts[MAX_DEPTH]; /* in nodes */ + sector_t *index[MAX_DEPTH]; + + int num_targets; + int num_allocated; + sector_t *highs; + struct dm_target *targets; + + /* + * Indicates the rw permissions for the new logical + * device. This should be a combination of FMODE_READ + * and FMODE_WRITE. + */ + int mode; + + /* a list of devices used by this table */ + struct list_head devices; + + /* + * These are optimistic limits taken from all the + * targets, some targets will need smaller limits. + */ + struct io_restrictions limits; + + /* + * A waitqueue for processes waiting for something + * interesting to happen to this table. + */ + wait_queue_head_t eventq; +}; + +/* + * Ceiling(n / size) + */ +static inline unsigned long div_up(unsigned long n, unsigned long size) +{ + return dm_round_up(n, size) / size; +} + +/* + * Similar to ceiling(log_size(n)) + */ +static unsigned int int_log(unsigned long n, unsigned long base) +{ + int result = 0; + + while (n > 1) { + n = div_up(n, base); + result++; + } + + return result; +} + +#define __HIGH(l, r) if (*(l) < (r)) *(l) = (r) +#define __LOW(l, r) if (*(l) < (r)) *(l) = (r) + +/* + * Combine two io_restrictions, always taking the lower value. + */ + +static void combine_restrictions_low(struct io_restrictions *lhs, + struct io_restrictions *rhs) +{ + __LOW(&lhs->max_sectors, rhs->max_sectors); + __LOW(&lhs->max_phys_segments, rhs->max_phys_segments); + __LOW(&lhs->max_hw_segments, rhs->max_hw_segments); + __HIGH(&lhs->hardsect_size, rhs->hardsect_size); + __LOW(&lhs->max_segment_size, rhs->max_segment_size); + __LOW(&lhs->seg_boundary_mask, rhs->seg_boundary_mask); +} + +/* + * Calculate the index of the child node of the n'th node k'th key. + */ +static inline int get_child(int n, int k) +{ + return (n * CHILDREN_PER_NODE) + k; +} + +/* + * Return the n'th node of level l from table t. + */ +static inline sector_t *get_node(struct dm_table *t, int l, int n) +{ + return t->index[l] + (n * KEYS_PER_NODE); +} + +/* + * Return the highest key that you could lookup from the n'th + * node on level l of the btree. + */ +static sector_t high(struct dm_table *t, int l, int n) +{ + for (; l < t->depth - 1; l++) + n = get_child(n, CHILDREN_PER_NODE - 1); + + if (n >= t->counts[l]) + return (sector_t) - 1; + + return get_node(t, l, n)[KEYS_PER_NODE - 1]; +} + +/* + * Fills in a level of the btree based on the highs of the level + * below it. + */ +static int setup_btree_index(int l, struct dm_table *t) +{ + int n, k; + sector_t *node; + + for (n = 0; n < t->counts[l]; n++) { + node = get_node(t, l, n); + + for (k = 0; k < KEYS_PER_NODE; k++) + node[k] = high(t, l + 1, get_child(n, k)); + } + + return 0; +} + +/* + * highs, and targets are managed as dynamic arrays during a + * table load. + */ +static int alloc_targets(struct dm_table *t, int num) +{ + sector_t *n_highs; + struct dm_target *n_targets; + int n = t->num_targets; + + /* + * Allocate both the target array and offset array at once. + */ + n_highs = (sector_t *) vcalloc(sizeof(struct dm_target) + + sizeof(sector_t), + num); + if (!n_highs) + return -ENOMEM; + + n_targets = (struct dm_target *) (n_highs + num); + + if (n) { + memcpy(n_highs, t->highs, sizeof(*n_highs) * n); + memcpy(n_targets, t->targets, sizeof(*n_targets) * n); + } + + memset(n_highs + n, -1, sizeof(*n_highs) * (num - n)); + vfree(t->highs); + + t->num_allocated = num; + t->highs = n_highs; + t->targets = n_targets; + + return 0; +} + +int dm_table_create(struct dm_table **result, int mode) +{ + struct dm_table *t = kmalloc(sizeof(*t), GFP_NOIO); + + if (!t) + return -ENOMEM; + + memset(t, 0, sizeof(*t)); + INIT_LIST_HEAD(&t->devices); + atomic_set(&t->holders, 1); + + /* allocate a single nodes worth of targets to begin with */ + if (alloc_targets(t, KEYS_PER_NODE)) { + kfree(t); + t = NULL; + return -ENOMEM; + } + + init_waitqueue_head(&t->eventq); + t->mode = mode; + *result = t; + return 0; +} + +static void free_devices(struct list_head *devices) +{ + struct list_head *tmp, *next; + + for (tmp = devices->next; tmp != devices; tmp = next) { + struct dm_dev *dd = list_entry(tmp, struct dm_dev, list); + next = tmp->next; + kfree(dd); + } +} + +void table_destroy(struct dm_table *t) +{ + int i; + + DMWARN("destroying table"); + + /* destroying the table counts as an event */ + dm_table_event(t); + + /* free the indexes (see dm_table_complete) */ + if (t->depth >= 2) + vfree(t->index[t->depth - 2]); + + /* free the targets */ + for (i = 0; i < t->num_targets; i++) { + struct dm_target *tgt = &t->targets[i]; + + dm_put_target_type(t->targets[i].type); + + if (tgt->type->dtr) + tgt->type->dtr(tgt); + } + + vfree(t->highs); + + /* free the device list */ + if (t->devices.next != &t->devices) { + DMWARN("devices still present during destroy: " + "dm_table_remove_device calls missing"); + + free_devices(&t->devices); + } + + kfree(t); +} + +void dm_table_get(struct dm_table *t) +{ + atomic_inc(&t->holders); +} + +void dm_table_put(struct dm_table *t) +{ + if (atomic_dec_and_test(&t->holders)) + table_destroy(t); +} + +/* + * Checks to see if we need to extend highs or targets. + */ +static inline int check_space(struct dm_table *t) +{ + if (t->num_targets >= t->num_allocated) + return alloc_targets(t, t->num_allocated * 2); + + return 0; +} + +/* + * Convert a device path to a dev_t. + */ +static int lookup_device(const char *path, dev_t *dev) +{ + int r; + struct nameidata nd; + struct inode *inode; + + if ((r = path_lookup(path, LOOKUP_FOLLOW, &nd))) + return r; + + inode = nd.dentry->d_inode; + if (!inode) { + r = -ENOENT; + goto out; + } + + if (!S_ISBLK(inode->i_mode)) { + r = -EINVAL; + goto out; + } + + *dev = kdev_t_to_nr(inode->i_rdev); + + out: + path_release(&nd); + return r; +} + +/* + * See if we've already got a device in the list. + */ +static struct dm_dev *find_device(struct list_head *l, dev_t dev) +{ + struct list_head *tmp; + + list_for_each(tmp, l) { + struct dm_dev *dd = list_entry(tmp, struct dm_dev, list); + if (dd->bdev->bd_dev == dev) + return dd; + } + + return NULL; +} + +/* + * Open a device so we can use it as a map destination. + */ +static int open_dev(struct dm_dev *d, dev_t dev) +{ + static char *_claim_ptr = "I belong to device-mapper"; + + int r; + + if (d->bdev) + BUG(); + + d->bdev = bdget(dev); + if (!d->bdev) + return -ENOMEM; + + r = blkdev_get(d->bdev, d->mode, 0, BDEV_RAW); + if (!r) + return r; + + r = bd_claim(d->bdev, _claim_ptr); + if (r) { + blkdev_put(d->bdev, BDEV_RAW); + d->bdev = NULL; + } + + return r; +} + +/* + * Close a device that we've been using. + */ +static void close_dev(struct dm_dev *d) +{ + if (!d->bdev) + return; + + bd_release(d->bdev); + blkdev_put(d->bdev, BDEV_RAW); + d->bdev = NULL; +} + +/* + * If possible (ie. blk_size[major] is set), this checks an area + * of a destination device is valid. + */ +static int check_device_area(struct dm_dev *dd, sector_t start, sector_t len) +{ + sector_t dev_size; + dev_size = dd->bdev->bd_inode->i_size; + return ((start < dev_size) && (len <= (dev_size - start))); +} + +/* + * This upgrades the mode on an already open dm_dev. Being + * careful to leave things as they were if we fail to reopen the + * device. + */ +static int upgrade_mode(struct dm_dev *dd, int new_mode) +{ + int r; + struct dm_dev dd_copy; + dev_t dev = dd->bdev->bd_dev; + + memcpy(&dd_copy, dd, sizeof(dd_copy)); + + dd->mode |= new_mode; + dd->bdev = NULL; + r = open_dev(dd, dev); + if (!r) + close_dev(&dd_copy); + else + memcpy(dd, &dd_copy, sizeof(dd_copy)); + + return r; +} + +/* + * Add a device to the list, or just increment the usage count if + * it's already present. + */ +static int __table_get_device(struct dm_table *t, struct dm_target *ti, + const char *path, sector_t start, sector_t len, + int mode, struct dm_dev **result) +{ + int r; + dev_t dev; + struct dm_dev *dd; + int major, minor; + + if (!t) + BUG(); + + if (sscanf(path, "%x:%x", &major, &minor) == 2) { + /* Extract the major/minor numbers */ + dev = MKDEV(major, minor); + } else { + /* convert the path to a device */ + if ((r = lookup_device(path, &dev))) + return r; + } + + dd = find_device(&t->devices, dev); + if (!dd) { + dd = kmalloc(sizeof(*dd), GFP_KERNEL); + if (!dd) + return -ENOMEM; + + dd->mode = mode; + dd->bdev = NULL; + + if ((r = open_dev(dd, dev))) { + kfree(dd); + return r; + } + + atomic_set(&dd->count, 0); + list_add(&dd->list, &t->devices); + + } else if (dd->mode != (mode | dd->mode)) { + r = upgrade_mode(dd, mode); + if (r) + return r; + } + atomic_inc(&dd->count); + + if (!check_device_area(dd, start, len)) { + DMWARN("device %s too small for target", path); + dm_put_device(ti, dd); + return -EINVAL; + } + + *result = dd; + + return 0; +} + + +int dm_get_device(struct dm_target *ti, const char *path, sector_t start, + sector_t len, int mode, struct dm_dev **result) +{ + int r = __table_get_device(ti->table, ti, path, + start, len, mode, result); + if (!r) { + request_queue_t *q = bdev_get_queue((*result)->bdev); + struct io_restrictions *rs = &ti->limits; + + /* combine the device limits low */ + __LOW(&rs->max_sectors, q->max_sectors); + __LOW(&rs->max_phys_segments, q->max_phys_segments); + __LOW(&rs->max_hw_segments, q->max_hw_segments); + __HIGH(&rs->hardsect_size, q->hardsect_size); + __LOW(&rs->max_segment_size, q->max_segment_size); + __LOW(&rs->seg_boundary_mask, q->seg_boundary_mask); + } + + return r; +} + +/* + * Decrement a devices use count and remove it if neccessary. + */ +void dm_put_device(struct dm_target *ti, struct dm_dev *dd) +{ + if (atomic_dec_and_test(&dd->count)) { + close_dev(dd); + list_del(&dd->list); + kfree(dd); + } +} + +/* + * Checks to see if the target joins onto the end of the table. + */ +static int adjoin(struct dm_table *table, struct dm_target *ti) +{ + struct dm_target *prev; + + if (!table->num_targets) + return !ti->begin; + + prev = &table->targets[table->num_targets - 1]; + return (ti->begin == (prev->begin + prev->len)); +} + +/* + * Destructively splits up the argument list to pass to ctr. + */ +static int split_args(int max, int *argc, char **argv, char *input) +{ + char *start, *end = input, *out; + *argc = 0; + + while (1) { + start = end; + + /* Skip whitespace */ + while (*start && isspace(*start)) + start++; + + if (!*start) + break; /* success, we hit the end */ + + /* 'out' is used to remove any back-quotes */ + end = out = start; + while (*end) { + /* Everything apart from '\0' can be quoted */ + if (*end == '\\' && *(end + 1)) { + *out++ = *(end + 1); + end += 2; + continue; + } + + if (isspace(*end)) + break; /* end of token */ + + *out++ = *end++; + } + + /* have we already filled the array ? */ + if ((*argc + 1) > max) + return -EINVAL; + + /* we know this is whitespace */ + if (*end) + end++; + + /* terminate the string and put it in the array */ + *out = '\0'; + argv[*argc] = start; + (*argc)++; + } + + return 0; +} + +int dm_table_add_target(struct dm_table *t, const char *type, + sector_t start, sector_t len, char *params) +{ + int r, argc; + char *argv[32]; + struct target_type *tt; + struct dm_target *tgt; + + if ((r = check_space(t))) + return r; + + tgt = t->targets + t->num_targets; + memset(tgt, 0, sizeof(*tgt)); + + tt = dm_get_target_type(type); + if (!tt) { + tgt->error = "unknown target type"; + return -EINVAL; + } + + tgt->table = t; + tgt->type = tt; + tgt->begin = start; + tgt->len = len; + tgt->error = "Unknown error"; + + /* + * Does this target adjoin the previous one ? + */ + if (!adjoin(t, tgt)) { + DMERR("Gap in table"); + dm_put_target_type(tt); + return -EINVAL; + } + + r = split_args(ARRAY_SIZE(argv), &argc, argv, params); + if (r) { + tgt->error = "couldn't split parameters"; + dm_put_target_type(tt); + return r; + } + + r = tt->ctr(tgt, argc, argv); + if (r) { + dm_put_target_type(tt); + return r; + } + + t->highs[t->num_targets++] = tgt->begin + tgt->len - 1; + + /* FIXME: the plan is to combine high here and then have + * the merge fn apply the target level restrictions. */ + combine_restrictions_low(&t->limits, &tgt->limits); + return 0; +} + +static int setup_indexes(struct dm_table *t) +{ + int i, total = 0; + sector_t *indexes; + + /* allocate the space for *all* the indexes */ + for (i = t->depth - 2; i >= 0; i--) { + t->counts[i] = div_up(t->counts[i + 1], CHILDREN_PER_NODE); + total += t->counts[i]; + } + + indexes = (sector_t *) vcalloc(total, (unsigned long) NODE_SIZE); + if (!indexes) + return -ENOMEM; + + /* set up internal nodes, bottom-up */ + for (i = t->depth - 2, total = 0; i >= 0; i--) { + t->index[i] = indexes; + indexes += (KEYS_PER_NODE * t->counts[i]); + setup_btree_index(i, t); + } + + return 0; +} + +/* + * Builds the btree to index the map. + */ +int dm_table_complete(struct dm_table *t) +{ + int leaf_nodes, r = 0; + + /* how many indexes will the btree have ? */ + leaf_nodes = div_up(t->num_targets, KEYS_PER_NODE); + t->depth = 1 + int_log(leaf_nodes, CHILDREN_PER_NODE); + + /* leaf layer has already been set up */ + t->counts[t->depth - 1] = leaf_nodes; + t->index[t->depth - 1] = t->highs; + + if (t->depth >= 2) + r = setup_indexes(t); + + return r; +} + +void dm_table_event(struct dm_table *t) +{ + wake_up_interruptible(&t->eventq); +} + +sector_t dm_table_get_size(struct dm_table *t) +{ + return t->num_targets ? (t->highs[t->num_targets - 1] + 1) : 0; +} + +struct dm_target *dm_table_get_target(struct dm_table *t, int index) +{ + if (index > t->num_targets) + return NULL; + + return t->targets + index; +} + +/* + * Search the btree for the correct target. + */ +struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector) +{ + int l, n = 0, k = 0; + sector_t *node; + + for (l = 0; l < t->depth; l++) { + n = get_child(n, k); + node = get_node(t, l, n); + + for (k = 0; k < KEYS_PER_NODE; k++) + if (node[k] >= sector) + break; + } + + return &t->targets[(KEYS_PER_NODE * n) + k]; +} + +void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q) +{ + /* + * Make sure we obey the optimistic sub devices + * restrictions. + */ + q->max_sectors = t->limits.max_sectors; + q->max_phys_segments = t->limits.max_phys_segments; + q->max_hw_segments = t->limits.max_hw_segments; + q->hardsect_size = t->limits.hardsect_size; + q->max_segment_size = t->limits.max_segment_size; + q->seg_boundary_mask = t->limits.seg_boundary_mask; +} + +unsigned int dm_table_get_num_targets(struct dm_table *t) +{ + return t->num_targets; +} + +struct list_head *dm_table_get_devices(struct dm_table *t) +{ + return &t->devices; +} + +int dm_table_get_mode(struct dm_table *t) +{ + return t->mode; +} + +void dm_table_add_wait_queue(struct dm_table *t, wait_queue_t *wq) +{ + add_wait_queue(&t->eventq, wq); +} + +EXPORT_SYMBOL(dm_get_device); +EXPORT_SYMBOL(dm_put_device); +EXPORT_SYMBOL(dm_table_event); diff --git a/drivers/md/dm-target.c b/drivers/md/dm-target.c new file mode 100644 index 000000000000..6bf8310ac1e9 --- /dev/null +++ b/drivers/md/dm-target.c @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2001 Sistina Software (UK) Limited + * + * This file is released under the GPL. + */ + +#include "dm.h" + +#include <linux/module.h> +#include <linux/kmod.h> +#include <linux/bio.h> +#include <linux/slab.h> + +struct tt_internal { + struct target_type tt; + + struct list_head list; + long use; +}; + +static LIST_HEAD(_targets); +static rwlock_t _lock = RW_LOCK_UNLOCKED; + +#define DM_MOD_NAME_SIZE 32 + +static inline struct tt_internal *__find_target_type(const char *name) +{ + struct list_head *tih; + struct tt_internal *ti; + + list_for_each(tih, &_targets) { + ti = list_entry(tih, struct tt_internal, list); + + if (!strcmp(name, ti->tt.name)) + return ti; + } + + return NULL; +} + +static struct tt_internal *get_target_type(const char *name) +{ + struct tt_internal *ti; + + read_lock(&_lock); + ti = __find_target_type(name); + + if (ti) { + if (ti->use == 0 && ti->tt.module) + __MOD_INC_USE_COUNT(ti->tt.module); + ti->use++; + } + read_unlock(&_lock); + + return ti; +} + +static void load_module(const char *name) +{ + char module_name[DM_MOD_NAME_SIZE] = "dm-"; + + /* Length check for strcat() below */ + if (strlen(name) > (DM_MOD_NAME_SIZE - 4)) + return; + + strcat(module_name, name); + request_module(module_name); + + return; +} + +struct target_type *dm_get_target_type(const char *name) +{ + struct tt_internal *ti = get_target_type(name); + + if (!ti) { + load_module(name); + ti = get_target_type(name); + } + + return ti ? &ti->tt : NULL; +} + +void dm_put_target_type(struct target_type *t) +{ + struct tt_internal *ti = (struct tt_internal *) t; + + read_lock(&_lock); + if (--ti->use == 0 && ti->tt.module) + __MOD_DEC_USE_COUNT(ti->tt.module); + + if (ti->use < 0) + BUG(); + read_unlock(&_lock); + + return; +} + +static struct tt_internal *alloc_target(struct target_type *t) +{ + struct tt_internal *ti = kmalloc(sizeof(*ti), GFP_KERNEL); + + if (ti) { + memset(ti, 0, sizeof(*ti)); + ti->tt = *t; + } + + return ti; +} + +int dm_register_target(struct target_type *t) +{ + int rv = 0; + struct tt_internal *ti = alloc_target(t); + + if (!ti) + return -ENOMEM; + + write_lock(&_lock); + if (__find_target_type(t->name)) + rv = -EEXIST; + else + list_add(&ti->list, &_targets); + + write_unlock(&_lock); + return rv; +} + +int dm_unregister_target(struct target_type *t) +{ + struct tt_internal *ti; + + write_lock(&_lock); + if (!(ti = __find_target_type(t->name))) { + write_unlock(&_lock); + return -EINVAL; + } + + if (ti->use) { + write_unlock(&_lock); + return -ETXTBSY; + } + + list_del(&ti->list); + kfree(ti); + + write_unlock(&_lock); + return 0; +} + +/* + * io-err: always fails an io, useful for bringing + * up LVs that have holes in them. + */ +static int io_err_ctr(struct dm_target *ti, int argc, char **args) +{ + return 0; +} + +static void io_err_dtr(struct dm_target *ti) +{ + /* empty */ + return; +} + +static int io_err_map(struct dm_target *ti, struct bio *bio) +{ + bio_io_error(bio, 0); + return 0; +} + +static struct target_type error_target = { + .name = "error", + .ctr = io_err_ctr, + .dtr = io_err_dtr, + .map = io_err_map, +}; + +int dm_target_init(void) +{ + return dm_register_target(&error_target); +} + +void dm_target_exit(void) +{ + if (dm_unregister_target(&error_target)) + DMWARN("error target unregistration failed"); +} + +EXPORT_SYMBOL(dm_register_target); +EXPORT_SYMBOL(dm_unregister_target); diff --git a/drivers/md/dm.c b/drivers/md/dm.c new file mode 100644 index 000000000000..fd13e2007f6a --- /dev/null +++ b/drivers/md/dm.c @@ -0,0 +1,796 @@ +/* + * Copyright (C) 2001, 2002 Sistina Software (UK) Limited. + * + * This file is released under the GPL. + */ + +#include "dm.h" + +#include <linux/init.h> +#include <linux/module.h> +#include <linux/blk.h> +#include <linux/blkpg.h> +#include <linux/bio.h> +#include <linux/mempool.h> +#include <linux/slab.h> + +static const char *_name = DM_NAME; +#define MAX_DEVICES 256 +#define SECTOR_SHIFT 9 + +static int major = 0; +static int _major = 0; + +struct dm_io { + struct mapped_device *md; + int error; + struct bio *bio; + atomic_t io_count; +}; + +struct deferred_io { + struct bio *bio; + struct deferred_io *next; +}; + +/* + * Bits for the md->flags field. + */ +#define DMF_BLOCK_IO 0 +#define DMF_SUSPENDED 1 + +struct mapped_device { + struct rw_semaphore lock; + + kdev_t kdev; + atomic_t holders; + + unsigned long flags; + + request_queue_t queue; + struct gendisk *disk; + + /* + * A list of ios that arrived while we were suspended. + */ + atomic_t pending; + wait_queue_head_t wait; + struct deferred_io *deferred; + + /* + * The current mapping. + */ + struct dm_table *map; +}; + +#define MIN_IOS 256 +static kmem_cache_t *_io_cache; +static mempool_t *_io_pool; + +static __init int local_init(void) +{ + int r; + + /* allocate a slab for the dm_ios */ + _io_cache = kmem_cache_create("dm io", + sizeof(struct dm_io), 0, 0, NULL, NULL); + if (!_io_cache) + return -ENOMEM; + + _io_pool = mempool_create(MIN_IOS, mempool_alloc_slab, + mempool_free_slab, _io_cache); + if (!_io_pool) { + kmem_cache_destroy(_io_cache); + return -ENOMEM; + } + + _major = major; + r = register_blkdev(_major, _name, &dm_blk_dops); + if (r < 0) { + DMERR("register_blkdev failed"); + mempool_destroy(_io_pool); + kmem_cache_destroy(_io_cache); + return r; + } + + if (!_major) + _major = r; + + return 0; +} + +static void local_exit(void) +{ + mempool_destroy(_io_pool); + kmem_cache_destroy(_io_cache); + + if (unregister_blkdev(_major, _name) < 0) + DMERR("devfs_unregister_blkdev failed"); + + _major = 0; + + DMINFO("cleaned up"); +} + +/* + * We have a lot of init/exit functions, so it seems easier to + * store them in an array. The disposable macro 'xx' + * expands a prefix into a pair of function names. + */ +static struct { + int (*init) (void); + void (*exit) (void); + +} _inits[] = { +#define xx(n) {n ## _init, n ## _exit}, + xx(local) + xx(dm_target) + xx(dm_linear) + xx(dm_stripe) + xx(dm_interface) +#undef xx +}; + +static int __init dm_init(void) +{ + const int count = ARRAY_SIZE(_inits); + + int r, i; + + for (i = 0; i < count; i++) { + r = _inits[i].init(); + if (r) + goto bad; + } + + return 0; + + bad: + while (i--) + _inits[i].exit(); + + return r; +} + +static void __exit dm_exit(void) +{ + int i = ARRAY_SIZE(_inits); + + while (i--) + _inits[i].exit(); +} + +/* + * Block device functions + */ +static int dm_blk_open(struct inode *inode, struct file *file) +{ + struct mapped_device *md; + + md = inode->i_bdev->bd_disk->private_data; + dm_get(md); + return 0; +} + +static int dm_blk_close(struct inode *inode, struct file *file) +{ + struct mapped_device *md; + + md = inode->i_bdev->bd_disk->private_data; + dm_put(md); + return 0; +} + +static inline struct dm_io *alloc_io(void) +{ + return mempool_alloc(_io_pool, GFP_NOIO); +} + +static inline void free_io(struct dm_io *io) +{ + mempool_free(io, _io_pool); +} + +static inline struct deferred_io *alloc_deferred(void) +{ + return kmalloc(sizeof(struct deferred_io), GFP_NOIO); +} + +static inline void free_deferred(struct deferred_io *di) +{ + kfree(di); +} + +/* + * Add the bio to the list of deferred io. + */ +static int queue_io(struct mapped_device *md, struct bio *bio) +{ + struct deferred_io *di; + + di = alloc_deferred(); + if (!di) + return -ENOMEM; + + down_write(&md->lock); + + if (!test_bit(DMF_SUSPENDED, &md->flags)) { + up_write(&md->lock); + free_deferred(di); + return 1; + } + + di->bio = bio; + di->next = md->deferred; + md->deferred = di; + + up_write(&md->lock); + return 0; /* deferred successfully */ +} + +/*----------------------------------------------------------------- + * CRUD START: + * A more elegant soln is in the works that uses the queue + * merge fn, unfortunately there are a couple of changes to + * the block layer that I want to make for this. So in the + * interests of getting something for people to use I give + * you this clearly demarcated crap. + *---------------------------------------------------------------*/ + +/* + * Decrements the number of outstanding ios that a bio has been + * cloned into, completing the original io if necc. + */ +static inline void dec_pending(struct dm_io *io, int error) +{ + static spinlock_t _uptodate_lock = SPIN_LOCK_UNLOCKED; + unsigned long flags; + + spin_lock_irqsave(&_uptodate_lock, flags); + if (error) + io->error = error; + spin_unlock_irqrestore(&_uptodate_lock, flags); + + if (atomic_dec_and_test(&io->io_count)) { + if (atomic_dec_and_test(&io->md->pending)) + /* nudge anyone waiting on suspend queue */ + wake_up(&io->md->wait); + + bio_endio(io->bio, io->error ? 0 : io->bio->bi_size, io->error); + free_io(io); + } +} + +static int clone_endio(struct bio *bio, unsigned int done, int error) +{ + struct dm_io *io = bio->bi_private; + + /* + * Only call dec_pending if the clone has completely + * finished. If a partial io errors I'm assuming it won't + * be requeued. FIXME: check this. + */ + if (error || !bio->bi_size) { + dec_pending(io, error); + bio_put(bio); + } + + return 0; +} + + +static sector_t max_io_len(struct mapped_device *md, + sector_t sector, struct dm_target *ti) +{ + sector_t len = ti->len; + + /* FIXME: obey io_restrictions ! */ + + /* + * Does the target need to split even further ? + */ + if (ti->split_io) { + sector_t boundary; + sector_t offset = sector - ti->begin; + boundary = dm_round_up(offset + 1, ti->split_io) - offset; + + if (len > boundary) + len = boundary; + } + + return len; +} + +static void __map_bio(struct dm_target *ti, struct bio *clone) +{ + struct dm_io *io = clone->bi_private; + int r; + + /* + * Sanity checks. + */ + if (!clone->bi_size) + BUG(); + + /* + * Map the clone. If r == 0 we don't need to do + * anything, the target has assumed ownership of + * this io. + */ + atomic_inc(&io->md->pending); + atomic_inc(&io->io_count); + r = ti->type->map(ti, clone); + if (r > 0) + /* the bio has been remapped so dispatch it */ + generic_make_request(clone); + + else if (r < 0) + /* error the io and bail out */ + dec_pending(io, -EIO); +} + +struct clone_info { + struct mapped_device *md; + struct bio *bio; + struct dm_io *io; + sector_t sector; + sector_t sector_count; + unsigned short idx; +}; + +/* + * Issues a little bio that just does the back end of a split page. + */ +static void __split_page(struct clone_info *ci, unsigned int len) +{ + struct dm_target *ti = dm_table_find_target(ci->md->map, ci->sector); + struct bio *clone, *bio = ci->bio; + struct bio_vec *bv = bio->bi_io_vec + (bio->bi_vcnt - 1); + + DMWARN("splitting page"); + + if (len > ci->sector_count) + len = ci->sector_count; + + clone = bio_alloc(GFP_NOIO, 1); + memcpy(clone->bi_io_vec, bv, sizeof(*bv)); + + clone->bi_sector = ci->sector; + clone->bi_bdev = bio->bi_bdev; + clone->bi_flags = bio->bi_flags | (1 << BIO_SEG_VALID); + clone->bi_rw = bio->bi_rw; + clone->bi_size = len << SECTOR_SHIFT; + clone->bi_end_io = clone_endio; + clone->bi_private = ci->io; + + ci->sector += len; + ci->sector_count -= len; + + __map_bio(ti, clone); +} + +static void __clone_and_map(struct clone_info *ci) +{ + struct bio *clone, *bio = ci->bio; + struct dm_target *ti = dm_table_find_target(ci->md->map, ci->sector); + sector_t len = max_io_len(ci->md, bio->bi_sector, ti); + + /* shorter than current target ? */ + if (ci->sector_count < len) + len = ci->sector_count; + + /* create the clone */ + clone = bio_clone(ci->bio, GFP_NOIO); + clone->bi_sector = ci->sector; + clone->bi_idx = ci->idx; + clone->bi_size = len << SECTOR_SHIFT; + clone->bi_end_io = clone_endio; + clone->bi_private = ci->io; + + /* adjust the remaining io */ + ci->sector += len; + ci->sector_count -= len; + __map_bio(ti, clone); + + /* + * If we are not performing all remaining io in this + * clone then we need to calculate ci->idx for the next + * time round. + */ + if (ci->sector_count) { + while (len) { + struct bio_vec *bv = clone->bi_io_vec + ci->idx; + sector_t bv_len = bv->bv_len >> SECTOR_SHIFT; + if (bv_len <= len) + len -= bv_len; + + else { + __split_page(ci, bv_len - len); + len = 0; + } + ci->idx++; + } + } +} + +/* + * Split the bio into several clones. + */ +static void __split_bio(struct mapped_device *md, struct bio *bio) +{ + struct clone_info ci; + + ci.md = md; + ci.bio = bio; + ci.io = alloc_io(); + ci.io->error = 0; + atomic_set(&ci.io->io_count, 1); + ci.io->bio = bio; + ci.io->md = md; + ci.sector = bio->bi_sector; + ci.sector_count = bio_sectors(bio); + ci.idx = 0; + + while (ci.sector_count) + __clone_and_map(&ci); + + /* drop the extra reference count */ + dec_pending(ci.io, 0); +} +/*----------------------------------------------------------------- + * CRUD END + *---------------------------------------------------------------*/ + + +/* + * The request function that just remaps the bio built up by + * dm_merge_bvec. + */ +static int dm_request(request_queue_t *q, struct bio *bio) +{ + int r; + struct mapped_device *md = q->queuedata; + + down_read(&md->lock); + + /* + * If we're suspended we have to queue + * this io for later. + */ + while (test_bit(DMF_BLOCK_IO, &md->flags)) { + up_read(&md->lock); + + if (bio_rw(bio) == READA) { + bio_io_error(bio, 0); + return 0; + } + + r = queue_io(md, bio); + if (r < 0) { + bio_io_error(bio, 0); + return 0; + + } else if (r == 0) + return 0; /* deferred successfully */ + + /* + * We're in a while loop, because someone could suspend + * before we get to the following read lock. + */ + down_read(&md->lock); + } + + __split_bio(md, bio); + up_read(&md->lock); + return 0; +} + +/* + * See if the device with a specific minor # is free. + */ +static int specific_dev(int minor, struct mapped_device *md) +{ + struct gendisk *disk; + int part; + + if (minor >= MAX_DEVICES) { + DMWARN("request for a mapped_device beyond MAX_DEVICES (%d)", + MAX_DEVICES); + return -EINVAL; + } + + disk = get_gendisk(MKDEV(_major, minor), &part); + if (disk) { + put_disk(disk); + return -EBUSY; + } + + return minor; +} + +static int any_old_dev(struct mapped_device *md) +{ + int i; + + for (i = 0; i < MAX_DEVICES; i++) + if (specific_dev(i, md) >= 0) { + DMWARN("allocating minor = %d", i); + return i; + } + + return -EBUSY; +} + +/* + * Allocate and initialise a blank device with a given minor. + */ +static struct mapped_device *alloc_dev(int minor) +{ + struct mapped_device *md = kmalloc(sizeof(*md), GFP_KERNEL); + + if (!md) { + DMWARN("unable to allocate device, out of memory."); + return NULL; + } + + /* get a minor number for the dev */ + minor = (minor < 0) ? any_old_dev(md) : specific_dev(minor, md); + if (minor < 0) { + kfree(md); + return NULL; + } + + memset(md, 0, sizeof(*md)); + init_rwsem(&md->lock); + md->kdev = mk_kdev(_major, minor); + atomic_set(&md->holders, 1); + + md->queue.queuedata = md; + blk_queue_make_request(&md->queue, dm_request); + + md->disk = alloc_disk(1); + if (!md->disk) { + kfree(md); + return NULL; + } + + md->disk->major = _major; + md->disk->first_minor = minor; + md->disk->fops = &dm_blk_dops; + md->disk->queue = &md->queue; + md->disk->private_data = md; + sprintf(md->disk->disk_name, "dm-%d", minor); + add_disk(md->disk); + + atomic_set(&md->pending, 0); + init_waitqueue_head(&md->wait); + return md; +} + +static void free_dev(struct mapped_device *md) +{ + del_gendisk(md->disk); + put_disk(md->disk); + kfree(md); +} + +/* + * Bind a table to the device. + */ +static int __bind(struct mapped_device *md, struct dm_table *t) +{ + request_queue_t *q = &md->queue; + sector_t size; + md->map = t; + + size = dm_table_get_size(t); + set_capacity(md->disk, size); + if (size == 0) + return 0; + + dm_table_get(t); + dm_table_set_restrictions(t, q); + return 0; +} + +static void __unbind(struct mapped_device *md) +{ + dm_table_put(md->map); + md->map = NULL; + set_capacity(md->disk, 0); +} + +/* + * Constructor for a new device. + */ +int dm_create(int minor, struct dm_table *table, struct mapped_device **result) +{ + int r; + struct mapped_device *md; + + md = alloc_dev(minor); + if (!md) + return -ENXIO; + + r = __bind(md, table); + if (r) { + free_dev(md); + return r; + } + + *result = md; + return 0; +} + +void dm_get(struct mapped_device *md) +{ + atomic_inc(&md->holders); +} + +void dm_put(struct mapped_device *md) +{ + if (atomic_dec_and_test(&md->holders)) { + DMWARN("destroying md"); + __unbind(md); + free_dev(md); + } +} + +/* + * Requeue the deferred bios by calling generic_make_request. + */ +static void flush_deferred_io(struct deferred_io *c) +{ + struct deferred_io *n; + + while (c) { + n = c->next; + generic_make_request(c->bio); + free_deferred(c); + c = n; + } +} + +/* + * Swap in a new table (destroying old one). + */ +int dm_swap_table(struct mapped_device *md, struct dm_table *table) +{ + int r; + + down_write(&md->lock); + + /* device must be suspended */ + if (!test_bit(DMF_SUSPENDED, &md->flags)) { + up_write(&md->lock); + return -EPERM; + } + + __unbind(md); + r = __bind(md, table); + if (r) + return r; + + up_write(&md->lock); + return 0; +} + +/* + * We need to be able to change a mapping table under a mounted + * filesystem. For example we might want to move some data in + * the background. Before the table can be swapped with + * dm_bind_table, dm_suspend must be called to flush any in + * flight bios and ensure that any further io gets deferred. + */ +int dm_suspend(struct mapped_device *md) +{ + DECLARE_WAITQUEUE(wait, current); + + down_write(&md->lock); + + /* + * First we set the BLOCK_IO flag so no more ios will be + * mapped. + */ + if (test_bit(DMF_BLOCK_IO, &md->flags)) { + up_write(&md->lock); + return -EINVAL; + } + + set_bit(DMF_BLOCK_IO, &md->flags); + up_write(&md->lock); + + /* + * Then we wait for the already mapped ios to + * complete. + */ + down_read(&md->lock); + + add_wait_queue(&md->wait, &wait); + while (1) { + set_current_state(TASK_INTERRUPTIBLE); + + if (!atomic_read(&md->pending)) + break; + + yield(); + } + + current->state = TASK_RUNNING; + remove_wait_queue(&md->wait, &wait); + up_read(&md->lock); + + /* set_bit is atomic */ + set_bit(DMF_SUSPENDED, &md->flags); + + return 0; +} + +int dm_resume(struct mapped_device *md) +{ + struct deferred_io *def; + + down_write(&md->lock); + if (!test_bit(DMF_SUSPENDED, &md->flags) || + !dm_table_get_size(md->map)) { + up_write(&md->lock); + return -EINVAL; + } + + clear_bit(DMF_SUSPENDED, &md->flags); + clear_bit(DMF_BLOCK_IO, &md->flags); + def = md->deferred; + md->deferred = NULL; + up_write(&md->lock); + + flush_deferred_io(def); + blk_run_queues(); + + return 0; +} + +kdev_t dm_kdev(struct mapped_device *md) +{ + kdev_t dev; + + down_read(&md->lock); + dev = md->kdev; + up_read(&md->lock); + + return dev; +} + +struct dm_table *dm_get_table(struct mapped_device *md) +{ + struct dm_table *t; + + down_read(&md->lock); + t = md->map; + dm_table_get(t); + up_read(&md->lock); + + return t; +} + +int dm_suspended(struct mapped_device *md) +{ + return test_bit(DMF_SUSPENDED, &md->flags); +} + +struct block_device_operations dm_blk_dops = { + .open = dm_blk_open, + .release = dm_blk_close, + .owner = THIS_MODULE +}; + +/* + * module hooks + */ +module_init(dm_init); +module_exit(dm_exit); + +MODULE_PARM(major, "i"); +MODULE_PARM_DESC(major, "The major number of the device mapper"); +MODULE_DESCRIPTION(DM_NAME " driver"); +MODULE_AUTHOR("Joe Thornber <thornber@sistina.com>"); +MODULE_LICENSE("GPL"); diff --git a/drivers/md/dm.h b/drivers/md/dm.h new file mode 100644 index 000000000000..9f6f72236e5a --- /dev/null +++ b/drivers/md/dm.h @@ -0,0 +1,148 @@ +/* + * Internal header file for device mapper + * + * Copyright (C) 2001, 2002 Sistina Software + * + * This file is released under the LGPL. + */ + +#ifndef DM_INTERNAL_H +#define DM_INTERNAL_H + +#include <linux/fs.h> +#include <linux/device-mapper.h> +#include <linux/list.h> +#include <linux/blkdev.h> + +#define DM_NAME "device-mapper" +#define DMWARN(f, x...) printk(KERN_WARNING DM_NAME ": " f "\n" , ## x) +#define DMERR(f, x...) printk(KERN_ERR DM_NAME ": " f "\n" , ## x) +#define DMINFO(f, x...) printk(KERN_INFO DM_NAME ": " f "\n" , ## x) + +/* + * FIXME: I think this should be with the definition of sector_t + * in types.h. + */ +#ifdef CONFIG_LBD +#define SECTOR_FORMAT "%Lu" +#else +#define SECTOR_FORMAT "%lu" +#endif + +extern struct block_device_operations dm_blk_dops; + +/* + * List of devices that a metadevice uses and should open/close. + */ +struct dm_dev { + struct list_head list; + + atomic_t count; + int mode; + struct block_device *bdev; +}; + +struct dm_table; +struct mapped_device; + +/*----------------------------------------------------------------- + * Functions for manipulating a struct mapped_device. + * Drop the reference with dm_put when you finish with the object. + *---------------------------------------------------------------*/ +int dm_create(int minor, struct dm_table *table, struct mapped_device **md); + +/* + * Reference counting for md. + */ +void dm_get(struct mapped_device *md); +void dm_put(struct mapped_device *md); + +/* + * A device can still be used while suspended, but I/O is deferred. + */ +int dm_suspend(struct mapped_device *md); +int dm_resume(struct mapped_device *md); + +/* + * The device must be suspended before calling this method. + */ +int dm_swap_table(struct mapped_device *md, struct dm_table *t); + +/* + * Drop a reference on the table when you've finished with the + * result. + */ +struct dm_table *dm_get_table(struct mapped_device *md); + +/* + * Info functions. + */ +kdev_t dm_kdev(struct mapped_device *md); +int dm_suspended(struct mapped_device *md); + +/*----------------------------------------------------------------- + * Functions for manipulating a table. Tables are also reference + * counted. + *---------------------------------------------------------------*/ +int dm_table_create(struct dm_table **result, int mode); + +void dm_table_get(struct dm_table *t); +void dm_table_put(struct dm_table *t); + +int dm_table_add_target(struct dm_table *t, const char *type, + sector_t start, sector_t len, char *params); +int dm_table_complete(struct dm_table *t); +void dm_table_event(struct dm_table *t); +sector_t dm_table_get_size(struct dm_table *t); +struct dm_target *dm_table_get_target(struct dm_table *t, int index); +struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector); +void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q); +unsigned int dm_table_get_num_targets(struct dm_table *t); +struct list_head *dm_table_get_devices(struct dm_table *t); +int dm_table_get_mode(struct dm_table *t); +void dm_table_add_wait_queue(struct dm_table *t, wait_queue_t *wq); + +/*----------------------------------------------------------------- + * A registry of target types. + *---------------------------------------------------------------*/ +int dm_target_init(void); +void dm_target_exit(void); +struct target_type *dm_get_target_type(const char *name); +void dm_put_target_type(struct target_type *t); + + +/*----------------------------------------------------------------- + * Useful inlines. + *---------------------------------------------------------------*/ +static inline int array_too_big(unsigned long fixed, unsigned long obj, + unsigned long num) +{ + return (num > (ULONG_MAX - fixed) / obj); +} + +/* + * ceiling(n / size) * size + */ +static inline unsigned long dm_round_up(unsigned long n, unsigned long size) +{ + unsigned long r = n % size; + return n + (r ? (size - r) : 0); +} + +/* + * The device-mapper can be driven through one of two interfaces; + * ioctl or filesystem, depending which patch you have applied. + */ +int dm_interface_init(void); +void dm_interface_exit(void); + +/* + * Targets for linear and striped mappings + */ +int dm_linear_init(void); +void dm_linear_exit(void); + +int dm_stripe_init(void); +void dm_stripe_exit(void); + +#endif diff --git a/drivers/media/Config.in b/drivers/media/Config.in index ad64c65d4ba5..67b663158c03 100644 --- a/drivers/media/Config.in +++ b/drivers/media/Config.in @@ -8,6 +8,7 @@ tristate 'Video For Linux' CONFIG_VIDEO_DEV if [ "$CONFIG_VIDEO_DEV" != "n" ]; then source drivers/media/video/Config.in source drivers/media/radio/Config.in + source drivers/media/dvb/Config.in fi endmenu diff --git a/drivers/media/Makefile b/drivers/media/Makefile index 2e8e5e21d82f..37556733e5a8 100644 --- a/drivers/media/Makefile +++ b/drivers/media/Makefile @@ -2,6 +2,6 @@ # Makefile for the kernel multimedia device drivers. # -obj-y := video/ radio/ +obj-y := video/ radio/ dvb/ include $(TOPDIR)/Rules.make diff --git a/drivers/media/dvb/Config.help b/drivers/media/dvb/Config.help new file mode 100644 index 000000000000..d2699b18f31a --- /dev/null +++ b/drivers/media/dvb/Config.help @@ -0,0 +1,21 @@ +CONFIG_DVB + Support Digital Video Broadcasting hardware. Enable this if you + own a DVB adapter and want to use it or if you compile Linux for + a digital SetTopBox. + + API specs and user tools and are available for example from + <http://www.linuxtv.org/>. + + Please report problems regarding this driver to the LinuxDVB + mailing list. + + You might want add the following lines to your /etc/modules.conf: + + alias char-major-250 dvb + alias dvb dvb-ttpci + below dvb-ttpci alps_bsru6 alps_bsrv2 \ + grundig_29504-401 grundig_29504-491 \ + ves1820 + + If unsure say N. + diff --git a/drivers/media/dvb/Config.in b/drivers/media/dvb/Config.in new file mode 100644 index 000000000000..40cce4668b71 --- /dev/null +++ b/drivers/media/dvb/Config.in @@ -0,0 +1,17 @@ +# +# Multimedia device configuration +# +mainmenu_option next_comment +comment 'Digital Video Broadcasting Devices' + +bool 'DVB For Linux' CONFIG_DVB + +if [ "$CONFIG_DVB" != "n" ]; then + source drivers/media/dvb/dvb-core/Config.in + source drivers/media/dvb/frontends/Config.in + + comment 'Supported DVB Adapters' + source drivers/media/dvb/av7110/Config.in +fi + +endmenu diff --git a/drivers/media/dvb/Makefile b/drivers/media/dvb/Makefile new file mode 100644 index 000000000000..ad647fcfe3f1 --- /dev/null +++ b/drivers/media/dvb/Makefile @@ -0,0 +1,7 @@ +# +# Makefile for the kernel multimedia device drivers. +# + +obj-y := dvb-core/ frontends/ av7110/ + +include $(TOPDIR)/Rules.make diff --git a/drivers/media/dvb/av7110/Config.help b/drivers/media/dvb/av7110/Config.help new file mode 100644 index 000000000000..db5d87a05569 --- /dev/null +++ b/drivers/media/dvb/av7110/Config.help @@ -0,0 +1,21 @@ +CONFIG_DVB_AV7110 + Support for SAA7146 and AV7110 based DVB cards as produced + by Fujitsu-Siemens, Technotrend, Hauppauge and others. + + Simple cards like so called Budget- or Nova-PCI cards are + supported as well as fullfeatured cards with onboard MPEG2 + decoder. + + Say Y if you own such a card and want to use it. + + +CONFIG_DVB_AV7110_OSD + The AV7110 firmware provides some code to generate an OnScreenDisplay + on the video output. This is kind of nonstandard and not guaranteed to + be maintained. + + Anyway, some popular DVB software like VDR uses this OSD to render + its menus, so say Y if you want to use this software. + + All other people say N. + diff --git a/drivers/media/dvb/av7110/Config.in b/drivers/media/dvb/av7110/Config.in new file mode 100644 index 000000000000..95c1dc819d70 --- /dev/null +++ b/drivers/media/dvb/av7110/Config.in @@ -0,0 +1,6 @@ +dep_tristate ' SAA7146 based AV7110 and Nova/budget cards' CONFIG_DVB_AV7110 $CONFIG_VIDEO_DEV $CONFIG_DVB_CORE + +if [ "$CONFIG_DVB_AV7110" != "n" ]; then + bool ' AV7110 OSD support' CONFIG_DVB_AV7110_OSD +fi + diff --git a/drivers/media/dvb/av7110/Makefile b/drivers/media/dvb/av7110/Makefile new file mode 100644 index 000000000000..e5b0d694d6d9 --- /dev/null +++ b/drivers/media/dvb/av7110/Makefile @@ -0,0 +1,10 @@ +# +# Makefile for the kernel AV7110 DVB device driver +# + +dvb-ttpci-objs := saa7146_core.o saa7146_v4l.o av7110.o av7110_ir.o + +obj-$(CONFIG_DVB_AV7110) += dvb-ttpci.o + +include $(TOPDIR)/Rules.make + diff --git a/drivers/media/dvb/av7110/av7110.c b/drivers/media/dvb/av7110/av7110.c new file mode 100644 index 000000000000..32613db23ad2 --- /dev/null +++ b/drivers/media/dvb/av7110/av7110.c @@ -0,0 +1,4830 @@ +/* + * av7110.c: driver for the SAA7146 based AV110 cards (like the Fujitsu-Siemens DVB) + * and Nova/Budget DVB cards + * + * Copyright (C) 1999-2002 Ralph Metzler + * & Marcus Metzler for convergence integrated media GmbH + * + * originally based on code by: + * Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Or, point your browser to http://www.gnu.org/copyleft/gpl.html + * + * + * the project's page is at http://www.linuxtv.org/dvb/ + */ + +#define NEW_CI 1 + +#define __KERNEL_SYSCALLS__ +#include <linux/module.h> +#include <linux/init.h> +#include <linux/kmod.h> +#include <linux/delay.h> +#include <linux/fs.h> +#include <linux/timer.h> +#include <linux/unistd.h> +#include <linux/byteorder/swabb.h> +#include <linux/poll.h> +#include <linux/slab.h> +#include <linux/smp_lock.h> +#include <stdarg.h> + +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/types.h> +#include <linux/fcntl.h> +#include <linux/interrupt.h> +#include <linux/ptrace.h> +#include <linux/ioport.h> +#include <linux/in.h> +#include <linux/slab.h> +#include <linux/string.h> +#include <linux/pci.h> +#include <asm/system.h> +#include <asm/bitops.h> +#include <asm/io.h> +#include <asm/dma.h> +#include <asm/semaphore.h> +#include <linux/init.h> +#include <linux/vmalloc.h> + +#include <linux/netdevice.h> +#include <linux/inetdevice.h> +#include <linux/etherdevice.h> +#include <linux/skbuff.h> + +#include <linux/dvb/frontend.h> + +#include "../dvb-core/dvb_i2c.h" +#include "../dvb-core/dvb_frontend.h" +#include "av7110.h" + +#include "saa7146_core.h" +#include "saa7146_v4l.h" +#include "saa7146_defs.h" + + +static int AV_StartPlay(av7110_t *av7110, int av); +static void restart_feeds(av7110_t *av7110); +static int bootarm(av7110_t *av7110); +static inline int i2c_writereg(av7110_t *av7110, u8 id, u8 reg, u8 val); +static inline u8 i2c_readreg(av7110_t *av7110, u8 id, u8 reg); +static int outcom(av7110_t *av7110, int type, int com, int num, ...); +static void SetMode(av7110_t *av7110, int mode); + +void pes_to_ts(u8 const *buf, long int length, u16 pid, p2t_t *p); +void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, dvb_demux_feed_t *feed); + +static u32 vidmem = 0; +static u32 vidlow = 0; + +static int av7110_debug = 0; +#define dprintk if (av7110_debug) printk + +static int vidmode=CVBS_RGB_OUT; +static int init_vpid; +static int init_apid; +static int pids_off; +static int adac=DVB_ADAC_TI; + +#define saacomm(x,y) av7110->saa->command(av7110->saa->i2c_bus, (x), (y)) + + +/**************************************************************************** + * General helper functions + ****************************************************************************/ + +static inline void ddelay(int i) +{ + current->state=TASK_INTERRUPTIBLE; + schedule_timeout((HZ*i)/100); +} + + +/**************************************************************************** + * GPIO and DEBI functions + ****************************************************************************/ + +#define saaread(adr) saa7146_read(saamem,(adr)) +#define saawrite(dat,adr) saa7146_write(saamem,(adr),(dat)) + +inline static void +setgpio(av7110_t *av7110, int port, u32 data) +{ + void *saamem=av7110->saa_mem; + u32 val; + + val=saaread(GPIO_CTRL); + val&=~(0xff << (8*(port))); + val|=(data)<<(8*(port)); + saawrite(val, GPIO_CTRL); +} + +/* This DEBI code is based on the Stradis driver + by Nathan Laredo <laredo@gnu.org> */ + +static +int wait_for_debi_done(av7110_t *av7110) +{ + void *saamem=av7110->saa_mem; + int start; + + /* wait for registers to be programmed */ + start = jiffies; + while (1) { + if (saaread(MC2) & 2) + break; + if (jiffies-start > HZ/20) { + printk ("%s: timed out while waiting for registers " + "getting programmed\n", __FUNCTION__); + return -ETIMEDOUT; + } + } + + /* wait for transfer to complete */ + start = jiffies; + while (1) { + if (!(saaread(PSR) & SPCI_DEBI_S)) + break; + saaread(MC2); + if (jiffies-start > HZ/4) { + printk ("%s: timed out while waiting for transfer " + "completion\n", __FUNCTION__); + return -ETIMEDOUT; + } + } + + return 0; +} + +static int debiwrite(av7110_t *av7110, u32 config, + int addr, u32 val, int count) +{ + void *saamem=av7110->saa_mem; + u32 cmd; + + if (count <= 0 || count > 32764) + return -1; + if (wait_for_debi_done(av7110) < 0) + return -1; + saawrite(config, DEBI_CONFIG); + if (count <= 4) /* immediate transfer */ + saawrite(val, DEBI_AD); + else /* block transfer */ + saawrite(av7110->debi_bus, DEBI_AD); + saawrite((cmd = (count << 17) | (addr & 0xffff)), DEBI_COMMAND); + saawrite((2 << 16) | 2, MC2); + return 0; +} + +static u32 debiread(av7110_t *av7110, u32 config, int addr, int count) +{ + void *saamem=av7110->saa_mem; + u32 result = 0; + + if (count > 32764 || count <= 0) + return 0; + if (wait_for_debi_done(av7110) < 0) + return 0; + saawrite(av7110->debi_bus, DEBI_AD); + saawrite((count << 17) | 0x10000 | (addr & 0xffff), + DEBI_COMMAND); + + saawrite(config, DEBI_CONFIG); + saawrite((2 << 16) | 2, MC2); + if (count > 4) + return count; + wait_for_debi_done(av7110); + result = saaread(DEBI_AD); + result &= (0xffffffffUL >> ((4-count)*8)); + return result; +} + +/* DEBI during interrupt */ + +static inline void +iwdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count) +{ + if (count>4 && val) + memcpy(av7110->debi_virt, (char *) val, count); + debiwrite(av7110, config, addr, val, count); +} + +static inline u32 +irdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count) +{ + u32 res; + + res=debiread(av7110, config, addr, count); + if (count<=4) + memcpy(av7110->debi_virt, (char *) &res, count); + return res; +} + +/* DEBI outside interrupts, only for count<=4! */ + +static inline void +wdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count) +{ + unsigned long flags; + + spin_lock_irqsave(&av7110->debilock, flags); + debiwrite(av7110, config, addr, val, count); + spin_unlock_irqrestore(&av7110->debilock, flags); +} + +static inline u32 +rdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count) +{ + unsigned long flags; + u32 res; + + spin_lock_irqsave(&av7110->debilock, flags); + res=debiread(av7110, config, addr, count); + spin_unlock_irqrestore(&av7110->debilock, flags); + return res; +} + + +static inline char +chtrans(char c) +{ + if (c<32 || c>126) + c=0x20; + return c; +} + + +/* handle mailbox registers of the dual ported RAM */ + +static inline void +ARM_ResetMailBox(av7110_t *av7110) +{ + unsigned long flags; + + spin_lock_irqsave(&av7110->debilock, flags); + debiread(av7110, DEBINOSWAP, IRQ_RX, 2); + //printk("dvb: IRQ_RX=%d\n", debiread(av7110, DEBINOSWAP, IRQ_RX, 2)); + debiwrite(av7110, DEBINOSWAP, IRQ_RX, 0, 2); + spin_unlock_irqrestore(&av7110->debilock, flags); +} + +static inline void +ARM_ClearMailBox(av7110_t *av7110) +{ + iwdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2); +} + +static inline void +ARM_ClearIrq(av7110_t *av7110) +{ + irdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2); +} + +static void +reset_arm(av7110_t *av7110) +{ + setgpio(av7110, RESET_LINE, GPIO_OUTLO); + + /* Disable DEBI and GPIO irq */ + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) & ~(MASK_19 | MASK_03)); + saa7146_write(av7110->saa_mem, ISR, (MASK_19 | MASK_03)); + + mdelay(800); + setgpio(av7110, RESET_LINE, GPIO_OUTHI); + mdelay(800); + + ARM_ResetMailBox(av7110); + + saa7146_write(av7110->saa_mem, ISR, (MASK_19 | MASK_03)); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_03 ); + + av7110->arm_ready=1; + printk("av7110: ARM RESET\n"); +} + +static void +recover_arm(av7110_t *av7110) +{ + if (current->files) + bootarm(av7110); + else { + printk("OOPS, no current->files\n"); + reset_arm(av7110); + } + ddelay(10); + restart_feeds(av7110); +} + +static void +arm_error(av7110_t *av7110) +{ + av7110->arm_errors++; + av7110->arm_ready=0; + recover_arm(av7110); +} + +static int arm_thread(void *data) +{ + av7110_t *av7110 = data; + u16 newloops; + + lock_kernel(); +#if 0 + daemonize(); +#else + exit_mm(current); + current->session=current->pgrp=1; +#endif + sigfillset(¤t->blocked); + strcpy(current->comm, "arm_mon"); + av7110->arm_thread = current; + unlock_kernel(); + + while (!av7110->arm_rmmod && !signal_pending(current)) { + interruptible_sleep_on_timeout(&av7110->arm_wait, 5*HZ); + + if (!av7110->arm_ready) + continue; + + if (down_interruptible(&av7110->dcomlock)) + break; + + newloops=rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2); + up(&av7110->dcomlock); + + if (newloops==av7110->arm_loops) { + printk("av7110%d: ARM crashed!\n", + av7110->saa->dvb_adapter->num); + + arm_error(av7110); + + if (down_interruptible(&av7110->dcomlock)) + break; + + newloops=rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2)-1; + up(&av7110->dcomlock); + } + av7110->arm_loops=newloops; + } + + av7110->arm_thread = NULL; + return 0; +} + + +static int +record_cb(pes2ts_t *p2t, u8 *buf, size_t len) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) p2t->priv; + + if (!(dvbdmxfeed->ts_type & TS_PACKET)) + return 0; + if (buf[3]==0xe0) // video PES do not have a length in TS + buf[4]=buf[5]=0; + if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY) + return dvbdmxfeed->cb.ts(buf, len, 0, 0, + &dvbdmxfeed->feed.ts, DMX_OK); + else + return pes2ts(p2t, buf, len); +} + +static int +pes2ts_cb(void *priv, unsigned char *data) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) priv; + + dvbdmxfeed->cb.ts(data, 188, 0, 0, + &dvbdmxfeed->feed.ts, + DMX_OK); + return 0; +} + +static int +AV_StartRecord(av7110_t *av7110, int av, + dvb_demux_feed_t *dvbdmxfeed) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + + if (av7110->playing||(av7110->rec_mode&av)) + return -EBUSY; + outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0); + dvbdmx->recording=1; + av7110->rec_mode|=av; + + switch (av7110->rec_mode) { + case RP_AUDIO: + pes2ts_init(&av7110->p2t[0], dvbdmx->pesfilter[0]->pid, + pes2ts_cb, (void *)dvbdmx->pesfilter[0]); + outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); + break; + case RP_VIDEO: + pes2ts_init(&av7110->p2t[1], dvbdmx->pesfilter[1]->pid, + pes2ts_cb, (void *)dvbdmx->pesfilter[1]); + outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); + break; + case RP_AV: + pes2ts_init(&av7110->p2t[0], dvbdmx->pesfilter[0]->pid, + pes2ts_cb, (void *)dvbdmx->pesfilter[0]); + pes2ts_init(&av7110->p2t[1], dvbdmx->pesfilter[1]->pid, + pes2ts_cb, (void *)dvbdmx->pesfilter[1]); + outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AV_PES, 0); + break; + } + return 0; +} + +static int +AV_StartPlay(av7110_t *av7110, int av) +{ + if (av7110->rec_mode) + return -EBUSY; + if (av7110->playing&av) + return -EBUSY; + + outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0); + + if (av7110->playing == RP_NONE) { + reset_ipack(&av7110->ipack[0]); + reset_ipack(&av7110->ipack[1]); + } + + av7110->playing|=av; + switch (av7110->playing) { + case RP_AUDIO: + outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); + break; + case RP_VIDEO: + outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); + av7110->sinfo=0; + break; + case RP_AV: + av7110->sinfo=0; + outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AV_PES, 0); + break; + } + return av7110->playing; +} + +static void +AV_Stop(av7110_t *av7110, int av) +{ + if (!(av7110->playing&av) && !(av7110->rec_mode&av)) + return; + + outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0); + if (av7110->playing) { + av7110->playing&=~av; + switch (av7110->playing) { + case RP_AUDIO: + outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); + break; + case RP_VIDEO: + outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); + break; + case RP_NONE: + SetMode(av7110, av7110->vidmode); + break; + } + } else { + av7110->rec_mode&=~av; + switch (av7110->rec_mode) { + case RP_AUDIO: + outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); + break; + case RP_VIDEO: + outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); + break; + case RP_NONE: + break; + } + } +} + +/**************************************************************************** + * Buffer handling + ****************************************************************************/ + +static inline void +ring_buffer_flush(ring_buffer_t *rbuf) +{ + spin_lock_irq(&rbuf->lock); + rbuf->pwrite=rbuf->pread; + spin_unlock_irq(&rbuf->lock); + wake_up(&rbuf->queue); +} + +static inline void +ring_buffer_init(ring_buffer_t *rbuf, u8 *data, int len) +{ + rbuf->pread=rbuf->pwrite=0; + rbuf->data=data; + rbuf->size=len; + init_waitqueue_head(&rbuf->queue); + spin_lock_init(&(rbuf->lock)); + rbuf->lock=SPIN_LOCK_UNLOCKED; + sema_init(&(rbuf->sema), 1); +} + +static inline +int ring_buffer_empty(ring_buffer_t *rbuf) +{ + return (rbuf->pread==rbuf->pwrite); +} + +static inline +int ring_buffer_free(ring_buffer_t *rbuf) +{ + int free; + + free=rbuf->pread - rbuf->pwrite; + if (free<=0) + free+=rbuf->size; + return free; +} + +static inline +int ring_buffer_avail(ring_buffer_t *rbuf) +{ + int avail; + + avail=rbuf->pwrite - rbuf->pread; + if (avail<0) + avail+=rbuf->size; + return avail; +} + +#if 0 +static void +ring_buffer_block(ring_buffer_t *rbuf, unsigned long count) +{ + if (ring_buffer_free(rbuf)>=count) + return; + while (!wait_event_interruptible(rbuf->queue, + (ring_buffer_free(rbuf)>=count))); +} +#endif + +static long +ring_buffer_write(ring_buffer_t *rbuf, + const char *buf, unsigned long count, + int nonblock, int usermem) +{ + unsigned long todo = count; + int free, split; + + while (todo > 0) { + if (ring_buffer_free(rbuf)<=2048) { + if (nonblock) + return count-todo; + if (wait_event_interruptible(rbuf->queue, + (ring_buffer_free(rbuf)>2048))) + return count-todo; + } + dprintk ("function: %s pread=%08x pwrite=%08x\n", __FUNCTION__, + rbuf->pread, rbuf->pwrite); + //mdelay(2); + free = rbuf->pread - rbuf->pwrite; + split=rbuf->size; + if (free<=0) { + free+=rbuf->size; + split-=rbuf->pwrite; + } + if (free > todo) + free = todo; + + if (split < free) { + if (!usermem) + memcpy(rbuf->data+rbuf->pwrite, buf, split); + else + if (copy_from_user(rbuf->data+rbuf->pwrite, + buf, split)) + return -EFAULT; + buf += split; + todo -= split; + free -= split; + rbuf->pwrite = 0; + } + if (!usermem) + memcpy(rbuf->data+rbuf->pwrite, buf, free); + else + if (copy_from_user(rbuf->data+rbuf->pwrite, buf, free)) + return -EFAULT; + rbuf->pwrite = (rbuf->pwrite + free)%rbuf->size; + todo -= free; + buf += free; + } + + return count-todo; +} + +#if 0 +static void +ring_buffer_put(ring_buffer_t *db, u8 *buf, int len) +{ + int split, fsize; + + fsize=db->pread - db->pwrite; + if (fsize <= 0) { + fsize+=db->size; + split=db->size-db->pwrite; + } else + split=0; + if (len>=fsize) { + dprintk("buffer overflow\n"); + return; + } + if (split>=len) + split=0; + if (split) { + memcpy(db->data + db->pwrite, buf, split); + len-=split; + db->pwrite=0; + } + memcpy(db->data + db->pwrite, split + buf, len); + db->pwrite=(db->pwrite+len)%db->size; +} +#endif + + +/**************************************************************************** + * TT budget / WinTV Nova + ****************************************************************************/ + +static int +TTBStop(av7110_t *av7110) +{ + if (--av7110->feeding) + return av7110->feeding; + saa7146_write(av7110->saa_mem, MC1, MASK_20); // DMA3 off + saa7146_write(av7110->saa_mem, MC1, MASK_28); // RPS0 off + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) & ~MASK_10 ); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER)& ~MASK_07); + return 0; +} + +#define TS_WIDTH (4*188) +#define TS_HEIGHT (1024/4) +static int +TTBStart(av7110_t *av7110) +{ + struct saa7146 *saa=av7110->saa; + + //printk ("function : %s\n", __FUNCTION__); + if (av7110->feeding) + return ++av7110->feeding; + + saa7146_write(saa->mem, MC1, MASK_20); // DMA3 off + + memset(saa->grabbing, 0x00, TS_HEIGHT*TS_WIDTH); + + saa7146_write(saa->mem, PCI_BT_V1, 0x001c0000); + + av7110->tsf=0; + av7110->ttbp=0; + saa7146_write(saa->mem, DD1_INIT, 0x02000680); + saa7146_write(saa->mem, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); + + saa7146_write(saa->mem, BRS_CTRL, 0x60000000); + saa7146_write(saa->mem, MC2, (MASK_08 | MASK_24)); + mdelay(10); + + saa7146_write(saa->mem, BASE_ODD3, 0); + saa7146_write(saa->mem, BASE_EVEN3, TS_WIDTH*TS_HEIGHT/2); + saa7146_write(saa->mem, PROT_ADDR3, TS_WIDTH*TS_HEIGHT); + saa7146_write(saa->mem, BASE_PAGE3, virt_to_bus(saa->page_table[0])|ME1|0xb0); + saa7146_write(saa->mem, PITCH3, TS_WIDTH); + + saa7146_write(saa->mem, NUM_LINE_BYTE3, ((TS_HEIGHT/2)<<16)|TS_WIDTH); + saa7146_write(saa->mem, MC2, (MASK_04 | MASK_20)); + + // VPE + saa7146_write(saa->mem, IER, saa7146_read(saa->mem, IER)|MASK_10); + + saa7146_write(saa->mem, MC1, (MASK_04 | MASK_20)); // DMA3 on + + // FIDB + saa7146_write(saa->mem, IER, saa7146_read(saa->mem, IER)|MASK_07); + + return ++av7110->feeding; +} + +/** + * Hack! we save the last av7110 ptr. This should be ok, since + * you rarely will use more then one IR control. + * + * If we want to support multiple controls we would have to do much more... + */ +void av7110_setup_irc_config (av7110_t *av7110, u32 ir_config) +{ + static av7110_t *last; + + if (!av7110) + av7110 = last; + else + last = av7110; + + outcom(av7110, COMTYPE_PIDFILTER, SetIR, 1, ir_config); +} + +static void (*irc_handler)(u32); + +void av7110_register_irc_handler(void (*func)(u32)) +{ + //dprintk("registering %08x\n",func); + irc_handler = func; +} + +void av7110_unregister_irc_handler(void (*func)(u32)) +{ + //dprintk("unregistering %08x\n",func); + irc_handler = NULL; +} + +void run_handlers(unsigned long ircom) +{ + if (irc_handler != NULL) + (*irc_handler)((u32) ircom); +} + +DECLARE_TASKLET(irtask,run_handlers,0); + +void IR_handle(av7110_t *av7110, u32 ircom) +{ + dprintk("av7110: ircommand = %08x\n", ircom); + irtask.data = (unsigned long) ircom; + tasklet_schedule(&irtask); +} + +/**************************************************************************** + * IRQ handling + ****************************************************************************/ + +void CI_handle(av7110_t *av7110, u8 *data, u16 len) +{ + //CI_out(av7110, data, len); + + if (len<3) + return; + switch (data[0]) { + case CI_MSG_CI_INFO: + if (data[2]!=1 && data[2]!=2) + break; + switch (data[1]) { + case 0: + av7110->ci_slot[data[2]-1].flags=0; + break; + case 1: + av7110->ci_slot[data[2]-1].flags|=CA_CI_MODULE_PRESENT; + break; + case 2: + av7110->ci_slot[data[2]-1].flags|=CA_CI_MODULE_READY; + break; + } + break; + case CI_SWITCH_PRG_REPLY: + //av7110->ci_stat=data[1]; + break; + default: + break; + } + +} + +static inline int +DvbDmxFilterCallback(u8 * buffer1, size_t buffer1_len, + u8 * buffer2, size_t buffer2_len, + dvb_demux_filter_t *dvbdmxfilter, + dmx_success_t success, + av7110_t *av7110) +{ + if (!dvbdmxfilter->feed->demux->dmx.frontend) + return 0; + if (dvbdmxfilter->feed->demux->dmx.frontend->source==DMX_MEMORY_FE) + return 0; + + switch(dvbdmxfilter->type) { + case DMX_TYPE_SEC: + if ((((buffer1[1]<<8)|buffer1[2])&0xfff)+3!=buffer1_len) + return 0; + if (dvbdmxfilter->doneq) { + dmx_section_filter_t *filter=&dvbdmxfilter->filter; + int i; + u8 xor, neq=0; + + for (i=0; i<DVB_DEMUX_MASK_MAX; i++) { + xor=filter->filter_value[i]^buffer1[i]; + neq|=dvbdmxfilter->maskandnotmode[i]&xor; + } + if (!neq) + return 0; + } + return dvbdmxfilter->feed->cb.sec(buffer1, buffer1_len, + buffer2, buffer2_len, + &dvbdmxfilter->filter, + DMX_OK); + case DMX_TYPE_TS: + if (!(dvbdmxfilter->feed->ts_type & TS_PACKET)) + return 0; + if (dvbdmxfilter->feed->ts_type & TS_PAYLOAD_ONLY) + return dvbdmxfilter->feed->cb.ts(buffer1, buffer1_len, + buffer2, buffer2_len, + &dvbdmxfilter->feed->feed.ts, + DMX_OK); + else + pes_to_ts(buffer1, buffer1_len, + dvbdmxfilter->feed->pid, + &av7110->p2t_filter[dvbdmxfilter->index]); + default: + return 0; + } +} + + +u8 pshead[0x26] = { + 0x00, 0x00, 0x01, 0xba, 0x5f, 0xff, 0xfe, 0xe6, + 0xc4, 0x01, 0x01, 0x89, 0xc3, 0xf8, 0x00, 0x00, + 0x01, 0xbb, 0x00, 0x12, 0x80, 0xc4, 0xe1, 0x00, + 0xe1, 0xff, 0xb9, 0xe0, 0xe8, 0xb8, 0xc0, 0x20, + 0xbd, 0xe0, 0x44, 0xbf, 0xe0, 0x02, +}; + + +static void vpeirq (unsigned long data) +{ + //printk("vpeirq %08x\n", saa7146_read(av7110->saa_mem, PCI_VDP3)); +} + +#if 0 +static void fidbirq(struct saa7146* saa, void *data) +{ + av7110_t *av7110=(av7110_t *) data; + u8 *mem; + + mem=(av7110->tsf ? TS_HEIGHT*TS_WIDTH/2 :0)+(u8 *)av7110->saa->grabbing; + + // FIXME: think of something better without busy waiting + if (av7110->tsf) + while (saa7146_read(av7110->saa_mem, PCI_VDP3)>0x20000); + else + while (saa7146_read(av7110->saa_mem, PCI_VDP3)<0x17800); + + av7110->tsf^=1; + saa7146_write(av7110->saa_mem, DD1_INIT, 0x02000600|(av7110->tsf ? 0x40:0x80)); + saa7146_write(av7110->saa_mem, MC2, + (MASK_09 | MASK_25 | MASK_10 | MASK_26)); + + // FIXME: use bottom half or tasklet + if (av7110->feeding && mem[0]==0x47) + DvbDmxSWFilterPackets(&av7110->demux, mem, 512); +} +#else +static +void fidbirq (unsigned long data) +{ + struct av7110_s *av7110 = (struct av7110_s*) data; + u8 *mem=(u8 *)(av7110->saa->grabbing); + int num; + u32 dmapos; + + dmapos=saa7146_read(av7110->saa_mem, PCI_VDP3); + dmapos-=(dmapos%188); + + if (av7110->tsf) { + mem+=av7110->ttbp; + if (dmapos<0x20000) { + num=1024-av7110->ttbp/188; + av7110->ttbp=0; + } else { + num=(dmapos - av7110->ttbp)/188; + av7110->ttbp=dmapos; + } + } else { + if (av7110->ttbp>1000*188 && av7110->ttbp<1024*188) { + if (av7110->feeding) + DvbDmxSWFilterPackets(&av7110->demux, + mem+av7110->ttbp, + 1024- av7110->ttbp / 188); + } + num=dmapos/188; + av7110->ttbp=dmapos; + } + + av7110->tsf^=1; + saa7146_write(av7110->saa_mem, DD1_INIT, 0x02000600|(av7110->tsf ? 0x40:0x80)); + saa7146_write(av7110->saa_mem, MC2, + (MASK_09 | MASK_25 | MASK_10 | MASK_26)); + + // FIXME: use bottom half or tasklet + if (av7110->feeding && mem[0]==0x47) + DvbDmxSWFilterPackets(&av7110->demux, mem, num); +} +#endif + +//#define DEBUG_TIMING +inline static void +print_time(char *s) +{ +#ifdef DEBUG_TIMING + struct timeval tv; + do_gettimeofday(&tv); + printk("%s: %d.%d\n", s, (int)tv.tv_sec, (int)tv.tv_usec); +#endif +} + +static void +ci_get_data(ring_buffer_t *cibuf, u8 *data, int len) +{ + int free, split=0, pread=cibuf->pread; + + free=pread-cibuf->pwrite; + if (free<=0) + free+=cibuf->size; + if (free<=len+2) + return; + cibuf->data[cibuf->pwrite]=(len>>8); + cibuf->data[(cibuf->pwrite+1)%cibuf->size]=(len&0xff); + cibuf->pwrite=(cibuf->pwrite+2)%cibuf->size; + + if (pread<=cibuf->pwrite) + split=cibuf->size-cibuf->pwrite; + if (split && split<len) { + memcpy(cibuf->data + cibuf->pwrite, data, split); + memcpy(cibuf->data, data+split, len-split); + } else + memcpy(cibuf->data + cibuf->pwrite, data, len); + cibuf->pwrite=(cibuf->pwrite+len)%cibuf->size; + + wake_up_interruptible(&cibuf->queue); +} + +static +void debiirq (unsigned long data) +{ + struct av7110_s *av7110 = (struct av7110_s*) data; + int type=av7110->debitype; + int handle=(type>>8)&0x1f; + + print_time("debi"); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) & ~MASK_19 ); + saa7146_write(av7110->saa_mem, ISR, MASK_19 ); + + if (type==-1) { + printk("DEBI irq oops\n"); + ARM_ClearMailBox(av7110); + ARM_ClearIrq(av7110); + return; + } + av7110->debitype=-1; + + switch (type&0xff) { + + case DATA_TS_RECORD: + DvbDmxSWFilterPackets(&av7110->demux, + (const u8 *)av7110->debi_virt, + av7110->debilen/188); + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + break; + + case DATA_PES_RECORD: + if (av7110->demux.recording) + record_cb(&av7110->p2t[handle], + (u8 *)av7110->debi_virt, + av7110->debilen); + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + return; + + case DATA_IPMPE: + case DATA_FSECTION: + case DATA_PIPING: + if (av7110->handle2filter[handle]) + DvbDmxFilterCallback((u8 *)av7110->debi_virt, + av7110->debilen, 0, 0, + av7110->handle2filter[handle], + DMX_OK, av7110); + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + return; + + case DATA_CI_GET: + { + u8 *data=av7110->debi_virt; + + if ((data[0]<2) && data[2]==0xff) { + int flags=0; + if (data[5]>0) + flags|=CA_CI_MODULE_PRESENT; + if (data[5]>5) + flags|=CA_CI_MODULE_READY; + av7110->ci_slot[data[0]].flags=flags; + } else + ci_get_data(&av7110->ci_rbuffer, + av7110->debi_virt, + av7110->debilen); + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + return; + } + + case DATA_COMMON_INTERFACE: + CI_handle(av7110, (u8 *)av7110->debi_virt, av7110->debilen); +#if 0 + { + int i; + + printk("av7110%d: ", av7110->num); + printk("%02x ", *(u8 *)av7110->debi_virt); + printk("%02x ", *(1+(u8 *)av7110->debi_virt)); + for (i=2; i<av7110->debilen; i++) + printk("%02x ", (*(i+(unsigned char *)av7110->debi_virt))); + for (i=2; i<av7110->debilen; i++) + printk("%c", chtrans(*(i+(unsigned char *)av7110->debi_virt))); + + printk("\n"); + } +#endif + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + return; + + case DATA_DEBUG_MESSAGE: + ((s8*)av7110->debi_virt)[Reserved_SIZE-1]=0; + printk("%s\n", (s8 *)av7110->debi_virt); + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + return; + + case DATA_CI_PUT: + case DATA_MPEG_PLAY: + case DATA_BMP_LOAD: + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + return; + default: + break; + } + spin_lock(&av7110->debilock); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); +} + +static int +pes_play(void *dest, ring_buffer_t *buf, int dlen) +{ + int len, split=0; + u32 sync; + u16 blen; + + dprintk ("function : %s\n", __FUNCTION__); + if (!dlen) { + wake_up(&buf->queue); + return -1; + } + while (1) { + if ((len=ring_buffer_avail(buf)) < 6) + return -1; + sync=(buf->data[buf->pread])<<24; + sync|=(buf->data[(buf->pread+1)%buf->size]<<16); + sync|=(buf->data[(buf->pread+2)%buf->size]<<8); + sync|=buf->data[(buf->pread+3)%buf->size]; + + if (((sync&~0x1f)==0x000001e0) || + ((sync&~0x1f)==0x000001c0) || + (sync==0x000001bd)) + break; + printk("resync\n"); + buf->pread=(buf->pread+1)%buf->size; + } + blen=(buf->data[(buf->pread+4)%buf->size]<<8); + blen|=buf->data[(buf->pread+5)%buf->size]; + blen+=6; + if (len<blen || blen > dlen) { + printk("buffer empty\n"); + wake_up(&buf->queue); + return -1; + } +/* if (blen>2048) { + buf->pread=(buf->pread+blen)%buf->size; + printk("packet too large\n"); + return -1; + } +*/ + len=blen; + if (buf->pread + len > buf->size) + split=buf->size-buf->pread; + if (split>0) { + memcpy(dest, buf->data+buf->pread, split); + buf->pread=0; + len-=split; + } + memcpy(split + dest, + buf->data + buf->pread, len); + buf->pread = (buf->pread +len)%buf->size; + + dprintk ("function: %s pread=%08x pwrite=%08x\n", __FUNCTION__, + buf->pread, buf->pwrite); + wake_up(&buf->queue); + return blen; +} + +static +void gpioirq (unsigned long data) +{ + struct av7110_s *av7110 = (struct av7110_s*) data; + u32 rxbuf, txbuf; + int len; + + //printk("GPIO0 irq\n"); + + if (av7110->debitype !=-1) + printk("GPIO0 irq oops\n"); + + spin_lock(&av7110->debilock); + + ARM_ClearIrq(av7110); + + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) & ~MASK_19 ); + saa7146_write(av7110->saa_mem, ISR, MASK_19 ); + + av7110->debitype = irdebi(av7110, DEBINOSWAP, IRQ_STATE, 0, 2); + av7110->debilen = irdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2); + av7110->debibuf = 0; + rxbuf=irdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + txbuf=irdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2); + len=(av7110->debilen+3)&(~3); + + dprintk("GPIO0 irq %d %d\n", av7110->debitype, av7110->debilen); + print_time("gpio"); + + dprintk("GPIO0 irq %02x\n", av7110->debitype&0xff); + switch (av7110->debitype&0xff) { + + case DATA_TS_PLAY: + case DATA_PES_PLAY: + break; + + case DATA_CI_PUT: + { + int avail, split=0, pwrite; + ring_buffer_t *cibuf=&av7110->ci_wbuffer; + + pwrite=cibuf->pwrite; + avail=pwrite-cibuf->pread; + if (avail<0) + avail+=cibuf->size; + if (avail<=2) { + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2); + break; + } + len=(cibuf->data[cibuf->pread]<<8); + len|=cibuf->data[(cibuf->pread+1)%cibuf->size]; + if (avail<len+2) { + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2); + break; + } + cibuf->pread=(cibuf->pread+2)%cibuf->size; + + if (pwrite<cibuf->pread) + split=cibuf->size-cibuf->pread; + if (split && split<len) { + int todo=len-split; + memcpy(av7110->debi_virt, cibuf->data+cibuf->pread, split); + memcpy(av7110->debi_virt+split, cibuf->data, todo); + } else + memcpy(av7110->debi_virt, cibuf->data+cibuf->pread, len); + cibuf->pread=(cibuf->pread+len)%cibuf->size; + wake_up(&cibuf->queue); + iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2); + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2); + wait_for_debi_done(av7110); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_19 ); + if (len<5) len=5; /* we want a real DEBI DMA */ + iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3); + spin_unlock(&av7110->debilock); + return; + } + + case DATA_MPEG_PLAY: + if (!av7110->playing) { + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2); + break; + } + len=0; + if (av7110->debitype&0x100) { + spin_lock(&av7110->aout.lock); + len=pes_play(av7110->debi_virt, &av7110->aout, 2048); + spin_unlock(&av7110->aout.lock); + } + if (len<=0 && (av7110->debitype&0x200) + &&av7110->videostate.play_state!=VIDEO_FREEZED) { + spin_lock(&av7110->avout.lock); + len=pes_play(av7110->debi_virt, &av7110->avout, 2048); + spin_unlock(&av7110->avout.lock); + } + if (len<=0) { + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2); + break; + } + dprintk("GPIO0 PES_PLAY len=%04x\n", len); + iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2); + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2); + wait_for_debi_done(av7110); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_19 ); + + iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3); + spin_unlock(&av7110->debilock); + return; + + case DATA_BMP_LOAD: + len=av7110->debilen; + if (!len) { + av7110->bmp_state=BMP_LOADED; + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2); + wake_up(&av7110->bmpq); + break; + } + if (len>av7110->bmplen) + len=av7110->bmplen; + if (len>2*1024) + len=2*1024; + iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2); + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2); + memcpy(av7110->debi_virt, av7110->bmpbuf+av7110->bmpp, len); + av7110->bmpp+=len; + av7110->bmplen-=len; + wait_for_debi_done(av7110); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_19 ); + if (len<5) len=5; /* we want a real DEBI DMA */ + iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3); + spin_unlock(&av7110->debilock); + return; + + case DATA_CI_GET: + case DATA_COMMON_INTERFACE: + case DATA_FSECTION: + case DATA_IPMPE: + case DATA_PIPING: + if (!len || len>4*1024) { + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + break; + } /* yes, fall through */ + case DATA_TS_RECORD: + case DATA_PES_RECORD: + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_19); + irdebi(av7110, DEBISWAB, DPRAM_BASE+rxbuf, 0, len); + spin_unlock(&av7110->debilock); + return; + + case DATA_DEBUG_MESSAGE: + if (!len || len>0xff) { + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + break; + } + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_19); + irdebi(av7110, DEBISWAB, Reserved, 0, len); + spin_unlock(&av7110->debilock); + return; + + case DATA_IRCOMMAND: + IR_handle(av7110, + swahw32(irdebi(av7110, DEBINOSWAP, Reserved, 0, 4))); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + break; + + default: + printk("gpioirq unknown type=%d len=%d\n", + av7110->debitype, av7110->debilen); + break; + } + ARM_ClearMailBox(av7110); + av7110->debitype=-1; + spin_unlock(&av7110->debilock); + dprintk("GPIO0 irq exit 0\n"); +} + + +/**************************************************************************** + * DEBI command polling + ****************************************************************************/ + + +static int OutCommand(av7110_t *av7110, u16* buf, int length) +{ + int i; + u32 start; + + if (!av7110->arm_ready) + return -1; + + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2 ) ) + { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_FREE) { + printk("outcommand error 1\n"); + //arm_error(av7110); + return -1; + } + } + +#ifndef _NOHANDSHAKE + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) + { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_SHAKE) { + printk("outcommand error 2\n"); + //arm_error(av7110); + return -1; + } + } +#endif + + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2) & OSDQFull ) + { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_OSD) + { + printk("outcommand error 3\n"); + //arm_error(av7110); + return -1; + } + } + for (i=2; i<length; i++) + wdebi(av7110, DEBINOSWAP, COMMAND + 2*i, (u32) buf[i], 2); + + if (length) + wdebi(av7110, DEBINOSWAP, COMMAND + 2, (u32) buf[1], 2); + else + wdebi(av7110, DEBINOSWAP, COMMAND + 2, 0, 2); + + wdebi(av7110, DEBINOSWAP, COMMAND, (u32) buf[0], 2); + + return 0; +} + +inline static int +SOutCommand(av7110_t *av7110, u16* buf, int length) +{ + int ret; + + if (!av7110->arm_ready) + return -1; + + if (down_interruptible(&av7110->dcomlock)) + return -ERESTARTSYS; + + ret=OutCommand(av7110, buf, length); + up(&av7110->dcomlock); + return ret; +} + + +static int outcom(av7110_t *av7110, int type, int com, int num, ...) +{ + va_list args; + u16 buf[num+2]; + int i; + + buf[0]=(( type << 8 ) | com); + buf[1]=num; + + if (num) { + va_start(args, num); + for (i=0; i<num; i++) + buf[i+2]=va_arg(args, u32); + va_end(args); + } + + return SOutCommand(av7110, buf, num+2); +} + +int SendCICommand(av7110_t *av7110, u8 subcom, u8 *Params, u8 ParamLen) +{ + int i; + u16 CommandBuffer[18] = { ((COMTYPE_COMMON_IF << 8) + subcom), + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + for(i=0; (i<ParamLen)&&(i<32); i++) + { + if(i%2 == 0) + CommandBuffer[(i/2)+2] = (u16)(Params[i]) << 8; + else + CommandBuffer[(i/2)+2] |= Params[i]; + } + + return SOutCommand(av7110, CommandBuffer, 18); +} + + +static int CommandRequest(av7110_t *av7110, u16 *Buff, int length, u16 *buf, int n) +{ + int err; + s16 i; + u32 start; + + if (!av7110->arm_ready) + return -1; + + if (down_interruptible(&av7110->dcomlock)) + return -ERESTARTSYS; + + if ((err = OutCommand(av7110, Buff, length)) < 0) { + up(&av7110->dcomlock); + return err; + } + + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2) ) + { +#ifdef _NOHANDSHAKE + ddelay(1); +#endif + if ((jiffies - start) > ARM_WAIT_FREE) { + printk("commandrequest error 1\n"); + up(&av7110->dcomlock); + //arm_error(av7110); + return -1; + } + } + +#ifndef _NOHANDSHAKE + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_SHAKE) { + printk("commandrequest error 2\n"); + up(&av7110->dcomlock); + //arm_error(av7110); + return -1; + } + } +#endif + + for (i=0; i<n; i++) + buf[i] = rdebi(av7110, DEBINOSWAP, COM_BUFF + 2*i, 0, 2); + + up(&av7110->dcomlock); + return 0; +} + + +static inline int +RequestParameter(av7110_t *av7110, u16 tag, u16* Buff, s16 length) +{ + return CommandRequest(av7110, &tag, 0, Buff, length); +} + + +/**************************************************************************** + * Firmware commands + ****************************************************************************/ + + +inline static int +SendDAC(av7110_t *av7110, u8 addr, u8 data) +{ + return outcom(av7110, COMTYPE_AUDIODAC, AudioDAC, 2, addr, data); +} + +static int +SetVolume(av7110_t *av7110, int volleft, int volright) +{ + int err; + + switch (av7110->adac_type) { + case DVB_ADAC_TI: + volleft=(volleft*256)/946; + volright=(volright*256)/946; + if (volleft > 0x45) + volleft=0x45; + if (volright > 0x45) + volright=0x45; + err=SendDAC(av7110, 3, 0x80 + volleft); + if (err) + return err; + return SendDAC(av7110, 4, volright); + + case DVB_ADAC_CRYSTAL: + volleft=127-volleft/2; + volright=127-volright/2; + i2c_writereg(av7110, 0x20, 0x03, volleft); + i2c_writereg(av7110, 0x20, 0x04, volright); + return 0; + } + return 0; +} + +#ifdef CONFIG_DVB_AV7110_OSD + +inline static int ResetBlend(av7110_t *av7110, u8 windownr) +{ + return outcom(av7110, COMTYPE_OSD, SetNonBlend, 1, windownr); +} + +inline static int SetColorBlend(av7110_t *av7110, u8 windownr) +{ + return outcom(av7110, COMTYPE_OSD, SetCBlend, 1, windownr); +} + +inline static int SetWindowBlend(av7110_t *av7110, u8 windownr, u8 blending) +{ + return outcom(av7110, COMTYPE_OSD, SetWBlend, 2, windownr, blending); +} + +inline static int SetBlend_(av7110_t *av7110, u8 windownr, + OSDPALTYPE colordepth, u16 index, u8 blending) +{ + return outcom(av7110, COMTYPE_OSD, SetBlend, 4, + windownr, colordepth, index, blending); +} + +inline static int SetColor_(av7110_t *av7110, u8 windownr, + OSDPALTYPE colordepth, u16 index, u16 colorhi, u16 colorlo) +{ + return outcom(av7110, COMTYPE_OSD, SetColor, 5, + windownr, colordepth, index, colorhi, colorlo); +} + +inline static int BringToTop(av7110_t *av7110, u8 windownr) +{ + return outcom(av7110, COMTYPE_OSD, WTop, 1, windownr); +} + +inline static int SetFont(av7110_t *av7110, u8 windownr, u8 fontsize, + u16 colorfg, u16 colorbg) +{ + return outcom(av7110, COMTYPE_OSD, Set_Font, 4, + windownr, fontsize, colorfg, colorbg); +} + +static int FlushText(av7110_t *av7110) +{ + u32 start; + + if (down_interruptible(&av7110->dcomlock)) + return -ERESTARTSYS; + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_OSD) { + printk("outtext error\n"); + up(&av7110->dcomlock); + //arm_error(av7110); + return -1; + } + } + up(&av7110->dcomlock); + return 0; +} + +static int WriteText(av7110_t *av7110, u8 win, u16 x, u16 y, u8* buf) +{ + int i, ret; + u32 start; + int length=strlen(buf)+1; + u16 cbuf[5] = { (COMTYPE_OSD<<8) + DText, 3, win, x, y }; + + if (down_interruptible(&av7110->dcomlock)) + return -ERESTARTSYS; + + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_OSD) { + printk("outtext error\n"); + up(&av7110->dcomlock); + //arm_error(av7110); + return -1; + } + } +#ifndef _NOHANDSHAKE + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_SHAKE) { + printk("outtext error\n"); + up(&av7110->dcomlock); + //arm_error(av7110); + return -1; + } + } +#endif + for (i=0; i<length/2; i++) + wdebi(av7110, DEBINOSWAP, BUFF1_BASE + i*2, + swab16(*(u16 *)(buf+2*i)), 2); + if (length&1) + wdebi(av7110, DEBINOSWAP, BUFF1_BASE + i*2, 0, 2); + ret=OutCommand(av7110, cbuf, 5); + up(&av7110->dcomlock); + return ret; +} + +inline static int DrawLine(av7110_t *av7110, u8 windownr, + u16 x, u16 y, u16 dx, u16 dy, u16 color) +{ + return outcom(av7110, COMTYPE_OSD, DLine, 6, + windownr, x, y, dx, dy, color); +} + +inline static int DrawBlock(av7110_t *av7110, u8 windownr, + u16 x, u16 y, u16 dx, u16 dy, u16 color) +{ + return outcom(av7110, COMTYPE_OSD, DBox, 6, + windownr, x, y, dx, dy, color); +} + +inline static int HideWindow(av7110_t *av7110, u8 windownr) +{ + return outcom(av7110, COMTYPE_OSD, WHide, 1, windownr); +} + +inline static int MoveWindowRel(av7110_t *av7110, u8 windownr, u16 x, u16 y) +{ + return outcom(av7110, COMTYPE_OSD, WMoveD, 3, windownr, x, y); +} + +inline static int MoveWindowAbs(av7110_t *av7110, u8 windownr, u16 x, u16 y) +{ + return outcom(av7110, COMTYPE_OSD, WMoveA, 3, windownr, x, y); +} + +inline static int DestroyOSDWindow(av7110_t *av7110, u8 windownr) +{ + return outcom(av7110, COMTYPE_OSD, WDestroy, 1, windownr); +} + +#if 0 +static void DestroyOSDWindows(av7110_t *av7110) +{ + int i; + + for (i=1; i<7; i++) + outcom(av7110, COMTYPE_OSD, WDestroy, 1, i); +} +#endif + +static inline int +CreateOSDWindow(av7110_t *av7110, u8 windownr, + DISPTYPE disptype, u16 width, u16 height) +{ + return outcom(av7110, COMTYPE_OSD, WCreate, 4, + windownr, disptype, width, height); +} + + +static OSDPALTYPE bpp2pal[8]={Pal1Bit, Pal2Bit, 0, Pal4Bit, 0, 0, 0, Pal8Bit}; +static DISPTYPE bpp2bit[8]={BITMAP1, BITMAP2, 0, BITMAP4, 0, 0, 0, BITMAP8}; + +static inline int +LoadBitmap(av7110_t *av7110, u16 format, u16 dx, u16 dy, int inc, u8* data) +{ + int bpp; + int i; + int d, delta; + u8 c; + DECLARE_WAITQUEUE(wait, current); + + if (av7110->bmp_state==BMP_LOADING) { + add_wait_queue(&av7110->bmpq, &wait); + while (1) { + set_current_state(TASK_INTERRUPTIBLE); + if (av7110->bmp_state!=BMP_LOADING + || signal_pending(current)) + break; + schedule(); + } + current->state=TASK_RUNNING; + remove_wait_queue(&av7110->bmpq, &wait); + } + if (av7110->bmp_state==BMP_LOADING) + return -1; + av7110->bmp_state=BMP_LOADING; + if (format==BITMAP8) { bpp=8; delta = 1; } + else if (format==BITMAP4) { bpp=4; delta = 2; } + else if (format==BITMAP2) { bpp=2; delta = 4; } + else if (format==BITMAP1) { bpp=1; delta = 8; } + else { + av7110->bmp_state=BMP_NONE; + return -1; + } + av7110->bmplen= ((dx*dy*bpp+7)&~7)/8; + av7110->bmpp=0; + if (av7110->bmplen>32768) { + av7110->bmp_state=BMP_NONE; + return -1; + } + for (i=0; i<dy; i++) { + if (copy_from_user(av7110->bmpbuf+1024+i*dx, data+i*inc, dx)) { + av7110->bmp_state=BMP_NONE; + return -1; + } + } + if (format != BITMAP8) { + for (i=0; i<dx*dy/delta; i++) { + c = ((u8 *)av7110->bmpbuf)[1024+i*delta+delta-1]; + for (d=delta-2; d>=0; d--) { + c |= (((u8 *)av7110->bmpbuf)[1024+i*delta+d] + << ((delta-d-1)*bpp)); + ((u8 *)av7110->bmpbuf)[1024+i] = c; + } + } + } + av7110->bmplen+=1024; + return outcom(av7110, COMTYPE_OSD, LoadBmp, 3, format, dx, dy); +} + +static int +BlitBitmap(av7110_t *av7110, u16 win, u16 x, u16 y, u16 trans) +{ + DECLARE_WAITQUEUE(wait, current); + + if (av7110->bmp_state==BMP_NONE) + return -1; + if (av7110->bmp_state==BMP_LOADING) { + add_wait_queue(&av7110->bmpq, &wait); + while (1) { + set_current_state(TASK_INTERRUPTIBLE); + if (av7110->bmp_state!=BMP_LOADING + || signal_pending(current)) + break; + schedule(); + } + current->state=TASK_RUNNING; + remove_wait_queue(&av7110->bmpq, &wait); + } + if (av7110->bmp_state==BMP_LOADED) + return outcom(av7110, COMTYPE_OSD, BlitBmp, 4, win, x, y, trans); + return -1; +} + +static inline int +ReleaseBitmap(av7110_t *av7110) +{ + if (av7110->bmp_state!=BMP_LOADED) + return -1; + av7110->bmp_state=BMP_NONE; + return outcom(av7110, COMTYPE_OSD, ReleaseBmp, 0); +} + +static u32 RGB2YUV(u16 R, u16 G, u16 B) +{ + u16 y, u, v; + u16 Y, Cr, Cb; + + y = R * 77 + G * 150 + B * 29; // Luma=0.299R+0.587G+0.114B 0..65535 + u = 2048+B * 8 -(y>>5); // Cr 0..4095 + v = 2048+R * 8 -(y>>5); // Cb 0..4095 + + Y=y/256; + Cb=u/16; + Cr=v/16; + + return Cr|(Cb<<16)|(Y<<8); +} + +static void +OSDSetColor(av7110_t *av7110, u8 color, u8 r, u8 g, u8 b, u8 blend) +{ + u16 ch, cl; + u32 yuv; + + yuv=blend ? RGB2YUV(r,g,b) : 0; + cl=(yuv&0xffff); + ch=((yuv>>16)&0xffff); + SetColor_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]], + color, ch, cl); + SetBlend_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]], + color, ((blend>>4)&0x0f)); +} + +static int +OSDSetBlock(av7110_t *av7110, int x0, int y0, int x1, int y1, int inc, u8 *data) +{ + uint w, h, bpp, bpl, size, lpb, bnum, brest; + int i; + + w=x1-x0+1; h=y1-y0+1; + if (inc<=0) + inc=w; + if (w<=0 || w>720 || h<=0 || h>576) + return -1; + bpp=av7110->osdbpp[av7110->osdwin]+1; + bpl=((w*bpp+7)&~7)/8; + size=h*bpl; + lpb=(32*1024)/bpl; + bnum=size/(lpb*bpl); + brest=size-bnum*lpb*bpl; + + for (i=0; i<bnum; i++) { + LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], w, lpb, inc, data); + BlitBitmap(av7110, av7110->osdwin, x0, y0+i*lpb, 0); + data+=lpb*inc; + } + if (brest) { + LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], w, brest/bpl, inc, data); + BlitBitmap(av7110, av7110->osdwin, x0, y0+bnum*lpb, 0); + } + ReleaseBitmap(av7110); + return 0; +} + +static int +OSD_DrawCommand(av7110_t *av7110, osd_cmd_t *dc) +{ + switch (dc->cmd) { + case OSD_Close: + DestroyOSDWindow(av7110, av7110->osdwin); + return 0; + case OSD_Open: + av7110->osdbpp[av7110->osdwin]=(dc->color-1)&7; + CreateOSDWindow(av7110, av7110->osdwin, bpp2bit[av7110->osdbpp[av7110->osdwin]], + dc->x1-dc->x0+1, dc->y1-dc->y0+1); + if (!dc->data) { + MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0); + SetColorBlend(av7110, av7110->osdwin); + } + return 0; + case OSD_Show: + MoveWindowRel(av7110, av7110->osdwin, 0, 0); + return 0; + case OSD_Hide: + HideWindow(av7110, av7110->osdwin); + return 0; + case OSD_Clear: + DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, 0); + return 0; + case OSD_Fill: + DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, dc->color); + return 0; + case OSD_SetColor: + OSDSetColor(av7110, dc->color, dc->x0, dc->y0, dc->x1, dc->y1); + return 0; + case OSD_SetPalette: + { + int i, len=dc->x0-dc->color+1; + u8 *colors=(u8 *)dc->data; + + for (i=0; i<len; i++) + OSDSetColor(av7110, dc->color+i, + colors[i*4] , colors[i*4+1], + colors[i*4+2], colors[i*4+3]); + return 0; + } + case OSD_SetTrans: + return 0; + case OSD_SetPixel: + DrawLine(av7110, av7110->osdwin, + dc->x0, dc->y0, 0, 0, + dc->color); + return 0; + case OSD_GetPixel: + return 0; + + case OSD_SetRow: + dc->y1=dc->y0; + case OSD_SetBlock: + OSDSetBlock(av7110, dc->x0, dc->y0, dc->x1, dc->y1, dc->color, dc->data); + return 0; + + case OSD_FillRow: + DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0, + dc->x1-dc->x0+1, dc->y1, + dc->color); + return 0; + case OSD_FillBlock: + DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0, + dc->x1-dc->x0+1, dc->y1-dc->y0+1, + dc->color); + return 0; + case OSD_Line: + DrawLine(av7110, av7110->osdwin, + dc->x0, dc->y0, dc->x1-dc->x0, dc->y1-dc->y0, + dc->color); + return 0; + case OSD_Query: + return 0; + case OSD_Test: + return 0; + case OSD_Text: + { + char textbuf[240]; + + if (strncpy_from_user(textbuf, dc->data, 240)<0) + return -EFAULT; + textbuf[239]=0; + if (dc->x1>3) + dc->x1=3; + SetFont(av7110, av7110->osdwin, dc->x1, + (u16) (dc->color&0xffff), (u16) (dc->color>>16)); + FlushText(av7110); + WriteText(av7110, av7110->osdwin, dc->x0, dc->y0, textbuf); + return 0; + } + case OSD_SetWindow: + if (dc->x0<1 || dc->x0>7) + return -EINVAL; + av7110->osdwin=dc->x0; + return 0; + case OSD_MoveWindow: + MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0); + SetColorBlend(av7110, av7110->osdwin); + return 0; + default: + return -EINVAL; + } +} +#endif /* CONFIG_DVB_AV7110_OSD */ + + +/* get version of the firmware ROM, RTSL, video ucode and ARM application */ + +static void +firmversion(av7110_t *av7110) +{ + u16 buf[20]; + + u16 tag = ((COMTYPE_REQUEST << 8) + ReqVersion); + + RequestParameter(av7110, tag, buf, 16); + + av7110->arm_fw=(buf[0] << 16) + buf[1]; + av7110->arm_rtsl=(buf[2] << 16) + buf[3]; + av7110->arm_vid=(buf[4] << 16) + buf[5]; + av7110->arm_app=(buf[6] << 16) + buf[7]; + av7110->avtype=(buf[8] << 16) + buf[9]; + + printk ("av7110 (%d): AV711%d - firm %08x, rtsl %08x, vid %08x, app %08x\n", + av7110->saa->dvb_adapter->num, av7110->avtype, av7110->arm_fw, + av7110->arm_rtsl, av7110->arm_vid, av7110->arm_app); + + return; +} + +static int +waitdebi(av7110_t *av7110, int adr, int state) +{ + int k; + + for (k=0; k<100; k++, udelay(500)) { + if (irdebi(av7110, DEBINOSWAP, adr, 0, 2) == state) + return 0; + } + return -1; +} + + +static int +load_dram(av7110_t *av7110, u32 *data, int len) +{ + int i; + int blocks, rest; + u32 base, bootblock=BOOT_BLOCK; + + blocks=len/BOOT_MAX_SIZE; + rest=len % BOOT_MAX_SIZE; + base=DRAM_START_CODE; + + for (i=0; i<blocks; i++) { + if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) + return -1; + dprintk("Writing DRAM block %d\n",i); + iwdebi(av7110, DEBISWAB, bootblock, + i*(BOOT_MAX_SIZE)+(u32)data, + BOOT_MAX_SIZE); + bootblock^=0x1400; + iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4); + iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, BOOT_MAX_SIZE, 2); + iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); + base+=BOOT_MAX_SIZE; + } + + if (rest > 0) { + if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) + return -1; + if (rest>4) + iwdebi(av7110, DEBISWAB, bootblock, i*(BOOT_MAX_SIZE)+(u32)data, rest); + else + iwdebi(av7110, DEBISWAB, bootblock, i*(BOOT_MAX_SIZE)-4+(u32)data, rest+4); + + iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4); + iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, rest, 2); + iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); + } + if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) + return -1; + iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, 0, 2); + iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); + if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BOOT_COMPLETE) < 0) + return -1; + return 0; +} + + +static u8 +bootcode[] = { + 0xea, 0x00, 0x00, 0x0e, 0xe1, 0xb0, 0xf0, 0x0e, /* 0x0000 */ + 0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x04, + 0xe2, 0x5e, 0xf0, 0x08, 0xe2, 0x5e, 0xf0, 0x04, + 0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x04, + 0x2c, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x00, 0xa5, 0xa5, 0x5a, 0x5a, + 0x00, 0x1f, 0x15, 0x55, 0x00, 0x00, 0x00, 0x09, + 0xe5, 0x9f, 0xd0, 0x5c, 0xe5, 0x9f, 0x40, 0x54, /* 0x0040 */ + 0xe3, 0xa0, 0x00, 0x00, 0xe5, 0x84, 0x00, 0x00, + 0xe5, 0x84, 0x00, 0x04, 0xe1, 0xd4, 0x10, 0xb0, + 0xe3, 0x51, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xfc, + 0xe1, 0xa0, 0x10, 0x0d, 0xe5, 0x94, 0x30, 0x04, + 0xe1, 0xd4, 0x20, 0xb2, 0xe2, 0x82, 0x20, 0x3f, + 0xe1, 0xb0, 0x23, 0x22, 0x03, 0xa0, 0x00, 0x02, + 0xe1, 0xc4, 0x00, 0xb0, 0x0a, 0xff, 0xff, 0xf4, + 0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0, /* 0x0080 */ + 0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0, + 0xe2, 0x52, 0x20, 0x01, 0x1a, 0xff, 0xff, 0xf9, + 0xe2, 0x2d, 0xdb, 0x05, 0xea, 0xff, 0xff, 0xec, + 0x2c, 0x00, 0x03, 0xf8, 0x2c, 0x00, 0x04, 0x00, +}; + +#include "av7110_firm.h" + +static int +bootarm(av7110_t *av7110) +{ + u32 ret; + int i; + + setgpio(av7110, RESET_LINE, GPIO_OUTLO); + + /* Disable DEBI and GPIO irq */ + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) & + ~(MASK_19 | MASK_03)); + saa7146_write(av7110->saa_mem, ISR, (MASK_19 | MASK_03)); + + /* enable DEBI */ + saa7146_write(av7110->saa_mem, MC1, 0x08800880); + saa7146_write(av7110->saa_mem, DD1_STREAM_B, 0x00000000); + saa7146_write(av7110->saa_mem, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); + + /* test DEBI */ + iwdebi(av7110, DEBISWAP, DPRAM_BASE, 0x76543210, 4); + if ((ret=irdebi(av7110, DEBINOSWAP, DPRAM_BASE, 0, 4))!=0x10325476) { + printk("dvb: debi test in bootarm() failed: " + "%08x != %08x\n", ret, 0x10325476);; + return -1; + } + for (i=0; i<8192; i+=4) + iwdebi(av7110, DEBISWAP, DPRAM_BASE+i, 0x00, 4); + dprintk("bootarm: debi test OK\n");; + + /* boot */ + dprintk("bootarm: load boot code\n"); + + setgpio(av7110, ARM_IRQ_LINE, GPIO_IRQLO); + //setgpio(av7110, DEBI_DONE_LINE, GPIO_INPUT); + //setgpio(av7110, 3, GPIO_INPUT); + + iwdebi(av7110, DEBISWAB, DPRAM_BASE, (u32) bootcode, sizeof(bootcode)); + iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); + + wait_for_debi_done(av7110); + setgpio(av7110, RESET_LINE, GPIO_OUTHI); + current->state=TASK_INTERRUPTIBLE; + schedule_timeout(HZ); + + dprintk("bootarm: load dram code\n"); + + if (load_dram(av7110, (u32 *)Root, sizeof(Root))<0) + return -1; + + setgpio(av7110, RESET_LINE, GPIO_OUTLO); + mdelay(1); + + dprintk("bootarm: load dpram code\n"); + + iwdebi(av7110, DEBISWAB, DPRAM_BASE, (u32) Dpram, sizeof(Dpram)); + + wait_for_debi_done(av7110); + + setgpio(av7110, RESET_LINE, GPIO_OUTHI); + mdelay(800); + + //ARM_ClearIrq(av7110); + ARM_ResetMailBox(av7110); + saa7146_write(av7110->saa_mem, ISR, (MASK_19 | MASK_03)); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_03 ); + + av7110->arm_errors=0; + av7110->arm_ready=1; + return 0; +} + +static inline int +SetPIDs(av7110_t *av7110, u16 vpid, u16 apid, u16 ttpid, + u16 subpid, u16 pcrpid) +{ + if (vpid == 0x1fff || apid == 0x1fff || + ttpid == 0x1fff || subpid == 0x1fff || pcrpid == 0x1fff) + vpid = apid = ttpid = subpid = pcrpid = 0; + + return outcom(av7110, COMTYPE_PIDFILTER, MultiPID, 5, + pcrpid, vpid, apid, ttpid, subpid); +} + +static void +ChangePIDs(av7110_t *av7110, u16 vpid, u16 apid, u16 ttpid, + u16 subpid, u16 pcrpid) +{ + if (down_interruptible(&av7110->pid_mutex)) + return; + + if (!(vpid&0x8000)) av7110->pids[DMX_PES_VIDEO]=vpid; + if (!(apid&0x8000)) av7110->pids[DMX_PES_AUDIO]=apid; + if (!(ttpid&0x8000)) av7110->pids[DMX_PES_TELETEXT]=ttpid; + if (!(pcrpid&0x8000)) av7110->pids[DMX_PES_PCR]=pcrpid; + + av7110->pids[DMX_PES_SUBTITLE]=0; + + if (av7110->fe_synced) + SetPIDs(av7110, vpid, apid, ttpid, subpid, pcrpid); + + up(&av7110->pid_mutex); +} + + +static void +SetMode(av7110_t *av7110, int mode) +{ + outcom(av7110, COMTYPE_ENCODER, LoadVidCode, 1, mode); + + if (!av7110->playing) { + ChangePIDs(av7110, av7110->pids[DMX_PES_VIDEO], + av7110->pids[DMX_PES_AUDIO], + av7110->pids[DMX_PES_TELETEXT], + 0, av7110->pids[DMX_PES_PCR]); + outcom(av7110, COMTYPE_PIDFILTER, Scan, 0); + } +} + +inline static void +TestMode(av7110_t *av7110, int mode) +{ + outcom(av7110, COMTYPE_ENCODER, SetTestMode, 1, mode); +} + +inline static void +VidMode(av7110_t *av7110, int mode) +{ + outcom(av7110, COMTYPE_ENCODER, SetVidMode, 1, mode); +} + + +static int inline +vidcom(av7110_t *av7110, u32 com, u32 arg) +{ + return outcom(av7110, 0x80, 0x02, 4, + (com>>16), (com&0xffff), + (arg>>16), (arg&0xffff)); +} + +static int inline +audcom(av7110_t *av7110, u32 com) +{ + return outcom(av7110, 0x80, 0x03, 4, + (com>>16), (com&0xffff)); +} + +inline static void +Set22K(av7110_t *av7110, int state) +{ + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) + outcom(av7110, COMTYPE_AUDIODAC, (state ? ON22K : OFF22K), 0); + if (av7110->saa->card_type==DVB_CARD_TT_BUDGET) + setgpio(av7110, 3, (state ? GPIO_OUTHI : GPIO_OUTLO)); +} + + +/* Diseqc functions only for TT Budget card */ +/* taken from the Skyvision DVB driver by + Ralph Metzler <rjkm@metzlerbros.de> */ + + +inline static void +DiseqcSendBit(av7110_t *av7110, int data) +{ + setgpio(av7110, 3, GPIO_OUTHI); + udelay(data ? 500 : 1000); + setgpio(av7110, 3, GPIO_OUTLO); + udelay(data ? 1000 : 500); +} + +static void +DiseqcSendByte(av7110_t *av7110, int data) +{ + int i, par=1, d; + + for (i=7; i>=0; i--) + { + d=(data>>i)&1; + par^=d; + DiseqcSendBit(av7110, d); + } + DiseqcSendBit(av7110, par); +} + +inline static int +SendDiSEqCMsg(av7110_t *av7110, int len, u8 *msg, int burst) +{ + int i; + + switch (av7110->saa->card_type) { + case DVB_CARD_TT_SIEMENS: + { + u16 buf[18] = { ((COMTYPE_AUDIODAC << 8) + SendDiSEqC), + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + if (len>10) + len=10; + buf[1] = len+2; + buf[2] = len; + + if (burst!=-1) + buf[3]=burst ? 0x01 : 0x00; + + else + buf[3]=0xffff; + + for (i=0; i<len; i++) + buf[i+4]=msg[i]; + + SOutCommand(av7110, buf, 18); + break; + } + + case DVB_CARD_TT_BUDGET: + setgpio(av7110, 3, GPIO_OUTLO); + + mdelay(16); + + for (i=0; i<len; i++) + DiseqcSendByte(av7110, msg[i]); + + mdelay(16); + + if (burst!=-1) { + if (burst) + DiseqcSendByte(av7110, 0xff); + else { + setgpio(av7110, 3, GPIO_OUTHI); + udelay(12500); + setgpio(av7110, 3, GPIO_OUTLO); + } + + ddelay(2); + } + + break; + + default: + return -1; + } + return 0; +} + +/**************************************************************************** + * I2C client commands + ****************************************************************************/ + +static inline int +i2c_writereg(av7110_t *av7110, u8 id, u8 reg, u8 val) +{ + u8 msg[2]={ reg, val }; + struct dvb_i2c_bus *i2c = av7110->saa->i2c_bus; + struct i2c_msg msgs; + + msgs.flags=0; + msgs.addr=id/2; + msgs.len=2; + msgs.buf=msg; + return i2c->xfer (i2c, &msgs, 1); +} + +static inline int +msp_writereg(av7110_t *av7110, u8 dev, u16 reg, u16 val) +{ + u8 msg[5]={ dev, reg>>8, reg&0xff, val>>8 , val&0xff }; + struct dvb_i2c_bus *i2c = av7110->saa->i2c_bus; + struct i2c_msg msgs; + + msgs.flags=0; + msgs.addr=0x40; + msgs.len=5; + msgs.buf=msg; + return i2c->xfer(i2c, &msgs, 1); +} + +static inline u8 +i2c_readreg(av7110_t *av7110, u8 id, u8 reg) +{ + struct dvb_i2c_bus *i2c = av7110->saa->i2c_bus; + u8 mm1[] = {0x00}; + u8 mm2[] = {0x00}; + struct i2c_msg msgs[2]; + + msgs[0].flags=0; + msgs[1].flags=I2C_M_RD; + msgs[0].addr=msgs[1].addr=id/2; + mm1[0]=reg; + msgs[0].len=1; msgs[1].len=1; + msgs[0].buf=mm1; msgs[1].buf=mm2; + i2c->xfer(i2c, msgs, 2); + + return mm2[0]; +} + + +/**************************************************************************** + * I/O buffer management and control + ****************************************************************************/ + +static int sw2mode[16] = { + VIDEO_MODE_PAL, VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_PAL, + VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_PAL, VIDEO_MODE_NTSC, + VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, + VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, +}; + +static void +get_video_format(av7110_t *av7110, u8 *buf, int count) +{ + int i; + int hsize,vsize; + int sw; + u8 *p; + + if (av7110->sinfo) + return; + for (i=7; i<count-10; i++) { + p=buf+i; + if (p[0] || p[1] || p[2]!=0x01 || p[3]!=0xb3) + continue; + p+=4; + hsize = ((p[1] &0xF0) >> 4) | (p[0] << 4); + vsize = ((p[1] &0x0F) << 8) | (p[2]); + sw = (p[3]&0x0F); + SetMode(av7110, sw2mode[sw]); + dprintk("dvb: playback %dx%d fr=%d\n", hsize, vsize, sw); + av7110->sinfo=1; + break; + } +} + +static void +play_video_cb(u8 *buf, int count, void *priv) +{ + av7110_t *av7110=(av7110_t *) priv; + + if ((buf[3]&0xe0)==0xe0) { + get_video_format(av7110, buf, count); + ring_buffer_write(&av7110->avout, buf, count, 0, 0); + } else + ring_buffer_write(&av7110->aout, buf, count, 0, 0); +} + +static void +play_audio_cb(u8 *buf, int count, void *priv) +{ + av7110_t *av7110=(av7110_t *) priv; + + ring_buffer_write(&av7110->aout, buf, count, 0, 0); +} + +#define FREE_COND (ring_buffer_free(&av7110->avout)>=20*1024 && ring_buffer_free(&av7110->aout)>=20*1024) + +static ssize_t +dvb_play(av7110_t *av7110, const u8 *buf, + unsigned long count, int nonblock, int type, int umem) +{ + unsigned long todo = count, n; + + if (!av7110->kbuf[type]) + return -ENOBUFS; + + if (nonblock && !FREE_COND) + return -EWOULDBLOCK; + + while (todo>0) { + if (!FREE_COND) { + if (nonblock) + return count-todo; + if (wait_event_interruptible(av7110->avout.queue, + FREE_COND)) + return count-todo; + } + n=todo; + if (n>IPACKS*2) + n=IPACKS*2; + if (umem) { + if (copy_from_user(av7110->kbuf[type], buf, n)) + return -EFAULT; + instant_repack(av7110->kbuf[type], n, &av7110->ipack[type]); + } else + instant_repack((u8 *)buf, n, &av7110->ipack[type]); + todo -= n; + buf += n; + } + return count-todo; +} + +static ssize_t +dvb_aplay(av7110_t *av7110, const u8 *buf, + unsigned long count, int nonblock, int type) +{ + unsigned long todo = count, n; + + if (!av7110->kbuf[type]) + return -ENOBUFS; + if (nonblock && ring_buffer_free(&av7110->aout)<20*1024) + return -EWOULDBLOCK; + + while (todo>0) { + if (ring_buffer_free(&av7110->aout)<20*1024) { + if (nonblock) + return count-todo; + if (wait_event_interruptible(av7110->aout.queue, + (ring_buffer_free(&av7110->aout)>= + 20*1024))) + return count-todo; + } + n=todo; + if (n>IPACKS*2) + n=IPACKS*2; + if (copy_from_user(av7110->kbuf[type], buf, n)) + return -EFAULT; + instant_repack(av7110->kbuf[type], n, &av7110->ipack[type]); +// memcpy(dvb->kbuf[type], buf, n); + todo -= n; + buf += n; + } + return count-todo; +} + +void init_p2t(p2t_t *p, dvb_demux_feed_t *feed) +{ + memset(p->pes,0,TS_SIZE); + p->counter = 0; + p->pos = 0; + p->frags = 0; + if (feed) p->feed = feed; +} + +void clear_p2t(p2t_t *p) +{ + memset(p->pes,0,TS_SIZE); +// p->counter = 0; + p->pos = 0; + p->frags = 0; +} + + +long int find_pes_header(u8 const *buf, long int length, int *frags) +{ + int c = 0; + int found = 0; + + *frags = 0; + + while (c < length-3 && !found) { + if (buf[c] == 0x00 && buf[c+1] == 0x00 && + buf[c+2] == 0x01) { + switch ( buf[c+3] ) { + + case PROG_STREAM_MAP: + case PRIVATE_STREAM2: + case PROG_STREAM_DIR: + case ECM_STREAM : + case EMM_STREAM : + case PADDING_STREAM : + case DSM_CC_STREAM : + case ISO13522_STREAM: + case PRIVATE_STREAM1: + case AUDIO_STREAM_S ... AUDIO_STREAM_E: + case VIDEO_STREAM_S ... VIDEO_STREAM_E: + found = 1; + break; + + default: + c++; + break; + } + } else c++; + } + if (c == length-3 && !found){ + if (buf[length-1] == 0x00) *frags = 1; + if (buf[length-2] == 0x00 && + buf[length-1] == 0x00) *frags = 2; + if (buf[length-3] == 0x00 && + buf[length-2] == 0x00 && + buf[length-1] == 0x01) *frags = 3; + return -1; + } + + return c; +} + +void pes_to_ts( u8 const *buf, long int length, u16 pid, p2t_t *p) +{ + int c,c2,l,add; + int check,rest; + + c = 0; + c2 = 0; + if (p->frags){ + check = 0; + switch(p->frags){ + case 1: + if ( buf[c] == 0x00 && buf[c+1] == 0x01 ){ + check = 1; + c += 2; + } + break; + case 2: + if ( buf[c] == 0x01 ){ + check = 1; + c++; + } + break; + case 3: + check = 1; + } + if(check){ + switch ( buf[c] ) { + + case PROG_STREAM_MAP: + case PRIVATE_STREAM2: + case PROG_STREAM_DIR: + case ECM_STREAM : + case EMM_STREAM : + case PADDING_STREAM : + case DSM_CC_STREAM : + case ISO13522_STREAM: + case PRIVATE_STREAM1: + case AUDIO_STREAM_S ... AUDIO_STREAM_E: + case VIDEO_STREAM_S ... VIDEO_STREAM_E: + p->pes[0] = 0x00; + p->pes[1] = 0x00; + p->pes[2] = 0x01; + p->pes[3] = buf[c]; + p->pos=4; + memcpy(p->pes+p->pos,buf+c,(TS_SIZE-4)-p->pos); + c += (TS_SIZE-4)-p->pos; + p_to_t(p->pes,(TS_SIZE-4),pid,&p->counter, + p->feed); + clear_p2t(p); + break; + + default: + c=0; + break; + } + } + p->frags = 0; + } + + if (p->pos){ + c2 = find_pes_header(buf+c,length-c,&p->frags); + if (c2 >= 0 && c2 < (TS_SIZE-4)-p->pos){ + l = c2+c; + } else l = (TS_SIZE-4)-p->pos; + memcpy(p->pes+p->pos,buf,l); + c += l; + p->pos += l; + p_to_t(p->pes,p->pos,pid,&p->counter, p->feed); + clear_p2t(p); + } + + add = 0; + while (c < length){ + c2 = find_pes_header(buf+c+add,length-c-add,&p->frags); + if (c2 >= 0) { + c2 += c+add; + if (c2 > c){ + p_to_t(buf+c,c2-c,pid,&p->counter, + p->feed); + c = c2; + clear_p2t(p); + add = 0; + } else add = 1; + } else { + l = length-c; + rest = l % (TS_SIZE-4); + l -= rest; + p_to_t(buf+c,l,pid,&p->counter, + p->feed); + memcpy(p->pes,buf+c+l,rest); + p->pos = rest; + c = length; + } + } +} + + +int write_ts_header2(u16 pid, u8 *counter, int pes_start, u8 *buf, u8 length) +{ + int i; + int c = 0; + int fill; + u8 tshead[4] = { 0x47, 0x00, 0x00, 0x10}; + + + fill = (TS_SIZE-4)-length; + if (pes_start) tshead[1] = 0x40; + if (fill) tshead[3] = 0x30; + tshead[1] |= (u8)((pid & 0x1F00) >> 8); + tshead[2] |= (u8)(pid & 0x00FF); + tshead[3] |= ((*counter)++ & 0x0F) ; + memcpy(buf,tshead,4); + c+=4; + + + if (fill){ + buf[4] = fill-1; + c++; + if (fill >1){ + buf[5] = 0x00; + c++; + } + for ( i = 6; i < fill+4; i++){ + buf[i] = 0xFF; + c++; + } + } + + return c; +} + + +void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, + dvb_demux_feed_t *feed) +{ + + int l, pes_start; + u8 obuf[TS_SIZE]; + long int c = 0; + + pes_start = 0; + if ( length > 3 && + buf[0] == 0x00 && buf[1] == 0x00 && buf[2] == 0x01 ) + switch (buf[3]){ + case PROG_STREAM_MAP: + case PRIVATE_STREAM2: + case PROG_STREAM_DIR: + case ECM_STREAM : + case EMM_STREAM : + case PADDING_STREAM : + case DSM_CC_STREAM : + case ISO13522_STREAM: + case PRIVATE_STREAM1: + case AUDIO_STREAM_S ... AUDIO_STREAM_E: + case VIDEO_STREAM_S ... VIDEO_STREAM_E: + pes_start = 1; + break; + + default: + break; + } + + while ( c < length ){ + memset(obuf,0,TS_SIZE); + if (length - c >= (TS_SIZE-4)){ + l = write_ts_header2(pid, counter, pes_start + , obuf, (TS_SIZE-4)); + memcpy(obuf+l, buf+c, TS_SIZE-l); + c += TS_SIZE-l; + } else { + l = write_ts_header2(pid, counter, pes_start + , obuf, length-c); + memcpy(obuf+l, buf+c, TS_SIZE-l); + c = length; + } + feed->cb.ts(obuf, 188, 0, 0, &feed->feed.ts, DMX_OK); + pes_start = 0; + } +} + + +/**************************************************************************** + * V4L SECTION + ****************************************************************************/ + +static int dvb_do_ioctl (struct inode *inode, struct file *file, + unsigned int cmd, void *arg) +{ + struct video_device *dev = video_devdata (file); + av7110_t *av7110 = dev->priv; + + switch (cmd) { + case VIDIOCGCAP: + { + struct video_capability *b = arg; + + dprintk(KERN_ERR "dvb: VIDIOCGCAP called\n"); + + strcpy(b->name, &dev->name[0]); + + b->type = av7110->video.type; + + b->channels = 1; + b->audios = 2; + b->maxwidth = 768; + b->maxheight = 576; + b->minwidth = 32; + b->minheight = 32; + + return 0; + } + + case VIDIOCGCHAN: + { + static const + struct video_channel dvb_chan = { 0, "DVB", 1, 3, 1, 1 }; + struct video_channel *v = arg; + + dprintk(KERN_ERR "dvb: VIDIOCGCHAN called\n"); + + memcpy(v, &dvb_chan, sizeof(struct video_channel)); + + return 0; + + } + + case VIDIOCSCHAN: + { + struct video_channel *v = arg; + + dprintk(KERN_ERR "dvb: VIDIOCSCHAN called\n"); + + if (v->channel>0) + return -EINVAL; + + if (v->norm > 1) + return -EOPNOTSUPP; + + av7110->vidmode = v->norm; + SetMode(av7110, v->norm); + av7110->saa->mode = v->norm; + return 0; + } + + case VIDIOCGTUNER: + { + struct video_tuner *v = arg; + + dprintk(KERN_ERR "dvb: VIDIOCGTUNER called\n"); + + /* only channel 0 has a tuner */ + if(!v->tuner) + return -EINVAL; + + /* fill the structure */ + strcpy(v->name, "DVB"); + v->rangelow = 0x00000000; + v->rangehigh = 0xffffffff; + + v->flags= VIDEO_TUNER_PAL | VIDEO_TUNER_NTSC; + v->mode = av7110->vidmode; + + /* fixme: fill in signal strength here */ + v->signal = 0xffff; + + return 0; + } + + case VIDIOCSTUNER: + { + struct video_tuner *v = arg; + + dprintk(KERN_ERR "dvb: VIDIOCSTUNER called\n"); + + /* only channel 0 has a tuner */ + if (!v->tuner) + return -EINVAL; + + /* check if format is supported */ + if(v->mode != VIDEO_MODE_PAL && v->mode != VIDEO_MODE_NTSC + /* && v->mode != VIDEO_MODE_SECAM */ ) + return -EOPNOTSUPP; + + av7110->vidmode = v->mode; + SetMode(av7110, v->mode); + + return 0; + } + + case VIDIOCGPICT: + { + struct video_picture *p = arg; + + dprintk(KERN_ERR "dvb: VIDIOCGPICT called\n"); + + saacomm(SAA7146_V4L_GPICT, p); + + dprintk("dvb: VIDIOCGPICT called: b:%d c:%d s:%d d:%d p:%d\n", + p->brightness, p->contrast, p->colour, + p->depth, p->palette); + + return 0; + } + + case VIDIOCSPICT: + { + struct video_picture *p = arg; + + dprintk("dvb: VIDIOCSPICT called: b:%d c:%d s:%d d:%d p:%d\n", + p->brightness, p->contrast, p->colour, + p->depth, p->palette); + + switch (p->palette) { + case VIDEO_PALETTE_RGB555: + case VIDEO_PALETTE_RGB565: + case VIDEO_PALETTE_RGB24: + case VIDEO_PALETTE_RGB32: + case VIDEO_PALETTE_UYVY: + case VIDEO_PALETTE_YUV422P: + case VIDEO_PALETTE_YUV420P: + case VIDEO_PALETTE_YUV411P: + break; + default: + return -EINVAL; + } + + saacomm(SAA7146_V4L_SPICT, p); + + return 0; + + } + + case VIDIOCSWIN: + { + struct video_window *w = arg; + + dprintk("dvb: VIDIOCSWIN called: " + "clips: %d, x:%d, y:%d, h:%d, w:%d\n", + w->clipcount, w->x, w->y, w->height, w->width); + + saacomm(SAA7146_V4L_SWIN, w); + + return 0; + } + + case VIDIOCGWIN: + { + dprintk(KERN_ERR "dvb: VIDIOCGWIN called\n"); + return 0; + } + + case VIDIOCCAPTURE: + { + int *v = arg; + + dprintk("dvb: VIDIOCCAPTURE called, mode:%d (0=disable)\n", *v); + + saacomm(SAA7146_V4L_CCAPTURE, v); + + return 0; + } + + case VIDIOCGFBUF: + { + struct video_buffer *b = arg; + + dprintk(KERN_ERR "dvb: VIDIOCGFBUF called\n"); + + saacomm(SAA7146_V4L_GFBUF, b); + + return 0; + + } + + case VIDIOCSFBUF: + { + struct video_buffer *b = arg; + u32 vid = (vidmem << 16) | vidlow; + + /* see if vidmem-override is requested */ + if (vidmem) { + printk ("dvb: video-memory-override. (0x%08x)\n", vid); + b->base = (void*) vid; + } + + saacomm(SAA7146_V4L_SFBUF, b); + + dprintk(KERN_ERR "dvb: VIDIOCSFBUF called\n"); + + return 0; + } + + /* Video key event - to dev 255 is to all - + * cuts capture on all DMA windows with this key (0xFFFFFFFF == all) + */ + case VIDIOCKEY: + { + dprintk(KERN_ERR "dvb: VIDIOCKEY called\n"); + return 0; + } + + case VIDIOCGAUDIO: + { + struct video_audio *v = arg; + + v->flags = VIDEO_AUDIO_MUTABLE; + /* let's auto-detect */ + return 0; + } + + case VIDIOCSAUDIO: + { + //struct video_audio *v; + return 0; + } + + case VIDIOCSYNC: + { + int i = 0; + int *frame = (int*) arg; + + dprintk ("dvb: VIDIOCSYNC called - frame: %d\n", *frame); + + /* simply pass the requested frame-number to the corresponding + saa7146-function ... */ + i = saacomm(SAA7146_V4L_CSYNC, frame); + + dprintk ("dvb: VIDIOCSYNC done - frame: %d\n", *frame); + + return i; + } + + case VIDIOCMCAPTURE: + { + struct video_mmap *vm = arg; + int i = 0; + + dprintk(KERN_ERR "dvb: VIDIOCMCAPTURE called: fr:%d," + "fmt:%d, w:%d, h:%d\n", + vm->frame, vm->format, vm->width, vm->height); + + switch (vm->format) { + case VIDEO_PALETTE_YUV422P: + case VIDEO_PALETTE_YUV420P: + case VIDEO_PALETTE_YUV411P: + return -EINVAL; + } + + /* simply pass the structure for the requested frame-number + to the corresponding saa7146-function ... */ + i = saacomm(SAA7146_V4L_CMCAPTURE, vm); + + return i; + } + + case VIDIOCGMBUF: + { + struct video_mbuf *mbuf = arg; + dprintk(KERN_ERR "dvb: VIDIOCGMBUF called\n"); + saacomm(SAA7146_V4L_GMBUF, mbuf); + return 0; + + } + + case VIDIOCGUNIT: + { + /*struct video_unit vu;*/ + dprintk(KERN_ERR "dvb: VIDIOCGUNIT called\n"); + return 0; + } + + case VIDIOCGCAPTURE: + { + dprintk(KERN_ERR "dvb: VIDIOCGCAPTURE called\n"); + return 0; + } + case VIDIOCSCAPTURE: + { + dprintk(KERN_ERR "dvb: VIDIOCSCAPTURE called\n"); + return 0; + } + + default: + return -ENOIOCTLCMD; + } + + return 0; +} + + +static int dvb_ioctl (struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + return video_usercopy(inode, file, cmd, arg, dvb_do_ioctl); +} + + +static int dvb_mmap(struct file* file, struct vm_area_struct *vma) +{ + struct video_device *dev = video_devdata (file); + av7110_t *av7110 = dev->priv; + + dprintk(KERN_ERR "av7110: dvb_mmap called, adr:%08lx, size:0x%08lx\n", + vma->vm_start, vma->vm_end - vma->vm_start); + + if (saacomm(SAA7146_DO_MMAP, vma)) { + printk(KERN_ERR "av7110: dvb_mmap failed!\n"); + return -1; + } + + return 0; +} + + +static unsigned int dvb_audio_poll(struct file *file, poll_table *wait) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + unsigned int mask=0; + + if (av7110->playing) { + if (ring_buffer_free(&av7110->aout)>20*1024) + return (POLLOUT | POLLWRNORM); + + poll_wait(file, &av7110->aout.queue, wait); + + if (ring_buffer_free(&av7110->aout)>20*1024) + mask |= (POLLOUT | POLLWRNORM); + } else /* if not playing: may play if asked for */ + mask = (POLLOUT | POLLWRNORM); + + return mask; +} + + +static struct file_operations dvb_fops = { + ioctl: dvb_ioctl, + mmap: dvb_mmap, + llseek: no_llseek +}; + + +/* template for video_device-structure */ +static struct video_device dvb_template = { + owner: THIS_MODULE, + name: "DVB Board", + type: VID_TYPE_TUNER | + VID_TYPE_CAPTURE | + VID_TYPE_OVERLAY | + VID_TYPE_CLIPPING | + VID_TYPE_FRAMERAM | + VID_TYPE_SCALES, + hardware: VID_HARDWARE_SAA7146, + fops: &dvb_fops +}; + + +static int vid_register(av7110_t *av7110) +{ + memcpy( &av7110->video, &dvb_template, sizeof(struct video_device)); + + av7110->video.priv = av7110; + + if (video_register_device(&av7110->video, VFL_TYPE_GRABBER, -1)) { + printk(KERN_ERR "dvb: can't register videodevice\n"); + return -1; + } + + return 0; +} + +static inline int vid_unregister(av7110_t *av7110) +{ + if (av7110->video.minor != -1) + video_unregister_device(&av7110->video); + + return 0; +} + +/**************************************************************************** + * END OF V4L SECTION + ****************************************************************************/ + + +/**************************************************************************** + * DVB API SECTION + ****************************************************************************/ + + +/****************************************************************************** + * hardware filter functions + ******************************************************************************/ + +static int +StartHWFilter(dvb_demux_filter_t *dvbdmxfilter) +{ + dvb_demux_feed_t *dvbdmxfeed=dvbdmxfilter->feed; + av7110_t *av7110=(av7110_t *) dvbdmxfeed->demux->priv; + u16 buf[20]; + int ret, i; + u16 handle; +// u16 mode=0x0320; + u16 mode=0xb96a; + + if (dvbdmxfilter->type==DMX_TYPE_SEC) { + buf[4]=(dvbdmxfilter->filter.filter_value[0]<<8)| + dvbdmxfilter->maskandmode[0]; + for (i=3; i<18; i++) + buf[i+4-2]=(dvbdmxfilter->filter.filter_value[i]<<8)| + dvbdmxfilter->maskandmode[i]; + mode=4; + } else + if ((dvbdmxfeed->ts_type & TS_PACKET) && + !(dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)) + init_p2t(&av7110->p2t_filter[dvbdmxfilter->index], dvbdmxfeed); + + buf[0] = (COMTYPE_PID_FILTER << 8) + AddPIDFilter; + buf[1] = 16; + buf[2] = dvbdmxfeed->pid; + buf[3] = mode; + + ret=CommandRequest(av7110, buf, 20, &handle, 1); + if (ret<0) + return ret; + + av7110->handle2filter[handle]=dvbdmxfilter; + dvbdmxfilter->hw_handle=handle; + + return ret; +} + +static int +StopHWFilter(dvb_demux_filter_t *dvbdmxfilter) +{ + av7110_t *av7110=(av7110_t *) dvbdmxfilter->feed->demux->priv; + u16 buf[3]; + u16 answ[2]; + int ret; + u16 handle; + + handle=dvbdmxfilter->hw_handle; + if (handle>32) { + dprintk("dvb: StopHWFilter tried to stop invalid filter %d.\n", + handle); + dprintk("dvb: filter type = %d\n", dvbdmxfilter->type); + return 0; + } + + av7110->handle2filter[handle]=NULL; + + buf[0] = (COMTYPE_PID_FILTER << 8) + DelPIDFilter; + buf[1] = 1; + buf[2] = handle; + ret=CommandRequest(av7110, buf, 3, answ, 2); + + if (answ[1] != handle) { + dprintk("dvb: filter %d shutdown error :%d\n", handle, answ[1]); + ret=-1; + } + return ret; +} + + +static int +dvb_write_to_decoder(dvb_demux_feed_t *dvbdmxfeed, u8 *buf, size_t count) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + av7110_t *av7110=(av7110_t *) dvbdmx->priv; + ipack *ipack=&av7110->ipack[dvbdmxfeed->pes_type]; + + switch (dvbdmxfeed->pes_type) { + case 0: + if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY) { + return -EINVAL; + } + break; + case 1: + if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY) { + return -EINVAL; + } + break; + default: + return -1; + } + + if (!(buf[3]&0x10)) { // no payload? + return -1; + } + if (buf[1]&0x40) + send_ipack_rest(ipack); + + if (buf[3]&0x20) { // adaptation field? + count-=buf[4]+1; + buf+=buf[4]+1; + if (!count) { + return 0; + } + } + + instant_repack(buf+4, count-4, &av7110->ipack[dvbdmxfeed->pes_type]); + return 0; +} + +static void +dvb_feed_start_pid(dvb_demux_feed_t *dvbdmxfeed) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + av7110_t *av7110=(av7110_t *) dvbdmx->priv; + u16 *pid=dvbdmx->pids, npids[5]; + int i; + + npids[0]=npids[1]=npids[2]=npids[3]=0xffff; + npids[4]=0xffff; + i=dvbdmxfeed->pes_type; + npids[i]=(pid[i]&0x8000) ? 0 : pid[i]; + if ((i==2) && npids[i] && (dvbdmxfeed->ts_type & TS_PACKET)) { + npids[i]=0; + ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]); + StartHWFilter(dvbdmxfeed->filter); + return; + } + if (dvbdmxfeed->pes_type<=2) + ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]); + + if (dvbdmxfeed->pes_type<2 && npids[0]) + if (av7110->fe_synced) + outcom(av7110, COMTYPE_PIDFILTER, Scan, 0); + + if ((dvbdmxfeed->ts_type & TS_PACKET)) { + if (dvbdmxfeed->pes_type == 0 && + !(dvbdmx->pids[0]&0x8000)) + AV_StartRecord(av7110, RP_AUDIO, + dvbdmxfeed); + if (dvbdmxfeed->pes_type == 1 && + !(dvbdmx->pids[1]&0x8000)) + AV_StartRecord(av7110, RP_VIDEO, + dvbdmxfeed); + } +} + +static void +dvb_feed_stop_pid(dvb_demux_feed_t *dvbdmxfeed) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + av7110_t *av7110=(av7110_t *) dvbdmx->priv; + u16 *pid=dvbdmx->pids, npids[5]; + int i; + + if (dvbdmxfeed->pes_type<=1) { + AV_Stop(av7110, dvbdmxfeed->pes_type ? + RP_VIDEO : RP_AUDIO); + if (!av7110->rec_mode) + dvbdmx->recording=0; + if (!av7110->playing) + dvbdmx->playing=0; + } + npids[0]=npids[1]=npids[2]=npids[3]=0xffff; + npids[4]=0xffff; + i=dvbdmxfeed->pes_type; + switch (i) { + case 2: //teletext + if (dvbdmxfeed->ts_type & TS_PACKET) + StopHWFilter(dvbdmxfeed->filter); + npids[2]=0; + break; + case 0: + case 1: + case 4: + if (!pids_off) + return; + npids[i]=(pid[i]&0x8000) ? 0 : pid[i]; + break; + } + ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]); +} + +static int +dvb_start_feed(dvb_demux_feed_t *dvbdmxfeed) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + av7110_t *av7110=(av7110_t *) dvbdmx->priv; + + if (!dvbdmx->dmx.frontend) + return -EINVAL; + + if (av7110->saa->card_type>=DVB_CARD_TT_BUDGET) + return TTBStart(av7110); + + if (dvbdmxfeed->pid>0x1fff) + return -1; + + if (dvbdmxfeed->type == DMX_TYPE_TS) { + if ((dvbdmxfeed->ts_type & TS_DECODER) + && (dvbdmxfeed->pes_type<DMX_TS_PES_OTHER)) { + + switch (dvbdmx->dmx.frontend->source) { + case DMX_MEMORY_FE: + if (dvbdmxfeed->ts_type & TS_DECODER) + if (dvbdmxfeed->pes_type<2 && + !(dvbdmx->pids[0]&0x8000) && + !(dvbdmx->pids[1]&0x8000)) { + ring_buffer_flush(&av7110->avout); + ring_buffer_flush(&av7110->aout); + AV_StartPlay(av7110,RP_AV); + dvbdmx->playing=1; + } + break; + default: + dvb_feed_start_pid(dvbdmxfeed); + break; + } + } else + if ((dvbdmxfeed->ts_type & TS_PACKET) && + (dvbdmx->dmx.frontend->source!=DMX_MEMORY_FE)) + StartHWFilter(dvbdmxfeed->filter); + } + + if (dvbdmxfeed->type == DMX_TYPE_SEC) { + int i; + + for (i=0; i<dvbdmx->filternum; i++) { + if (dvbdmx->filter[i].state!=DMX_STATE_READY) + continue; + if (dvbdmx->filter[i].type!=DMX_TYPE_SEC) + continue; + if (dvbdmx->filter[i].filter.parent!=&dvbdmxfeed->feed.sec) + continue; + dvbdmx->filter[i].state=DMX_STATE_GO; + if (dvbdmx->dmx.frontend->source!=DMX_MEMORY_FE) + StartHWFilter(&dvbdmx->filter[i]); + } + } + return 0; +} + + +static int +dvb_stop_feed(dvb_demux_feed_t *dvbdmxfeed) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + av7110_t *av7110=(av7110_t *) dvbdmx->priv; + + if (av7110->saa->card_type>=DVB_CARD_TT_BUDGET) + return TTBStop(av7110); + + if (dvbdmxfeed->type == DMX_TYPE_TS) { + if (dvbdmxfeed->ts_type & TS_DECODER) { + if (dvbdmxfeed->pes_type>=DMX_TS_PES_OTHER || + !dvbdmx->pesfilter[dvbdmxfeed->pes_type]) + return -EINVAL; + dvbdmx->pids[dvbdmxfeed->pes_type]|=0x8000; + dvbdmx->pesfilter[dvbdmxfeed->pes_type]=0; + } + if (dvbdmxfeed->ts_type & TS_DECODER && + (dvbdmxfeed->pes_type<DMX_TS_PES_OTHER)) { + dvb_feed_stop_pid(dvbdmxfeed); + } else + if ((dvbdmxfeed->ts_type & TS_PACKET) && + (dvbdmx->dmx.frontend->source!=DMX_MEMORY_FE)) + StopHWFilter(dvbdmxfeed->filter); + } + + if (dvbdmxfeed->type == DMX_TYPE_SEC) { + int i; + + for (i=0; i<dvbdmx->filternum; i++) + if (dvbdmx->filter[i].state==DMX_STATE_GO && + dvbdmx->filter[i].filter.parent==&dvbdmxfeed->feed.sec) { + dvbdmx->filter[i].state=DMX_STATE_READY; + if (dvbdmx->dmx.frontend->source!=DMX_MEMORY_FE) + StopHWFilter(&dvbdmx->filter[i]); + } + } + return 0; +} + + +static void +restart_feeds(av7110_t *av7110) +{ + dvb_demux_t *dvbdmx=&av7110->demux; + dvb_demux_feed_t *feed; + int mode; + int i; + + mode=av7110->playing; + av7110->playing=0; + av7110->rec_mode=0; + + for (i=0; i<dvbdmx->filternum; i++) { + feed=&dvbdmx->feed[i]; + if (feed->state==DMX_STATE_GO) + dvb_start_feed(feed); + } + + if (mode) + AV_StartPlay(av7110, mode); +} + +/****************************************************************************** + * SEC device file operations + ******************************************************************************/ + +static +int av7110_diseqc_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg) +{ + av7110_t *av7110 = fe->before_after_data; + + switch (cmd) { + case FE_SET_TONE: + switch ((fe_sec_tone_mode_t) arg) { + case SEC_TONE_ON: + Set22K (av7110, 1); + break; + case SEC_TONE_OFF: + Set22K (av7110, 0); + break; + default: + return -EINVAL; + }; + break; + + case FE_DISEQC_SEND_MASTER_CMD: + { + struct dvb_diseqc_master_cmd *cmd = arg; + + SendDiSEqCMsg (av7110, cmd->msg_len, cmd->msg, 0); + break; + } + + case FE_DISEQC_SEND_BURST: + SendDiSEqCMsg (av7110, 0, NULL, (int) arg); + break; + + default: + return -EOPNOTSUPP; + }; + + return 0; +} + +/****************************************************************************** + * CI link layer file ops (FIXME: move this to separate module later) + ******************************************************************************/ + +int ci_ll_init(ring_buffer_t *cirbuf, ring_buffer_t *ciwbuf, int size) +{ + ring_buffer_init(cirbuf, vmalloc(size), size); + ring_buffer_init(ciwbuf, vmalloc(size), size); + return 0; +} + +void ci_ll_flush(ring_buffer_t *cirbuf, ring_buffer_t *ciwbuf) +{ + ring_buffer_flush(cirbuf); + ring_buffer_flush(ciwbuf); +} + +void ci_ll_release(ring_buffer_t *cirbuf, ring_buffer_t *ciwbuf) +{ + vfree(cirbuf->data); + cirbuf->data=0; + vfree(ciwbuf->data); + ciwbuf->data=0; +} + + +int ci_ll_reset(ring_buffer_t *cibuf, struct file *file, + int slots, ca_slot_info_t *slot) +{ + int i; + + if (ring_buffer_free(cibuf)<8) + return -EBUSY; + for (i=0; i<2; i++) + if (slots&(1<<i)) { + cibuf->data[cibuf->pwrite]=0x00; + cibuf->data[(cibuf->pwrite+1)%cibuf->size]=0x06; + cibuf->data[(cibuf->pwrite+2)%cibuf->size]=i; + cibuf->data[(cibuf->pwrite+3)%cibuf->size]=0x00; + cibuf->data[(cibuf->pwrite+4)%cibuf->size]=0xff; + cibuf->data[(cibuf->pwrite+5)%cibuf->size]=0x02; + cibuf->data[(cibuf->pwrite+6)%cibuf->size]=0x00; + cibuf->data[(cibuf->pwrite+7)%cibuf->size]=0x00; + cibuf->pwrite=(cibuf->pwrite+8)%cibuf->size; + slot[i].flags=0; + } + return 0; +} + +static ssize_t +ci_ll_write(ring_buffer_t *cibuf, struct file *file, const char *buf, size_t count, loff_t *ppos) +{ + int free, split; + int32_t pread; + int non_blocking=file->f_flags&O_NONBLOCK; + + if (count>2048) + return -EINVAL; + pread=cibuf->pread; + free=pread-cibuf->pwrite; + if (free<=0) + free+=cibuf->size; + if (count+2>=free) { + if (non_blocking) + return -EWOULDBLOCK; + if (wait_event_interruptible(cibuf->queue, + (ring_buffer_free(cibuf)>count+2))) + return 0; + } + cibuf->data[cibuf->pwrite]=(count>>8); + cibuf->data[(cibuf->pwrite+1)%cibuf->size]=(count&0xff); + cibuf->pwrite=(cibuf->pwrite+2)%cibuf->size; + + if (pread>cibuf->pwrite) + split=0; + else + split=cibuf->size-cibuf->pwrite; + if (split && split<count) { + if (copy_from_user(cibuf->data + cibuf->pwrite, buf, split)) + return -EFAULT; + if (copy_from_user(cibuf->data, buf+split, count-split)) + return -EFAULT; + } else + if (copy_from_user(cibuf->data + cibuf->pwrite, buf, count)) + return -EFAULT; + cibuf->pwrite=(cibuf->pwrite+count)%cibuf->size; + return count; +} + +static ssize_t +ci_ll_read(ring_buffer_t *cibuf, struct file *file, char *buf, size_t count, loff_t *ppos) +{ + int split=0, avail, pwrite; + int non_blocking=file->f_flags&O_NONBLOCK; + + if (!cibuf->data || !count) + return 0; + if (non_blocking && (ring_buffer_empty(cibuf))) + return -EWOULDBLOCK; + if (wait_event_interruptible(cibuf->queue, + !ring_buffer_empty(cibuf))) + return 0; + pwrite=cibuf->pwrite; + avail=pwrite - cibuf->pread; + if (avail<0) + avail+=cibuf->size; + if (avail<4) + return 0; + count=(cibuf->data[cibuf->pread]<<8); + count|=cibuf->data[(cibuf->pread+1)%cibuf->size]; + if (avail<count+2) + return -EINVAL; + cibuf->pread=(cibuf->pread+2)%cibuf->size; + + if (pwrite<cibuf->pread) + split=cibuf->size-cibuf->pread; + if (split && split<count) { + if (copy_to_user(buf, cibuf->data+cibuf->pread, split)) + return -EFAULT; + if (copy_to_user(buf+split, cibuf->data, count-split)) + return -EFAULT; + } else + if (copy_to_user(buf, cibuf->data+cibuf->pread, count)) + return -EFAULT; + cibuf->pread=(cibuf->pread + count)%cibuf->size; + return count; +} + +static int +dvb_ca_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + int err=dvb_generic_open(inode, file); + + if (err<0) + return err; + ci_ll_flush(&av7110->ci_rbuffer, &av7110->ci_wbuffer); + return 0; +} + +static unsigned +int dvb_ca_poll(struct file *file, poll_table *wait) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + unsigned int mask=0; + + ring_buffer_t *rbuf=&av7110->ci_rbuffer; + ring_buffer_t *wbuf=&av7110->ci_wbuffer; + + if (!ring_buffer_empty(rbuf)) + mask|=POLLIN; + if (ring_buffer_avail(wbuf)>1024) + mask|=POLLOUT; + if (mask) + return mask; + + poll_wait(file, &rbuf->queue, wait); + + if (!ring_buffer_empty(rbuf)) + mask|=POLLIN; + if (ring_buffer_avail(wbuf)>1024) + mask|=POLLOUT; + + return mask; +} + +static int +dvb_ca_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + unsigned long arg=(unsigned long) parg; + + switch (cmd) { + case CA_RESET: +#ifdef NEW_CI + + return ci_ll_reset(&av7110->ci_wbuffer, file, arg, &av7110->ci_slot[0]); +#endif + break; + + case CA_GET_CAP: + { + ca_cap_t cap; + + cap.slot_num=2; +#ifdef NEW_CI + cap.slot_type=CA_CI_LINK; +#else + cap.slot_type=CA_CI; +#endif + cap.descr_num=16; + cap.descr_type=CA_ECD; + memcpy(parg, &cap, sizeof(cap)); + } + break; + + case CA_GET_SLOT_INFO: + { + ca_slot_info_t *info=(ca_slot_info_t *)parg; + + if (info->num>1) + return -EINVAL; +#ifdef NEW_CI + av7110->ci_slot[info->num].type = CA_CI_LINK; +#else + av7110->ci_slot[info->num].type = CA_CI; +#endif + memcpy(info, &av7110->ci_slot[info->num], sizeof(ca_slot_info_t)); + } + break; + + case CA_GET_MSG: + break; + + case CA_SEND_MSG: + break; + + case CA_GET_DESCR_INFO: + { + ca_descr_info_t info; + + info.num=16; + info.type=CA_ECD; + memcpy (parg, &info, sizeof (info)); + } + break; + + case CA_SET_DESCR: + { + ca_descr_t *descr=(ca_descr_t*) parg; + + if (descr->index>=16) + return -EINVAL; + if (descr->parity>1) + return -EINVAL; + outcom(av7110, COMTYPE_PIDFILTER, SetDescr, 5, + (descr->index<<8)|descr->parity, + (descr->cw[0]<<8)|descr->cw[1], + (descr->cw[2]<<8)|descr->cw[3], + (descr->cw[4]<<8)|descr->cw[5], + (descr->cw[6]<<8)|descr->cw[7]); + } + break; + + default: + return -EINVAL; + } + return 0; +} + +static ssize_t +dvb_ca_write(struct file *file, const char *buf, + size_t count, loff_t *ppos) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + return ci_ll_write(&av7110->ci_wbuffer, file, buf, count, ppos); +} + +static ssize_t +dvb_ca_read(struct file *file, char *buf, size_t count, loff_t *ppos) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + return ci_ll_read(&av7110->ci_rbuffer, file, buf, count, ppos); + +} + + + +/****************************************************************************** + * DVB device file operations + ******************************************************************************/ + +static unsigned int dvb_video_poll(struct file *file, poll_table *wait) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + unsigned int mask=0; + + if (av7110->playing) { + if (FREE_COND) + return (POLLOUT | POLLWRNORM); + + poll_wait(file, &av7110->avout.queue, wait); + + if (FREE_COND) + mask |= (POLLOUT | POLLWRNORM); + } else /* if not playing: may play if asked for */ + mask = (POLLOUT | POLLWRNORM); + + return mask; +} + +static ssize_t +dvb_video_write(struct file *file, const char *buf, + size_t count, loff_t *ppos) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + if (av7110->videostate.stream_source!=VIDEO_SOURCE_MEMORY) + return -EPERM; + + return dvb_play(av7110, buf, count, file->f_flags&O_NONBLOCK, 1, 1); +} + +static ssize_t +dvb_audio_write(struct file *file, const char *buf, + size_t count, loff_t *ppos) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + if (av7110->audiostate.stream_source!=AUDIO_SOURCE_MEMORY) { + printk(KERN_ERR "not audio source memory\n"); + return -EPERM; + } + return dvb_aplay(av7110, buf, count, file->f_flags&O_NONBLOCK, 0); +} + +u8 iframe_header[] = { 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00 }; + +#define MIN_IFRAME 400000 + +static void +play_iframe(av7110_t *av7110, u8 *buf, unsigned int len, int nonblock) +{ + int i, n=1; + + if (!(av7110->playing&RP_VIDEO)) { + AV_StartPlay(av7110, RP_VIDEO); + n=MIN_IFRAME/len+1; + } + + dvb_play(av7110, iframe_header, sizeof(iframe_header), 0, 1, 0); + + for (i=0; i<n; i++) + dvb_play(av7110, buf, len, 0, 1, 1); + + send_ipack_rest(&av7110->ipack[1]); +} + + +static int +dvb_video_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + unsigned long arg=(unsigned long) parg; + int ret=0; + + if (((file->f_flags&O_ACCMODE)==O_RDONLY) && + (cmd!=VIDEO_GET_STATUS)) + return -EPERM; + + switch (cmd) { + case VIDEO_STOP: + av7110->videostate.play_state=VIDEO_STOPPED; + if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY) + AV_Stop(av7110, RP_VIDEO); + else + vidcom(av7110, 0x000e, + av7110->videostate.video_blank ? 0 : 1); + av7110->trickmode=TRICK_NONE; + break; + + case VIDEO_PLAY: + av7110->trickmode=TRICK_NONE; + if (av7110->videostate.play_state==VIDEO_FREEZED) { + av7110->videostate.play_state=VIDEO_PLAYING; + vidcom(av7110, 0x000d, 0); + } + + if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY) { + if (av7110->playing==RP_AV) { + outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0); + av7110->playing&=~RP_VIDEO; + } + AV_StartPlay(av7110,RP_VIDEO); + vidcom(av7110, 0x000d, 0); + } else { + //AV_Stop(av7110, RP_VIDEO); + vidcom(av7110, 0x000d, 0); + } + av7110->videostate.play_state=VIDEO_PLAYING; + break; + + case VIDEO_FREEZE: + av7110->videostate.play_state=VIDEO_FREEZED; + if (av7110->playing&RP_VIDEO) + outcom(av7110, COMTYPE_REC_PLAY, __Pause, 0); + else + vidcom(av7110, 0x0102, 1); + av7110->trickmode=TRICK_FREEZE; + break; + + case VIDEO_CONTINUE: + if (av7110->playing&RP_VIDEO) + outcom(av7110, COMTYPE_REC_PLAY, __Continue, 0); + vidcom(av7110, 0x000d, 0); + av7110->videostate.play_state=VIDEO_PLAYING; + av7110->trickmode=TRICK_NONE; + break; + + case VIDEO_SELECT_SOURCE: + av7110->videostate.stream_source=(video_stream_source_t) arg; + break; + + case VIDEO_SET_BLANK: + av7110->videostate.video_blank=(int) arg; + break; + + case VIDEO_GET_STATUS: + memcpy(parg, &av7110->videostate, sizeof(struct video_status)); + break; + + case VIDEO_GET_EVENT: + //FIXME: write firmware support for this + ret=-EOPNOTSUPP; + + case VIDEO_SET_DISPLAY_FORMAT: + { + video_displayformat_t format=(video_displayformat_t) arg; + u16 val=0; + + switch(format) { + case VIDEO_PAN_SCAN: + val=VID_PAN_SCAN_PREF; + break; + + case VIDEO_LETTER_BOX: + val=VID_VC_AND_PS_PREF; + break; + + case VIDEO_CENTER_CUT_OUT: + val=VID_CENTRE_CUT_PREF; + break; + + default: + ret=-EINVAL; + break; + } + if (ret<0) + break; + av7110->videostate.video_format=format; + ret=outcom(av7110, COMTYPE_ENCODER, SetPanScanType, + 1, (u16) val); + break; + } + + case VIDEO_SET_FORMAT: + if (arg>1) { + ret=-EINVAL; + break; + } + av7110->display_ar=arg; + ret=outcom(av7110, COMTYPE_ENCODER, SetMonitorType, + 1, (u16) arg); + break; + + case VIDEO_STILLPICTURE: + { + struct video_still_picture *pic= + (struct video_still_picture *) parg; + ring_buffer_flush(&av7110->avout); + play_iframe(av7110, pic->iFrame, pic->size, + file->f_flags&O_NONBLOCK); + break; + } + + case VIDEO_FAST_FORWARD: + //note: arg is ignored by firmware + if (av7110->playing&RP_VIDEO) + outcom(av7110, COMTYPE_REC_PLAY, + __Scan_I, 2, AV_PES, 0); + else + vidcom(av7110, 0x16, arg); + av7110->trickmode=TRICK_FAST; + av7110->videostate.play_state=VIDEO_PLAYING; + break; + + case VIDEO_SLOWMOTION: + if (av7110->playing&RP_VIDEO) { + outcom(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0); + vidcom(av7110, 0x22, arg); + } else { + vidcom(av7110, 0x0d, 0); + vidcom(av7110, 0x0e, 0); + vidcom(av7110, 0x22, arg); + } + av7110->trickmode=TRICK_SLOW; + av7110->videostate.play_state=VIDEO_PLAYING; + break; + + case VIDEO_GET_CAPABILITIES: + *(int *)parg=VIDEO_CAP_MPEG1| + VIDEO_CAP_MPEG2| + VIDEO_CAP_SYS| + VIDEO_CAP_PROG; + break; + + case VIDEO_CLEAR_BUFFER: + ring_buffer_flush(&av7110->avout); + reset_ipack(&av7110->ipack[1]); + + if (av7110->playing==RP_AV) { + outcom(av7110, COMTYPE_REC_PLAY, + __Play, 2, AV_PES, 0); + if (av7110->trickmode==TRICK_FAST) + outcom(av7110, COMTYPE_REC_PLAY, + __Scan_I, 2, AV_PES, 0); + if (av7110->trickmode==TRICK_SLOW) { + outcom(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0); + vidcom(av7110, 0x22, arg); + } + if (av7110->trickmode==TRICK_FREEZE) + vidcom(av7110, 0x000e, 1); + } + break; + + case VIDEO_SET_STREAMTYPE: + + break; + + default: + ret=-ENOIOCTLCMD; + break; + } + return ret; +} + +static int +dvb_audio_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + unsigned long arg=(unsigned long) parg; + int ret=0; + + if (((file->f_flags&O_ACCMODE)==O_RDONLY) && + (cmd!=AUDIO_GET_STATUS)) + return -EPERM; + + switch (cmd) { + case AUDIO_STOP: + if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY) + AV_Stop(av7110, RP_AUDIO); + else + audcom(av7110, 1); + av7110->audiostate.play_state=AUDIO_STOPPED; + break; + + case AUDIO_PLAY: + if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY) + AV_StartPlay(av7110, RP_AUDIO); + audcom(av7110, 2); + av7110->audiostate.play_state=AUDIO_PLAYING; + break; + + case AUDIO_PAUSE: + audcom(av7110, 1); + av7110->audiostate.play_state=AUDIO_PAUSED; + break; + + case AUDIO_CONTINUE: + if (av7110->audiostate.play_state==AUDIO_PAUSED) { + av7110->audiostate.play_state=AUDIO_PLAYING; + audcom(av7110, 0x12); + } + break; + + case AUDIO_SELECT_SOURCE: + av7110->audiostate.stream_source=(audio_stream_source_t) arg; + break; + + case AUDIO_SET_MUTE: + { + audcom(av7110, arg ? 1 : 2); + av7110->audiostate.mute_state=(int) arg; + break; + } + + case AUDIO_SET_AV_SYNC: + av7110->audiostate.AV_sync_state=(int) arg; + audcom(av7110, arg ? 0x0f : 0x0e); + break; + + case AUDIO_SET_BYPASS_MODE: + ret=-EINVAL; + break; + + case AUDIO_CHANNEL_SELECT: + av7110->audiostate.channel_select=(audio_channel_select_t) arg; + + switch(av7110->audiostate.channel_select) { + case AUDIO_STEREO: + audcom(av7110, 0x80); + break; + + case AUDIO_MONO_LEFT: + audcom(av7110, 0x100); + break; + + case AUDIO_MONO_RIGHT: + audcom(av7110, 0x200); + break; + + default: + ret=-EINVAL; + break; + } + break; + + case AUDIO_GET_STATUS: + memcpy(parg, &av7110->audiostate, sizeof(struct audio_status)); + break; + + case AUDIO_GET_CAPABILITIES: + *(int *)parg=AUDIO_CAP_LPCM| + AUDIO_CAP_MP1| + AUDIO_CAP_MP2; + break; + + case AUDIO_CLEAR_BUFFER: + ring_buffer_flush(&av7110->aout); + reset_ipack(&av7110->ipack[0]); + if (av7110->playing==RP_AV) + outcom(av7110, COMTYPE_REC_PLAY, + __Play, 2, AV_PES, 0); + break; + case AUDIO_SET_ID: + + break; + case AUDIO_SET_MIXER: + { + struct audio_mixer *amix=(struct audio_mixer *)parg; + + SetVolume(av7110, amix->volume_left, amix->volume_right); + break; + } + case AUDIO_SET_STREAMTYPE: + break; + default: + ret=-ENOIOCTLCMD; + break; + } + return ret; +} + +static int +dvb_osd_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + +#ifdef CONFIG_DVB_AV7110_OSD + if (cmd==OSD_SEND_CMD) + return OSD_DrawCommand(av7110, (osd_cmd_t *)parg); +#endif + return -EINVAL; +} + +static int dvb_video_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + int err; + + if ((err=dvb_generic_open(inode, file))<0) + return err; + ring_buffer_flush(&av7110->aout); + ring_buffer_flush(&av7110->avout); + av7110->video_blank=1; + av7110->audiostate.AV_sync_state=1; + av7110->videostate.stream_source=VIDEO_SOURCE_DEMUX; + return 0; +} + +static int dvb_video_release(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + AV_Stop(av7110, RP_VIDEO); + return dvb_generic_release(inode, file); +} + +static int dvb_audio_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + int err=dvb_generic_open(inode, file); + + if (err<0) + return err; + ring_buffer_flush(&av7110->aout); + av7110->audiostate.stream_source=AUDIO_SOURCE_DEMUX; + return 0; +} + +static int dvb_audio_release(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + AV_Stop(av7110, RP_AUDIO); + return dvb_generic_release(inode, file); +} + + + +/****************************************************************************** + * driver registration + ******************************************************************************/ + +static struct file_operations dvb_video_fops = { + owner: THIS_MODULE, + read: 0, + write: dvb_video_write, + ioctl: dvb_generic_ioctl, + open: dvb_video_open, + release: dvb_video_release, + poll: dvb_video_poll, +}; + +static dvb_device_t dvbdev_video = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_video_fops, + kernel_ioctl: dvb_video_ioctl, +}; + +static struct file_operations dvb_audio_fops = { + owner: THIS_MODULE, + read: 0, + write: dvb_audio_write, + ioctl: dvb_generic_ioctl, + open: dvb_audio_open, + release: dvb_audio_release, + poll: dvb_audio_poll, +}; + +static dvb_device_t dvbdev_audio = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_audio_fops, + kernel_ioctl: dvb_audio_ioctl, +}; + +static struct file_operations dvb_ca_fops = { + owner: THIS_MODULE, + read: dvb_ca_read, + write: dvb_ca_write, + ioctl: dvb_generic_ioctl, + open: dvb_ca_open, + release: dvb_generic_release, + poll: dvb_ca_poll, +}; + +static dvb_device_t dvbdev_ca = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_ca_fops, + kernel_ioctl: dvb_ca_ioctl, +}; + +static struct file_operations dvb_osd_fops = { + owner: THIS_MODULE, + read: 0, + write: 0, + ioctl: dvb_generic_ioctl, + open: dvb_generic_open, + release: dvb_generic_release, + poll: 0, +}; + +static dvb_device_t dvbdev_osd = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_osd_fops, + kernel_ioctl: dvb_osd_ioctl, +}; + + +static +void av7110_before_after_tune (fe_status_t s, void *data) +{ + struct av7110_s *av7110 = data; + + av7110->fe_synced = (s & FE_HAS_LOCK) ? 1 : 0; + + if (av7110->playing) + return; + + if (down_interruptible(&av7110->pid_mutex)) + return; + + if (av7110->fe_synced) { + SetPIDs(av7110, av7110->pids[DMX_PES_VIDEO], + av7110->pids[DMX_PES_AUDIO], + av7110->pids[DMX_PES_TELETEXT], 0, + av7110->pids[DMX_PES_PCR]); + outcom(av7110, COMTYPE_PIDFILTER, Scan, 0); + } else + SetPIDs(av7110, 0, 0, 0, 0, 0); + + up(&av7110->pid_mutex); +} + + +static int +dvb_register(av7110_t *av7110) +{ + int ret, i; + dmx_frontend_t *dvbfront=&av7110->hw_frontend; + dvb_demux_t *dvbdemux=&av7110->demux; + + if (av7110->registered) + return -1; + + av7110->registered=1; + + av7110->dvb_adapter = av7110->saa->dvb_adapter; + + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) + dvb_add_frontend_notifier (av7110->dvb_adapter, + av7110_before_after_tune, av7110); + /** + * init DiSEqC stuff + */ + if (av7110->saa->card_type==DVB_CARD_TT_BUDGET || + av7110->saa->card_type==DVB_CARD_TT_SIEMENS) + dvb_add_frontend_ioctls (av7110->dvb_adapter, + av7110_diseqc_ioctl, NULL, av7110); + + av7110->audiostate.AV_sync_state=0; + av7110->audiostate.mute_state=0; + av7110->audiostate.play_state=AUDIO_STOPPED; + av7110->audiostate.stream_source=AUDIO_SOURCE_DEMUX; + av7110->audiostate.channel_select=AUDIO_STEREO; + av7110->audiostate.bypass_mode=0; + + av7110->videostate.video_blank=0; + av7110->videostate.play_state=VIDEO_STOPPED; + av7110->videostate.stream_source=VIDEO_SOURCE_DEMUX; + av7110->videostate.video_format=VIDEO_FORMAT_4_3; + av7110->videostate.display_format=VIDEO_CENTER_CUT_OUT; + av7110->display_ar=VIDEO_FORMAT_4_3; + + memcpy(av7110->demux_id, "demux0_0", 9); + av7110->demux_id[7]=av7110->saa->dvb_adapter->num+0x30; + dvbdemux->priv=(void *) av7110; + + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) { + for (i=0; i<32; i++) + av7110->handle2filter[i]=NULL; + + dvbdemux->filternum=32; + dvbdemux->feednum=32; + dvbdemux->start_feed=dvb_start_feed; + dvbdemux->stop_feed=dvb_stop_feed; + dvbdemux->write_to_decoder=dvb_write_to_decoder; + + dvbdemux->dmx.vendor="TI"; + dvbdemux->dmx.model="AV7110"; + dvbdemux->dmx.id=av7110->demux_id; + dvbdemux->dmx.capabilities=(DMX_TS_FILTERING| + DMX_SECTION_FILTERING| + DMX_MEMORY_BASED_FILTERING); + + DvbDmxInit(&av7110->demux); + + + dvbfront->id="hw_frontend"; + dvbfront->vendor="VLSI"; + dvbfront->model="DVB Frontend"; + dvbfront->source=DMX_FRONTEND_0; + + av7110->dmxdev.filternum=32; + av7110->dmxdev.demux=&dvbdemux->dmx; + av7110->dmxdev.capabilities=0; + + DmxDevInit(&av7110->dmxdev, av7110->dvb_adapter); + } + + if (av7110->saa->card_type>=DVB_CARD_TT_BUDGET) { + dvbdemux->filternum=256; + dvbdemux->feednum=256; + dvbdemux->start_feed=dvb_start_feed; + dvbdemux->stop_feed=dvb_stop_feed; + dvbdemux->write_to_decoder=0; + + dvbdemux->dmx.vendor="CIM"; + dvbdemux->dmx.model="sw"; + dvbdemux->dmx.id=av7110->demux_id; + dvbdemux->dmx.capabilities=(DMX_TS_FILTERING| + DMX_SECTION_FILTERING| + DMX_MEMORY_BASED_FILTERING); + + DvbDmxInit(&av7110->demux); + + dvbfront->id="hw_frontend"; + dvbfront->vendor="VLSI"; + dvbfront->model="DVB Frontend"; + dvbfront->source=DMX_FRONTEND_0; + + av7110->dmxdev.filternum=256; + av7110->dmxdev.demux=&dvbdemux->dmx; + av7110->dmxdev.capabilities=0; + + DmxDevInit(&av7110->dmxdev, av7110->dvb_adapter); + } + + ret=dvbdemux->dmx.add_frontend(&dvbdemux->dmx, + &av7110->hw_frontend); + if (ret<0) + return ret; + + av7110->mem_frontend.id="mem_frontend"; + av7110->mem_frontend.vendor="memory"; + av7110->mem_frontend.model="sw"; + av7110->mem_frontend.source=DMX_MEMORY_FE; + ret=dvbdemux->dmx.add_frontend(&dvbdemux->dmx, + &av7110->mem_frontend); + if (ret<0) + return ret; + + ret=dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, + &av7110->hw_frontend); + if (ret<0) + return ret; + + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) { + dvb_register_device(av7110->dvb_adapter, &av7110->video_dev, + &dvbdev_video, av7110, DVB_DEVICE_VIDEO); + dvb_register_device(av7110->dvb_adapter, &av7110->audio_dev, + &dvbdev_audio, av7110, DVB_DEVICE_AUDIO); + dvb_register_device(av7110->dvb_adapter, &av7110->osd_dev, + &dvbdev_osd, av7110, DVB_DEVICE_OSD); + dvb_register_device(av7110->dvb_adapter, &av7110->ca_dev, + &dvbdev_ca, av7110, DVB_DEVICE_CA); + vid_register(av7110); +#ifdef USE_DVB_DSP + dvb->dsp_dev = dvb_register_dsp(dvb_audio_open, + dvb_audio_release, + dvb_audio_ioctl, + dvb_audio_write, + av7110->audio_dev); +#endif + } + + av7110->dvb_net.card_num=av7110->saa->dvb_adapter->num; + dvb_net_init(av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx); + + return 0; +} + + +static void +dvb_unregister(av7110_t *av7110) +{ + dvb_demux_t *dvbdemux=&av7110->demux; + + if (!av7110->registered) + return; + + dvb_net_release(&av7110->dvb_net); + + dvbdemux->dmx.close(&dvbdemux->dmx); + dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->hw_frontend); + dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->mem_frontend); + + DmxDevRelease(&av7110->dmxdev); + DvbDmxRelease(&av7110->demux); + + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) + dvb_remove_frontend_notifier (av7110->dvb_adapter, + av7110_before_after_tune); + + dvb_remove_frontend_ioctls (av7110->dvb_adapter, + av7110_diseqc_ioctl, NULL); + + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) { + vid_unregister(av7110); + dvb_unregister_device(av7110->audio_dev); + dvb_unregister_device(av7110->video_dev); + dvb_unregister_device(av7110->osd_dev); + dvb_unregister_device(av7110->ca_dev); +#ifdef USE_DVB_DSP + dvb_unregister_dsp(av7110->dsp_dev); +#endif + } +} + +/**************************************************************************** + * INITIALIZATION + ****************************************************************************/ + +static +int av7110_attach (struct saa7146 *saa, void **av7110_ptr) +{ + struct av7110_s *av7110; + + if (!(av7110 = kmalloc (sizeof (struct av7110_s), GFP_KERNEL))) { + printk ("%s: out of memory!\n", __FUNCTION__); + return -ENOMEM; + } + + *av7110_ptr = av7110; + + memset(av7110, 0, sizeof(av7110_t)); + + tasklet_init (&av7110->debi_tasklet, debiirq, (unsigned long) av7110); + tasklet_init (&av7110->gpio_tasklet, gpioirq, (unsigned long) av7110); + tasklet_init (&av7110->vpe_tasklet, vpeirq, (unsigned long) av7110); + tasklet_init (&av7110->fidb_tasklet, fidbirq, (unsigned long) av7110); + + sema_init(&av7110->pid_mutex, 1); + + /* locks for data transfers from/to AV7110 */ + spin_lock_init (&av7110->debilock); + sema_init(&av7110->dcomlock, 1); + av7110->debilock=SPIN_LOCK_UNLOCKED; + av7110->debitype=-1; + + av7110->saa=(struct saa7146 *) saa; + av7110->saa_mem=av7110->saa->mem; + + /* default ADAC type */ + av7110->adac_type = adac; + + /* default OSD window */ + av7110->osdwin=1; + + /* ARM "watchdog" */ + init_waitqueue_head(&av7110->arm_wait); + av7110->arm_thread=0; + + av7110->vidmode=VIDEO_MODE_PAL; + + init_ipack(&av7110->ipack[0], IPACKS, play_audio_cb); + av7110->ipack[0].data=(void *) av7110; + init_ipack(&av7110->ipack[1], IPACKS, play_video_cb); + av7110->ipack[1].data=(void *) av7110; + + + /* allocate and init buffers */ + + av7110->debi_virt=pci_alloc_consistent(av7110->saa->device, 8192, + &av7110->debi_bus); + if (!av7110->debi_virt) + return -1; + + av7110->iobuf=vmalloc(AVOUTLEN+AOUTLEN+BMPLEN+4*IPACKS); + if (!av7110->iobuf) + return -1; + + ring_buffer_init(&av7110->avout, av7110->iobuf, AVOUTLEN); + ring_buffer_init(&av7110->aout, av7110->iobuf+AVOUTLEN, AOUTLEN); + + /* init BMP buffer */ + av7110->bmpbuf=av7110->iobuf+AVOUTLEN+AOUTLEN; + init_waitqueue_head(&av7110->bmpq); + + av7110->kbuf[0]=(u8 *)(av7110->iobuf+AVOUTLEN+AOUTLEN+BMPLEN); + av7110->kbuf[1]=av7110->kbuf[0]+2*IPACKS; + + /* CI link layer buffers */ + ci_ll_init(&av7110->ci_rbuffer, &av7110->ci_wbuffer, 8192); + + /* handle different card types */ + + /* load firmware into AV7110 cards */ + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) { + bootarm(av7110); + firmversion(av7110); + if ((av7110->arm_app&0xffff)<0x2502) { + printk("av7110: Warning, firmware version is too old. System might be unstable!!!\n"); + } + kernel_thread(arm_thread, (void *) av7110, 0); + } else { + saa7146_write(av7110->saa_mem, DD1_INIT, 0x02000600); + saa7146_write(av7110->saa_mem, MC2, + (MASK_09 | MASK_25 | MASK_10 | MASK_26)); + setgpio(av7110, 2, GPIO_OUTHI); /* frontend power on */ + } + + SetVolume(av7110, 0xff, 0xff); + + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) { + VidMode(av7110, vidmode); + + /* remaining inits according to card and frontend type */ + + if (i2c_writereg(av7110, 0x20, 0x00, 0x00)==1) { + dprintk("av7110%d: Crystal audio DAC detected\n", + av7110->saa->dvb_adapter->num); + av7110->adac_type = DVB_ADAC_CRYSTAL; + i2c_writereg(av7110, 0x20, 0x01, 0xd2); + i2c_writereg(av7110, 0x20, 0x02, 0x49); + i2c_writereg(av7110, 0x20, 0x03, 0x00); + i2c_writereg(av7110, 0x20, 0x04, 0x00); + } + + /** + * some special handling for the Siemens DVB-C card... + */ + if (av7110->saa->device->subsystem_vendor == 0x110a) { + if (i2c_writereg(av7110, 0x80, 0x0, 0x80)==1) { + i2c_writereg(av7110, 0x80, 0x0, 0); + printk("av7110: DVB-C analog module detected, " + "initializing MSP3400\n"); + ddelay(10); + msp_writereg(av7110, 0x12, 0x0013, 0x0c00); + msp_writereg(av7110, 0x12, 0x0000, 0x7f00); // loudspeaker + headphone + msp_writereg(av7110, 0x12, 0x0008, 0x0220); // loudspeaker source + msp_writereg(av7110, 0x12, 0x0004, 0x7f00); // loudspeaker volume + msp_writereg(av7110, 0x12, 0x000a, 0x0220); // SCART 1 source + msp_writereg(av7110, 0x12, 0x0007, 0x7f00); // SCART 1 volume + msp_writereg(av7110, 0x12, 0x000d, 0x4800); // prescale SCART + } + + // switch DVB SCART on + outcom(av7110, COMTYPE_AUDIODAC, MainSwitch, 1, 0); + outcom(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 1); + + //setgpio(av7110, 1, GPIO_OUTHI); // RGB on, SCART pin 16 + //setgpio(av7110, 3, GPIO_OUTLO); // SCARTpin 8 + av7110->adac_type = DVB_ADAC_NONE; + } + } + + if (init_vpid != 0 || init_apid != 0) + ChangePIDs(av7110, init_vpid, init_apid, 0, 0, 0); + + av7110_setup_irc_config (av7110, 0); + dvb_register(av7110); + + return 0; +} + + +static +int av7110_detach (struct saa7146 *saa, void** av7110_ptr) +{ + struct av7110_s *av7110 = *av7110_ptr; + + av7110->arm_rmmod=1; + wake_up_interruptible(&av7110->arm_wait); + + while (av7110->arm_thread) + ddelay(1); + + dvb_unregister(av7110); + + saa7146_write (av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) & ~(MASK_19 | MASK_03)); + + saa7146_write(av7110->saa_mem, ISR,(MASK_19 | MASK_03)); + + ci_ll_release(&av7110->ci_rbuffer, &av7110->ci_wbuffer); + free_ipack(&av7110->ipack[0]); + free_ipack(&av7110->ipack[1]); + vfree(av7110->iobuf); + pci_free_consistent(av7110->saa->device, 8192, av7110->debi_virt, + av7110->debi_bus); + + kfree (av7110); + *av7110_ptr = NULL; + + return 0; +} + + +static +void av7110_irq(struct saa7146 *saa, u32 isr, void *data) +{ + struct av7110_s *av7110 = (struct av7110_s*) data; + + if (isr & MASK_19) + tasklet_schedule (&av7110->debi_tasklet); + + if (isr & MASK_03) + tasklet_schedule (&av7110->gpio_tasklet); + + if (isr & MASK_10) + tasklet_schedule (&av7110->vpe_tasklet); + + if (isr & MASK_07) + tasklet_schedule (&av7110->fidb_tasklet); +} + + +static +int av7110_command(struct saa7146 *saa, void *p, unsigned int cmd, void *arg) +{ + switch(cmd) { + case SAA7146_SUSPEND: + printk("dvb_suspend()\n"); + break; + case SAA7146_RESUME: + printk("dvb_resume()\n"); + break; + default: + return -ENOIOCTLCMD; + } + return 0; +} + + +static +void av7110_inc_use(struct saa7146* adap) +{ + MOD_INC_USE_COUNT; +} + + +static +void av7110_dec_use(struct saa7146* adap) +{ + MOD_DEC_USE_COUNT; +} + + +static struct saa7146_extension av7110_extension = { + "dvb extension\0", + MASK_07|MASK_10|MASK_19|MASK_03|MASK_27, + av7110_irq, + av7110_command, + av7110_attach, + av7110_detach, + av7110_inc_use, + av7110_dec_use +}; + + +int __init av7110_init(void) +{ + int result = 0; + + if ((result = saa7146_add_extension(&av7110_extension))) { + printk("%s: saa7146_add_extension() failed!\n", + __FUNCTION__); + return result; + } + + return result; +} + + +void __exit av7110_exit(void) +{ + if (saa7146_del_extension(&av7110_extension)) + printk(KERN_ERR "dvb: extension deregistration failed.\n"); +} + +//MODULE_DESCRIPTION("driver for the SAA7146 based AV110 PCI DVB cards by " +// "Siemens, Technotrend, Hauppauge"); +//MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, others"); +//MODULE_LICENSE("GPL"); + +MODULE_PARM(av7110_debug,"i"); +MODULE_PARM(vidmem,"l"); +MODULE_PARM(vidlow,"l"); +MODULE_PARM(vidmode,"i"); +MODULE_PARM(init_vpid,"i"); +MODULE_PARM(init_apid,"i"); +MODULE_PARM(pids_off,"i"); +MODULE_PARM(adac,"i"); + +/* + * Local variables: + * c-indent-level: 8 + * c-brace-imaginary-offset: 0 + * c-brace-offset: -8 + * c-argdecl-indent: 8 + * c-label-offset: -8 + * c-continued-statement-offset: 8 + * c-continued-brace-offset: 0 + * indent-tabs-mode: nil + * tab-width: 8 + * End: + */ + diff --git a/drivers/media/dvb/av7110/av7110.h b/drivers/media/dvb/av7110/av7110.h new file mode 100644 index 000000000000..4ba483deaaa2 --- /dev/null +++ b/drivers/media/dvb/av7110/av7110.h @@ -0,0 +1,743 @@ +#ifndef _AV7110_H_ +#define _AV7110_H_ + +#define DVB_FIRM_PATH "/lib/DVB/" + +#include <linux/interrupt.h> +#include <linux/videodev.h> +#include <linux/socket.h> +#include <linux/netdevice.h> + +#ifdef CONFIG_DEVFS_FS +#include <linux/devfs_fs_kernel.h> +#endif + +/* DEBI transfer mode defs */ + +#define DEBINOSWAP 0x000e0000 +#define DEBISWAB 0x001e0000 +#define DEBISWAP 0x002e0000 + +#define ARM_WAIT_FREE (HZ) +#define ARM_WAIT_SHAKE (HZ/5) +#define ARM_WAIT_OSD (HZ) + +#if LINUX_VERSION_CODE < 0x020300 +#define net_device device +#define DECLARE_MUTEX(foo) struct semaphore foo = MUTEX +#define DECLARE_MUTEX_LOCKED(foo) struct semaphore foo = MUTEX_LOCKED +#define WAIT_QUEUE struct wait_queue* +#define init_waitqueue_head(wq) *(wq) = NULL; +#define DECLARE_WAITQUEUE(wait, current) struct wait_queue wait = { current, NULL } +#define set_current_state(state_value) \ + do { current->state = state_value; } while (0) +#define list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +#else + +#define WAIT_QUEUE wait_queue_head_t + +#endif + +#include <linux/dvb/video.h> +#include <linux/dvb/audio.h> +#include <linux/dvb/dmx.h> +#include <linux/dvb/ca.h> +#include <linux/dvb/osd.h> +#include <linux/dvb/net.h> + +#include "../dvb-core/dvbdev.h" +#include "../dvb-core/demux.h" +#include "../dvb-core/dvb_demux.h" +#include "../dvb-core/dmxdev.h" +#include "../dvb-core/dvb_filter.h" +#include "../dvb-core/dvb_net.h" + + +typedef enum BOOTSTATES +{ + BOOTSTATE_BUFFER_EMPTY = 0, + BOOTSTATE_BUFFER_FULL = 1, + BOOTSTATE_BOOT_COMPLETE = 2 +} BOOTSTATES; + +typedef enum GPIO_MODE +{ + GPIO_INPUT = 0x00, + GPIO_IRQHI = 0x10, + GPIO_IRQLO = 0x20, + GPIO_IRQHL = 0x30, + GPIO_OUTLO = 0x40, + GPIO_OUTHI = 0x50 +} GPIO_MODE; + +typedef enum +{ RP_None, + AudioPES, + AudioMp2, + AudioPCM, + VideoPES, + AV_PES +} TYPE_REC_PLAY_FORMAT; + +typedef struct PARAMSTRUCT +{ + unsigned int wCommand; + int error; + unsigned long pdwData[100]; +} PARAMSTRUCT, *PPARAMSTRUCT; + +typedef enum OSDPALTYPE +{ + NoPalet = 0, /* No palette */ + Pal1Bit = 2, /* 2 colors for 1 Bit Palette */ + Pal2Bit = 4, /* 4 colors for 2 bit palette */ + Pal4Bit = 16, /* 16 colors for 4 bit palette */ + Pal8Bit = 256 /* 256 colors for 16 bit palette */ +} OSDPALTYPE, *POSDPALTYPE; + +typedef enum { + BITMAP1, /* 1 bit bitmap */ + BITMAP2, /* 2 bit bitmap */ + BITMAP4, /* 4 bit bitmap */ + BITMAP8, /* 8 bit bitmap */ + BITMAP1HR, /* 1 Bit bitmap half resolution */ + BITMAP2HR, /* 2 bit bitmap half resolution */ + BITMAP4HR, /* 4 bit bitmap half resolution */ + BITMAP8HR, /* 8 bit bitmap half resolution */ + YCRCB422, /* 4:2:2 YCRCB Graphic Display */ + YCRCB444, /* 4:4:4 YCRCB Graphic Display */ + YCRCB444HR, /* 4:4:4 YCRCB graphic half resolution */ + VIDEOTSIZE, /* True Size Normal MPEG Video Display */ + VIDEOHSIZE, /* MPEG Video Display Half Resolution */ + VIDEOQSIZE, /* MPEG Video Display Quarter Resolution */ + VIDEODSIZE, /* MPEG Video Display Double Resolution */ + VIDEOTHSIZE, /* True Size MPEG Video Display Half Resolution */ + VIDEOTQSIZE, /* True Size MPEG Video Display Quarter Resolution*/ + VIDEOTDSIZE, /* True Size MPEG Video Display Double Resolution */ + VIDEONSIZE, /* Full Size MPEG Video Display */ + CURSOR /* Cursor */ +} DISPTYPE; /* Window display type */ + +// switch defines +#define SB_GPIO 3 +#define SB_OFF GPIO_OUTLO //SlowBlank aus (TV-Mode) +#define SB_ON GPIO_INPUT //SlowBlank an (AV-Mode) +#define SB_WIDE GPIO_OUTHI //SlowBlank 6V (16/9-Mode) nicht realisiert + +#define FB_GPIO 1 +#define FB_OFF GPIO_LO //FastBlank aus (CVBS-Mode) +#define FB_ON GPIO_OUTHI //FastBlank an (RGB-Mode) +#define FB_LOOP GPIO_INPUT //FastBlank der PC-Grafik durchschleifen + +typedef enum VIDEOOUTPUTMODE +{ + NO_OUT = 0, //disable analog Output + CVBS_RGB_OUT = 1, + CVBS_YC_OUT = 2, + YC_OUT = 3 +} VIDEOOUTPUTMODE, *PVIDEOOUTPUTMODE; + + +#define GPMQFull 0x0001 //Main Message Queue Full +#define GPMQOver 0x0002 //Main Message Queue Overflow +#define HPQFull 0x0004 //High Priority Msg Queue Full +#define HPQOver 0x0008 +#define OSDQFull 0x0010 //OSD Queue Full +#define OSDQOver 0x0020 + +#define SECTION_EIT 0x01 +#define SECTION_SINGLE 0x00 +#define SECTION_CYCLE 0x02 +#define SECTION_CONTINUOS 0x04 +#define SECTION_MODE 0x06 +#define SECTION_IPMPE 0x0C // bis zu 4k groß +#define SECTION_HIGH_SPEED 0x1C // vergrößerter Puffer für High Speed Filter +#define DATA_PIPING_FLAG 0x20 // für Data Piping Filter + +#define PBUFSIZE_NONE 0x0000 +#define PBUFSIZE_1P 0x0100 +#define PBUFSIZE_2P 0x0200 +#define PBUFSIZE_1K 0x0300 +#define PBUFSIZE_2K 0x0400 +#define PBUFSIZE_4K 0x0500 +#define PBUFSIZE_8K 0x0600 +#define PBUFSIZE_16K 0x0700 +#define PBUFSIZE_32K 0x0800 + +typedef enum { + WCreate, + WDestroy, + WMoveD, + WMoveA, + WHide, + WTop, + DBox, + DLine, + DText, + Set_Font, + SetColor, + SetBlend, + SetWBlend, + SetCBlend, + SetNonBlend, + LoadBmp, + BlitBmp, + ReleaseBmp, + SetWTrans, + SetWNoTrans +} OSDCOM; + +typedef enum { + MultiPID, + VideoPID, + AudioPID, + InitFilt, + FiltError, + NewVersion, + CacheError, + AddPIDFilter, + DelPIDFilter, + Scan, + SetDescr, + SetIR +} PIDCOM; + +typedef enum { + SelAudChannels +} MPEGCOM; + +typedef enum { + AudioDAC, + CabADAC, + ON22K, + OFF22K, + MainSwitch, + ADSwitch, + SendDiSEqC, + SetRegister +} AUDCOM; + +typedef enum { + AudioState, + AudioBuffState, + VideoState1, + VideoState2, + VideoState3, + CrashCounter, + ReqVersion, + ReqVCXO, + ReqRegister +} REQCOM; + +typedef enum { + SetVidMode, + SetTestMode, + LoadVidCode, + SetMonitorType, + SetPanScanType, + SetFreezeMode +} ENC; + +typedef enum { + __Record, + __Stop, + __Play, + __Pause, + __Slow, + __FF_IP, + __Scan_I, + __Continue +} REC_PLAY; + +typedef enum { + COMTYPE_NOCOM, + COMTYPE_PIDFILTER, + COMTYPE_MPEGDECODER, + COMTYPE_OSD, + COMTYPE_BMP, + COMTYPE_ENCODER, + COMTYPE_AUDIODAC, + COMTYPE_REQUEST, + COMTYPE_SYSTEM, + COMTYPE_REC_PLAY, + COMTYPE_COMMON_IF, + COMTYPE_PID_FILTER, + COMTYPE_PES, + COMTYPE_TS, + COMTYPE_VIDEO, + COMTYPE_AUDIO, + COMTYPE_CI_LL, +} COMTYPE; + +typedef enum { + AV7110_VIDEO_FREEZE, + AV7110_VIDEO_CONTINUE +} VIDEOCOM; + +typedef enum { + DVB_AUDIO_PAUSE, +} AUDIOCOM; + + +#define VID_NONE_PREF 0x00 /* No aspect ration processing preferred */ +#define VID_PAN_SCAN_PREF 0x01 /* Pan and Scan Display preferred */ +#define VID_VERT_COMP_PREF 0x02 /* Vertical compression display preferred */ +#define VID_VC_AND_PS_PREF 0x03 /* PanScan and vertical Compression if allowed */ +#define VID_CENTRE_CUT_PREF 0x05 /* PanScan with zero vector */ + +#define DATA_NONE 0x00 +#define DATA_FSECTION 0x01 +#define DATA_IPMPE 0x02 +#define DATA_MPEG_RECORD 0x03 +#define DATA_DEBUG_MESSAGE 0x04 +#define DATA_COMMON_INTERFACE 0x05 +#define DATA_MPEG_PLAY 0x06 +#define DATA_BMP_LOAD 0x07 +#define DATA_IRCOMMAND 0x08 +#define DATA_PIPING 0x09 +#define DATA_STREAMING 0x0a +#define DATA_CI_GET 0x0b +#define DATA_CI_PUT 0x0c + +#define DATA_PES_RECORD 0x10 +#define DATA_PES_PLAY 0x11 +#define DATA_TS_RECORD 0x12 +#define DATA_TS_PLAY 0x13 + +#define CI_CMD_ERROR 0x00 +#define CI_CMD_ACK 0x01 +#define CI_CMD_SYSTEM_READY 0x02 +#define CI_CMD_KEYPRESS 0x03 +#define CI_CMD_ON_TUNED 0x04 +#define CI_CMD_ON_SWITCH_PROGRAM 0x05 +#define CI_CMD_SECTION_ARRIVED 0x06 +#define CI_CMD_SECTION_TIMEOUT 0x07 +#define CI_CMD_TIME 0x08 +#define CI_CMD_ENTER_MENU 0x09 +#define CI_CMD_FAST_PSI 0x0a +#define CI_CMD_GET_SLOT_INFO 0x0b + +#define CI_MSG_NONE 0x00 +#define CI_MSG_CI_INFO 0x01 +#define CI_MSG_MENU 0x02 +#define CI_MSG_LIST 0x03 +#define CI_MSG_TEXT 0x04 +#define CI_MSG_REQUEST_INPUT 0x05 +#define CI_MSG_INPUT_COMPLETE 0x06 +#define CI_MSG_LIST_MORE 0x07 +#define CI_MSG_MENU_MORE 0x08 +#define CI_MSG_CLOSE_MMI_IMM 0x09 +#define CI_MSG_SECTION_REQUEST 0x0a +#define CI_MSG_CLOSE_FILTER 0x0b +#define CI_PSI_COMPLETE 0x0c +#define CI_MODULE_READY 0x0d +#define CI_SWITCH_PRG_REPLY 0x0e +#define CI_MSG_TEXT_MORE 0x0f + +#define CI_MSG_CA_PMT 0xe0 +#define CI_MSG_ERROR 0xf0 + +typedef struct ring_buffer_s { + u8 *data; + int size; + int pread; + int pwrite; + + WAIT_QUEUE queue; + spinlock_t lock; + struct semaphore sema; + + int error; +} ring_buffer_t; + + +#define PROG_STREAM_MAP 0xBC +#define PRIVATE_STREAM1 0xBD +#define PADDING_STREAM 0xBE +#define PRIVATE_STREAM2 0xBF +#define AUDIO_STREAM_S 0xC0 +#define AUDIO_STREAM_E 0xDF +#define VIDEO_STREAM_S 0xE0 +#define VIDEO_STREAM_E 0xEF +#define ECM_STREAM 0xF0 +#define EMM_STREAM 0xF1 +#define DSM_CC_STREAM 0xF2 +#define ISO13522_STREAM 0xF3 +#define PROG_STREAM_DIR 0xFF + +#define PTS_DTS_FLAGS 0xC0 + +//pts_dts flags +#define PTS_ONLY 0x80 +#define PTS_DTS 0xC0 +#define TS_SIZE 188 +#define TRANS_ERROR 0x80 +#define PAY_START 0x40 +#define TRANS_PRIO 0x20 +#define PID_MASK_HI 0x1F +//flags +#define TRANS_SCRMBL1 0x80 +#define TRANS_SCRMBL2 0x40 +#define ADAPT_FIELD 0x20 +#define PAYLOAD 0x10 +#define COUNT_MASK 0x0F + +// adaptation flags +#define DISCON_IND 0x80 +#define RAND_ACC_IND 0x40 +#define ES_PRI_IND 0x20 +#define PCR_FLAG 0x10 +#define OPCR_FLAG 0x08 +#define SPLICE_FLAG 0x04 +#define TRANS_PRIV 0x02 +#define ADAP_EXT_FLAG 0x01 + +// adaptation extension flags +#define LTW_FLAG 0x80 +#define PIECE_RATE 0x40 +#define SEAM_SPLICE 0x20 + +#define MAX_PLENGTH 0xFFFF +#define MAX_VID_PES 0x1FFF + +typedef struct section_s { + int id; + int length; + int found; + u8 payload[4096+3]; +} section_t; + + +#define MY_STATE_PES_START 1 +#define MY_STATE_PES_STARTED 2 +#define MY_STATE_FULL 4 + +#define MASKL DMX_MAX_FILTER_SIZE +#define MAXFILT 32 + +struct dvb_filter { + int state; + int flags; + int type; + u8 ts_state; + + u16 pid; + u8 value[MASKL]; + u8 mask[MASKL]; +}; + + +enum {AV_PES_STREAM, PS_STREAM, TS_STREAM, PES_STREAM}; + +typedef struct ps_packet_s{ + u8 scr[6]; + u8 mux_rate[3]; + u8 stuff_length; + u8 data[20]; + u8 sheader_llength[2]; + int sheader_length; + u8 rate_bound[3]; + u8 audio_bound; + u8 video_bound; + u8 reserved; + int npes; + int mpeg; +} ps_packet_t; + +typedef struct a2p_s{ + int type; + int found; + int length; + int headr; + u8 cid; + u8 flags; + u8 abuf[MAX_PLENGTH]; + int alength; + u8 vbuf[MAX_PLENGTH]; + int vlength; + int plength; + u8 last_av_pts[4]; + u8 av_pts[4]; + u8 scr[4]; + u16 count0; + u16 count1; + u16 pidv; + u16 pida; + u16 countv; + u16 counta; + void *dataA; + void *dataV; + void (*write_cb)(u8 const *buf, long int count, + void *data); +} a2p_t; + + +typedef struct p2t_s { + u8 pes[TS_SIZE]; + u8 counter; + long int pos; + int frags; + dvb_demux_feed_t *feed; +} p2t_t; + + +/* place to store all the necessary device information */ +typedef struct av7110_s { + + /* devices */ + + struct dvb_device dvb_dev; + dvb_net_t dvb_net; + struct video_device video; + + struct saa7146 *saa; + + struct tasklet_struct debi_tasklet; + struct tasklet_struct gpio_tasklet; + struct tasklet_struct vpe_tasklet; + struct tasklet_struct fidb_tasklet; + + int adac_type; /* audio DAC type */ +#define DVB_ADAC_TI 0 +#define DVB_ADAC_CRYSTAL 1 +#define DVB_ADAC_NONE -1 + + + /* buffers */ + + void *iobuf; /* memory for all buffers */ + ring_buffer_t avout; /* buffer for video or A/V mux */ +#define AVOUTLEN (128*1024) + ring_buffer_t aout; /* buffer for audio */ +#define AOUTLEN (64*1024) + void *bmpbuf; +#define BMPLEN (8*32768+1024) + + /* bitmap buffers and states */ + + int bmpp; + int bmplen; + int bmp_win; + u16 bmp_x, bmp_y; + int bmp_trans; + int bmp_state; +#define BMP_NONE 0 +#define BMP_LOADING 1 +#define BMP_LOADINGS 2 +#define BMP_LOADED 3 + WAIT_QUEUE bmpq; + + + /* DEBI and polled command interface */ + + spinlock_t debilock; + struct semaphore dcomlock; + int debitype; + int debilen; + int debibuf; + + + /* Recording and playback flags */ + + int rec_mode; + int playing; +#define RP_NONE 0 +#define RP_VIDEO 1 +#define RP_AUDIO 2 +#define RP_AV 3 + + + /* OSD */ + + int osdwin; /* currently active window */ + u16 osdbpp[8]; + + + /* CA */ + + ca_slot_info_t ci_slot[2]; + + int vidmode; + dmxdev_t dmxdev; + dvb_demux_t demux; + char demux_id[16]; + + dmx_frontend_t hw_frontend; + dmx_frontend_t mem_frontend; + + int fe_synced; + struct semaphore pid_mutex; + + int video_blank; + struct video_status videostate; + int display_ar; + int trickmode; +#define TRICK_NONE 0 +#define TRICK_FAST 1 +#define TRICK_SLOW 2 +#define TRICK_FREEZE 3 + struct audio_status audiostate; + + dvb_demux_filter_t *handle2filter[32]; + p2t_t p2t_filter[MAXFILT]; + pes2ts_t p2t[2]; + struct ipack_s ipack[2]; + u8 *kbuf[2]; + + int sinfo; + int shsize; + int swsize; + + int tsf; + u32 ttbp; + int feeding; + + int arm_errors; + int registered; + + + /* AV711X */ + + u32 arm_fw; + u32 arm_rtsl; + u32 arm_vid; + u32 arm_app; + u32 avtype; + int arm_ready; + struct task_struct *arm_thread; + WAIT_QUEUE arm_wait; + u16 arm_loops; + int arm_rmmod; + + void *saa_mem; + void *debi_virt; + dma_addr_t debi_bus; + + u16 pids[DMX_PES_OTHER]; + + ring_buffer_t ci_rbuffer; + ring_buffer_t ci_wbuffer; + + + dvb_adapter_t *dvb_adapter; + dvb_device_t *video_dev; + dvb_device_t *audio_dev; + dvb_device_t *ca_dev; + dvb_device_t *osd_dev; + + int dsp_dev; +} av7110_t; + + +#define DPRAM_BASE 0x4000 + +#define BOOT_STATE (DPRAM_BASE + 0x3F8) +#define BOOT_SIZE (DPRAM_BASE + 0x3FA) +#define BOOT_BASE (DPRAM_BASE + 0x3FC) +#define BOOT_BLOCK (DPRAM_BASE + 0x400) +#define BOOT_MAX_SIZE 0xc00 + +#define IRQ_STATE (DPRAM_BASE + 0x0F4) +#define IRQ_STATE_EXT (DPRAM_BASE + 0x0F6) +#define MSGSTATE (DPRAM_BASE + 0x0F8) +#define FILT_STATE (DPRAM_BASE + 0x0FA) +#define COMMAND (DPRAM_BASE + 0x0FC) +#define COM_BUFF (DPRAM_BASE + 0x100) +#define COM_BUFF_SIZE 0x20 + +#define BUFF1_BASE (DPRAM_BASE + 0x120) +#define BUFF1_SIZE 0xE0 + +#define DATA_BUFF_BASE (DPRAM_BASE + 0x200) +#define DATA_BUFF_SIZE 0x1C00 + +/* new buffers */ + +#define DATA_BUFF0_BASE (DPRAM_BASE + 0x200) +#define DATA_BUFF0_SIZE 0x0800 + +#define DATA_BUFF1_BASE (DATA_BUFF0_BASE+DATA_BUFF0_SIZE) +#define DATA_BUFF1_SIZE 0x0800 + +#define DATA_BUFF2_BASE (DATA_BUFF1_BASE+DATA_BUFF1_SIZE) +#define DATA_BUFF2_SIZE 0x0800 + +#define Reserved (DPRAM_BASE + 0x1E00) +#define Reserved_SIZE 0x1C0 + +#define DEBUG_WINDOW (DPRAM_BASE + 0x1FC0) +#define DBG_LOOP_CNT (DEBUG_WINDOW + 0x00) +#define DBG_SEC_CNT (DEBUG_WINDOW + 0x02) +#define DBG_AVRP_BUFF (DEBUG_WINDOW + 0x04) +#define DBG_AVRP_PEAK (DEBUG_WINDOW + 0x06) +#define DBG_MSG_CNT (DEBUG_WINDOW + 0x08) +#define DBG_CODE_REG (DEBUG_WINDOW + 0x0a) +#define DBG_TTX_Q (DEBUG_WINDOW + 0x0c) +#define DBG_AUD_EN (DEBUG_WINDOW + 0x0e) +#define DBG_WRONG_COM (DEBUG_WINDOW + 0x10) +#define DBG_ARR_OVFL (DEBUG_WINDOW + 0x12) +#define DBG_BUFF_OVFL (DEBUG_WINDOW + 0x14) +#define DBG_OVFL_CNT (DEBUG_WINDOW + 0x16) +#define DBG_SEC_OVFL (DEBUG_WINDOW + 0x18) + +#define STATUS_BASE (DPRAM_BASE + 0x1FC0) +#define STATUS_SCR (STATUS_BASE + 0x00) +#define STATUS_MODES (STATUS_BASE + 0x04) +#define STATUS_LOOPS (STATUS_BASE + 0x08) + +#define RX_TYPE (DPRAM_BASE + 0x1FE8) +#define RX_LEN (DPRAM_BASE + 0x1FEA) +#define TX_TYPE (DPRAM_BASE + 0x1FEC) +#define TX_LEN (DPRAM_BASE + 0x1FEE) + +#define RX_BUFF (DPRAM_BASE + 0x1FF4) +#define TX_BUFF (DPRAM_BASE + 0x1FF6) + +#define HANDSHAKE_REG (DPRAM_BASE + 0x1FF8) +#define COM_IF_LOCK (DPRAM_BASE + 0x1FFA) + +#define IRQ_RX (DPRAM_BASE + 0x1FFC) +#define IRQ_TX (DPRAM_BASE + 0x1FFE) + +#define DRAM_START_CODE 0x2e000404 +#define DRAM_MAX_CODE_SIZE 0x00100000 + +#define RESET_LINE 2 +#define DEBI_DONE_LINE 1 +#define ARM_IRQ_LINE 0 + +#define DAC_CS 0x8000 +#define DAC_CDS 0x0000 + + +extern unsigned char *av7110_dpram_addr, *av7110_root_addr; +extern int av7110_dpram_len, av7110_root_len; + +extern void av7110_register_irc_handler(void (*func)(u32)); +extern void av7110_unregister_irc_handler(void (*func)(u32)); +extern void av7110_setup_irc_config (av7110_t *av7110, u32 ir_config); + +extern int av7110_init (void); +extern int av7110_ir_init (void); + +extern void av7110_exit (void); +extern void av7110_ir_exit (void); + + +#endif /* _AV7110_H_ */ + +/* + * Local variables: + * c-indent-level: 8 + * c-brace-imaginary-offset: 0 + * c-brace-offset: -8 + * c-argdecl-indent: 8 + * c-label-offset: -8 + * c-continued-statement-offset: 8 + * c-continued-brace-offset: 0 + * indent-tabs-mode: nil + * tab-width: 8 + * End: + */ diff --git a/drivers/media/dvb/av7110/av7110_firm.h b/drivers/media/dvb/av7110/av7110_firm.h new file mode 100644 index 000000000000..5c93deb3d63f --- /dev/null +++ b/drivers/media/dvb/av7110/av7110_firm.h @@ -0,0 +1,31852 @@ + +#include <asm/types.h> + +u8 Dpram [] __initdata = { + 0xe5, 0x9f, 0xf0, 0x1c, 0xe1, 0xb0, 0xf0, 0x0e, + 0xe5, 0x9f, 0xf0, 0x18, 0xe2, 0x5e, 0xf0, 0x04, + 0xe2, 0x5e, 0xf0, 0x08, 0xe1, 0xa0, 0x00, 0x00, + 0xea, 0x00, 0x00, 0x06, 0xe2, 0x5e, 0xf0, 0x04, + 0x2c, 0x00, 0x00, 0xe8, 0x2e, 0x02, 0xcb, 0x40, + 0x2e, 0x02, 0x39, 0xb4, 0xa5, 0xa5, 0x5a, 0x5a, + 0x00, 0x1f, 0x15, 0x55, 0x00, 0x00, 0x00, 0x09, + 0xe9, 0x2d, 0x5f, 0xff, 0xe1, 0x4f, 0x00, 0x00, + 0xe9, 0x2d, 0x00, 0x01, 0xe2, 0x8f, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x10, 0x21, 0xff, 0x48, 0x25, + 0x68, 0x00, 0x40, 0x52, 0x42, 0x08, 0xd1, 0x0b, + 0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x07, + 0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x03, + 0x0a, 0x00, 0x42, 0x08, 0xd0, 0x29, 0x32, 0x20, + 0x21, 0x0f, 0x42, 0x08, 0xd1, 0x01, 0x32, 0x10, + 0x09, 0x00, 0x21, 0x01, 0x42, 0x08, 0xd1, 0x08, + 0x1d, 0x12, 0x21, 0x02, 0x42, 0x08, 0xd1, 0x04, + 0x1d, 0x12, 0x21, 0x04, 0x42, 0x08, 0xd1, 0x00, + 0x1d, 0x12, 0x48, 0x13, 0x68, 0x00, 0xb4, 0x01, + 0x08, 0x90, 0x21, 0x01, 0x40, 0x81, 0x48, 0x0f, + 0x60, 0x01, 0x48, 0x0d, 0x58, 0x82, 0x48, 0x01, + 0x46, 0x86, 0x47, 0x10, 0x2c, 0x00, 0x00, 0xb1, + 0xbc, 0x02, 0x48, 0x0b, 0x68, 0x02, 0x23, 0x20, + 0x05, 0x1b, 0x40, 0x1a, 0x43, 0x99, 0x43, 0x11, + 0x60, 0x01, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe8, 0xbd, 0x00, 0x01, 0xe1, 0x69, 0xf0, 0x00, + 0xe8, 0xbd, 0x5f, 0xff, 0xe2, 0x5e, 0xf0, 0x04, + 0x2e, 0x08, 0x3b, 0xa4, 0x66, 0x00, 0x00, 0x14, + 0x66, 0x00, 0x00, 0x18, 0x66, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x0c, 0x2e, 0x02, 0xcc, 0x48, + 0x2c, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + + +u8 Root [] __initdata = { + 0xb4, 0x90, 0x49, 0x18, 0x1c, 0x0b, 0x4a, 0x18, + 0x1a, 0x50, 0x4f, 0x18, 0x1a, 0x79, 0x10, 0x8f, + 0x21, 0x00, 0x2f, 0x00, 0xdd, 0x04, 0xcb, 0x10, + 0xc2, 0x10, 0x31, 0x01, 0x42, 0xb9, 0xdb, 0xfa, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x08, 0x49, 0x13, 0x60, 0x08, + 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x02, 0x36, 0x7c, + 0x9e, 0x00, 0x0a, 0x00, 0x2e, 0x02, 0x37, 0x7c, + 0x2e, 0x02, 0x36, 0xcc, 0x2e, 0x02, 0x38, 0x9c, + 0x2e, 0x02, 0x37, 0x04, 0x2e, 0x02, 0x38, 0xa0, + 0x2e, 0x02, 0x37, 0x20, 0x2e, 0x02, 0x38, 0xa4, + 0x2e, 0x02, 0x36, 0xcc, 0x2e, 0x02, 0x38, 0xa8, + 0x2e, 0x02, 0x36, 0xe8, 0x2e, 0x02, 0x38, 0xac, + 0x2e, 0x02, 0x37, 0x20, 0x2e, 0x02, 0x38, 0xb0, + 0x2e, 0x02, 0x37, 0x04, 0x2e, 0x02, 0x38, 0xb4, + 0x2e, 0x02, 0x36, 0x7c, 0x2e, 0x02, 0x38, 0xb8, + 0xb5, 0xf0, 0x1c, 0x0c, 0x1c, 0x15, 0x1c, 0x07, + 0xb0, 0x82, 0x2a, 0x00, 0xd1, 0x03, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x0e, 0x38, + 0x06, 0x00, 0x21, 0x0b, 0x06, 0x89, 0x4b, 0x43, + 0x93, 0x01, 0x42, 0x88, 0xd1, 0x32, 0x08, 0x78, + 0xd3, 0x05, 0x1e, 0x78, 0x88, 0x00, 0x70, 0x20, + 0x34, 0x01, 0x3d, 0x01, 0x37, 0x01, 0x08, 0xb8, + 0xd3, 0x0f, 0x2d, 0x02, 0xdb, 0x0d, 0x08, 0x60, + 0xd3, 0x06, 0x88, 0x39, 0x0a, 0x09, 0x70, 0x21, + 0x88, 0x38, 0x70, 0x60, 0x34, 0x02, 0xe0, 0x02, + 0x88, 0x38, 0x80, 0x20, 0x34, 0x02, 0x3d, 0x02, + 0x37, 0x02, 0x07, 0xae, 0x0f, 0xb6, 0x1b, 0xad, + 0xd0, 0x08, 0x9b, 0x01, 0x68, 0x1b, 0x1c, 0x38, + 0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x1d, 0xfe, 0x6a, + 0x19, 0x7f, 0x19, 0x64, 0x2e, 0x00, 0xd0, 0x54, + 0x68, 0x38, 0x90, 0x00, 0x46, 0x6f, 0x78, 0x38, + 0x70, 0x20, 0x34, 0x01, 0x37, 0x01, 0x3e, 0x01, + 0xd1, 0xf9, 0xe0, 0x4a, 0x0e, 0x20, 0x06, 0x00, + 0x42, 0x88, 0xd1, 0x3f, 0xe0, 0x14, 0x08, 0x60, + 0xd3, 0x08, 0x1e, 0x60, 0x88, 0x01, 0x23, 0xff, + 0x02, 0x1b, 0x40, 0x19, 0x78, 0x3a, 0x43, 0x11, + 0x80, 0x01, 0xe0, 0x06, 0x88, 0x21, 0x06, 0x09, + 0x0e, 0x09, 0x78, 0x3a, 0x02, 0x12, 0x43, 0x11, + 0x80, 0x21, 0x34, 0x01, 0x3d, 0x01, 0x37, 0x01, + 0x07, 0xb8, 0xd0, 0x01, 0x2d, 0x00, 0xdc, 0xe6, + 0x07, 0xae, 0x0f, 0xb6, 0x1b, 0xad, 0xd0, 0x06, + 0x9b, 0x01, 0x68, 0x1b, 0x1c, 0x38, 0x1c, 0x21, + 0x1c, 0x2a, 0xf0, 0x1d, 0xfe, 0x33, 0x19, 0x7f, + 0x19, 0x64, 0x2e, 0x00, 0xd0, 0x1d, 0x08, 0x60, + 0xd3, 0x08, 0x1e, 0x60, 0x88, 0x01, 0x23, 0xff, + 0x02, 0x1b, 0x40, 0x19, 0x78, 0x3a, 0x43, 0x11, + 0x80, 0x01, 0xe0, 0x06, 0x88, 0x21, 0x06, 0x09, + 0x0e, 0x09, 0x78, 0x3a, 0x02, 0x12, 0x43, 0x11, + 0x80, 0x21, 0x34, 0x01, 0x37, 0x01, 0x3e, 0x01, + 0xd1, 0xe9, 0xe0, 0x06, 0x9b, 0x01, 0x68, 0x1b, + 0x1c, 0x38, 0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x1d, + 0xfe, 0x11, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x48, + 0xb5, 0x00, 0x20, 0x03, 0xf0, 0x03, 0xfb, 0x98, + 0x48, 0x03, 0x89, 0x02, 0x8a, 0x01, 0x89, 0x80, + 0xf0, 0x05, 0xff, 0xc2, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x00, 0x00, 0xb5, 0xf0, 0x4f, 0x10, + 0x89, 0x3c, 0x89, 0xbe, 0x8a, 0x3d, 0x23, 0x04, + 0x43, 0xdb, 0x68, 0x78, 0x40, 0x18, 0x0c, 0x1a, + 0x60, 0x78, 0xb4, 0x04, 0x1c, 0x13, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x14, + 0x20, 0x01, 0x60, 0x78, 0xb0, 0x01, 0x4a, 0x07, + 0xb4, 0x04, 0x1c, 0x20, 0x1c, 0x31, 0x1c, 0x2a, + 0x4b, 0x04, 0xf0, 0x00, 0xf8, 0x09, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0xf0, 0x9f, 0x05, 0x04, 0x04, 0x0c, 0x24, + 0x04, 0x0d, 0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36, + 0x04, 0x18, 0x0c, 0x00, 0xb0, 0x82, 0x90, 0x00, + 0x04, 0x38, 0x0c, 0x00, 0xb0, 0x81, 0x49, 0xa9, + 0x4f, 0xa9, 0x42, 0x8d, 0xd1, 0x00, 0x89, 0xbd, + 0x42, 0x8e, 0xd1, 0x00, 0x8a, 0x3e, 0x4a, 0xa7, + 0x42, 0x95, 0xd1, 0x02, 0x89, 0xbd, 0x08, 0xd3, + 0x81, 0xbb, 0x4b, 0xa4, 0x42, 0x9e, 0xd1, 0x02, + 0x8a, 0x3e, 0x08, 0xdb, 0x82, 0x3b, 0x9a, 0x01, + 0x42, 0x8a, 0xd1, 0x01, 0x8a, 0xba, 0x92, 0x01, + 0xa0, 0x9f, 0x22, 0x2d, 0x21, 0x00, 0xf0, 0x06, + 0xf8, 0x69, 0xa0, 0x9f, 0x22, 0x37, 0x21, 0x00, + 0xf0, 0x06, 0xf8, 0x64, 0x22, 0x3c, 0x21, 0x00, + 0x1c, 0x28, 0xf0, 0x06, 0xf8, 0x97, 0xa0, 0x9c, + 0x22, 0x41, 0x21, 0x00, 0xf0, 0x06, 0xf8, 0x5a, + 0x22, 0x46, 0x21, 0x00, 0x1c, 0x30, 0xf0, 0x06, + 0xf8, 0x8d, 0xa0, 0x99, 0x22, 0x37, 0x21, 0x01, + 0xf0, 0x06, 0xf8, 0x50, 0x22, 0x3e, 0x21, 0x01, + 0x1c, 0x20, 0xf0, 0x06, 0xf8, 0x83, 0xa0, 0x96, + 0x22, 0x37, 0x21, 0x02, 0xf0, 0x06, 0xf8, 0x46, + 0x22, 0x3e, 0x21, 0x02, 0x98, 0x01, 0xf0, 0x06, + 0xf8, 0x79, 0x8a, 0xbb, 0x99, 0x01, 0x42, 0x99, + 0xd0, 0x20, 0x68, 0x38, 0x90, 0x02, 0x28, 0x00, + 0xd0, 0x1a, 0x2b, 0x00, 0xd0, 0x0a, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x1c, 0xb4, 0x07, 0x1c, 0x19, + 0x23, 0x10, 0x22, 0x1d, 0x98, 0x05, 0xf0, 0x0f, + 0xfe, 0x75, 0xb0, 0x03, 0x98, 0x01, 0x28, 0x00, + 0xd0, 0x0a, 0x22, 0x01, 0x21, 0x00, 0x20, 0x1c, + 0xb4, 0x07, 0x99, 0x04, 0x23, 0x10, 0x22, 0x1d, + 0x68, 0x38, 0xf0, 0x0f, 0xfe, 0x67, 0xb0, 0x03, + 0x98, 0x01, 0x82, 0xb8, 0x4b, 0x80, 0x42, 0x9c, + 0xd0, 0x46, 0xdc, 0x37, 0x2c, 0x00, 0xd0, 0x3d, + 0x3b, 0x02, 0x42, 0x9c, 0xd0, 0x38, 0x4b, 0x7d, + 0x42, 0x9c, 0xd1, 0x00, 0x1c, 0x34, 0xa0, 0x7c, + 0x22, 0x42, 0x21, 0x01, 0xf0, 0x06, 0xf8, 0x0a, + 0x22, 0x43, 0x21, 0x01, 0x1c, 0x20, 0xf0, 0x06, + 0xf8, 0x3d, 0xa0, 0x78, 0x22, 0x47, 0x21, 0x01, + 0xf0, 0x06, 0xf8, 0x00, 0x22, 0x00, 0xb4, 0x04, + 0x23, 0x00, 0x49, 0x64, 0x20, 0x1c, 0xf0, 0x0f, + 0xff, 0xdf, 0x89, 0xb8, 0xb0, 0x01, 0x42, 0x85, + 0xd1, 0x02, 0x89, 0x38, 0x42, 0x84, 0xd0, 0x44, + 0x81, 0xbd, 0x20, 0x1f, 0xf0, 0x10, 0xfb, 0x18, + 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, + 0x21, 0x02, 0x20, 0x1f, 0xf0, 0x10, 0xf9, 0x90, + 0x2d, 0x00, 0xd0, 0x33, 0x2d, 0x01, 0xd1, 0x11, + 0x25, 0x00, 0xe0, 0x32, 0x4b, 0x57, 0x42, 0x9c, + 0xd0, 0x04, 0x33, 0x01, 0x42, 0x9c, 0xd1, 0xca, + 0x89, 0x3c, 0xe7, 0xc8, 0x2d, 0x00, 0xd0, 0x01, + 0x1c, 0x2c, 0xe7, 0xc4, 0x1c, 0x34, 0xe7, 0xc2, + 0x1c, 0x2c, 0xe7, 0xc0, 0x42, 0xac, 0xd1, 0x01, + 0x20, 0x80, 0xe0, 0x00, 0x20, 0x00, 0x22, 0x00, + 0xb4, 0x04, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02, + 0x43, 0x02, 0x23, 0x01, 0x20, 0x1f, 0x1c, 0x29, + 0xf0, 0x0f, 0xff, 0xa6, 0x23, 0x01, 0x02, 0x9b, + 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, 0xb0, 0x01, + 0xf0, 0x10, 0xf9, 0x62, 0x21, 0x00, 0x20, 0x1f, + 0xf0, 0x10, 0xfe, 0x54, 0x20, 0x01, 0xf0, 0x13, + 0xfa, 0x43, 0xe0, 0x02, 0x20, 0x00, 0xf0, 0x13, + 0xfa, 0x3f, 0x8a, 0x38, 0x42, 0x86, 0xd1, 0x02, + 0x89, 0x39, 0x42, 0x8c, 0xd0, 0x52, 0x28, 0x00, + 0xd0, 0x0d, 0x20, 0x03, 0xf0, 0x13, 0xfb, 0x96, + 0x20, 0x1e, 0xf0, 0x10, 0xfb, 0x93, 0x23, 0x03, + 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, + 0x20, 0x1e, 0xf0, 0x10, 0xf9, 0x41, 0x82, 0x3e, + 0x2e, 0x00, 0xd0, 0x3f, 0x42, 0xb4, 0xd1, 0x02, + 0x20, 0x80, 0x90, 0x00, 0xe0, 0x01, 0x20, 0x00, + 0x90, 0x00, 0xf0, 0x23, 0xf8, 0x8d, 0x23, 0x01, + 0x04, 0x1b, 0x43, 0x18, 0xf0, 0x23, 0xf8, 0x8c, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x14, 0xf8, 0x74, + 0x20, 0xff, 0x49, 0x37, 0x68, 0x09, 0x70, 0x08, + 0x49, 0x36, 0x48, 0x37, 0x23, 0x1e, 0x22, 0x10, + 0xf0, 0x14, 0xf9, 0xa8, 0x48, 0x35, 0x68, 0x00, + 0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, + 0xf0, 0x23, 0xf8, 0x72, 0x4b, 0x32, 0x40, 0x18, + 0xf0, 0x23, 0xf8, 0x72, 0x22, 0x00, 0xb4, 0x04, + 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02, + 0x43, 0x02, 0x23, 0x02, 0x20, 0x1e, 0x1c, 0x31, + 0xf0, 0x0f, 0xff, 0x46, 0x23, 0x01, 0x02, 0x9b, + 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, 0xb0, 0x01, + 0xf0, 0x10, 0xf9, 0x02, 0x21, 0x00, 0x20, 0x1e, + 0xf0, 0x10, 0xfd, 0xf4, 0x42, 0xac, 0xd0, 0x18, + 0x42, 0xb4, 0xd0, 0x16, 0x2c, 0x00, 0xd0, 0x14, + 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, + 0x20, 0x1c, 0xf0, 0x10, 0xf8, 0xf1, 0x22, 0x00, + 0xb4, 0x04, 0x23, 0x00, 0x22, 0x82, 0x20, 0x1c, + 0x1c, 0x21, 0xf0, 0x0f, 0xff, 0x25, 0xb0, 0x01, + 0xa0, 0x1a, 0x22, 0x47, 0x21, 0x01, 0xf0, 0x05, + 0xff, 0x39, 0x81, 0x3c, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, + 0x53, 0x49, 0x44, 0x3a, 0x00, 0x00, 0x00, 0x00, + 0x56, 0x50, 0x49, 0x44, 0x3a, 0x00, 0x00, 0x00, + 0x41, 0x50, 0x49, 0x44, 0x3a, 0x00, 0x00, 0x00, + 0x50, 0x43, 0x52, 0x50, 0x49, 0x44, 0x3a, 0x00, + 0x54, 0x58, 0x54, 0x50, 0x49, 0x44, 0x3a, 0x00, + 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0xff, 0xfc, + 0x2f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0x98, 0x2e, 0x08, 0x48, 0x10, + 0x2e, 0x08, 0x05, 0xb4, 0x2e, 0x08, 0x9b, 0xc4, + 0xff, 0xfe, 0xff, 0xff, 0x2a, 0x00, 0x00, 0x00, + 0xb5, 0x00, 0x22, 0x00, 0xb4, 0x04, 0x04, 0x01, + 0x0c, 0x09, 0x23, 0x00, 0x4a, 0x03, 0x1e, 0x50, + 0xf7, 0xff, 0xfe, 0x66, 0xb0, 0x01, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0x00, 0x22, 0x00, 0xb4, 0x04, 0x04, 0x02, + 0x0c, 0x12, 0x23, 0x00, 0x49, 0x03, 0x1e, 0x48, + 0xf7, 0xff, 0xfe, 0x56, 0xb0, 0x01, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x08, + 0x28, 0x01, 0xd0, 0x0b, 0x28, 0x02, 0xd1, 0x02, + 0x02, 0x00, 0xf0, 0x13, 0xfa, 0xcf, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x80, 0xf0, 0x13, 0xfa, 0xca, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0xff, 0x30, 0x01, + 0xf0, 0x13, 0xfa, 0xc4, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xb0, 0x27, 0x00, 0x4c, 0x1b, 0x20, 0x01, + 0x04, 0x80, 0x21, 0x00, 0x22, 0x00, 0xc4, 0x86, + 0xc4, 0x84, 0x3c, 0x14, 0xf0, 0x05, 0xf8, 0x9c, + 0x61, 0x60, 0x28, 0x00, 0xd0, 0x06, 0x21, 0x01, + 0x04, 0x89, 0x61, 0xe1, 0x18, 0x41, 0x62, 0x20, + 0x61, 0xa1, 0xe0, 0x02, 0x61, 0xe7, 0x61, 0xa7, + 0x62, 0x27, 0x68, 0x21, 0x00, 0xc9, 0x4a, 0x10, + 0x18, 0x89, 0x60, 0x48, 0x20, 0x00, 0x49, 0x0f, + 0x4d, 0x0f, 0x00, 0x42, 0x52, 0x8d, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x1d, 0xdb, 0xf8, + 0x20, 0x00, 0x1c, 0x39, 0x4c, 0x0b, 0x4f, 0x0c, + 0x4b, 0x0c, 0x00, 0x42, 0x52, 0xa5, 0x00, 0x82, + 0x50, 0xb9, 0x50, 0x99, 0x30, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf5, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x00, 0x1c, + 0x2e, 0x08, 0x3c, 0x20, 0x2e, 0x08, 0x49, 0xa8, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0xe0, + 0x2e, 0x08, 0x4a, 0x98, 0x2e, 0x08, 0x4b, 0x18, + 0xb4, 0xf0, 0xb0, 0x81, 0x49, 0x25, 0xc9, 0x0c, + 0x39, 0x08, 0x1a, 0xd2, 0x60, 0x8a, 0xd5, 0x02, + 0x32, 0xff, 0x32, 0x01, 0x60, 0x8a, 0x6a, 0x0a, + 0x62, 0x8a, 0x68, 0x8f, 0x2f, 0xfe, 0xdb, 0x03, + 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0x47, 0x70, + 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x4c, 0x1b, + 0x69, 0xa6, 0x69, 0x64, 0x2f, 0x3e, 0xdb, 0x24, + 0x00, 0xdb, 0x4f, 0x19, 0x19, 0xdb, 0x68, 0x5b, + 0x62, 0x4b, 0x93, 0x00, 0x1a, 0x9f, 0x4b, 0x15, + 0x69, 0xdd, 0x2f, 0x00, 0xdc, 0x00, 0x19, 0x7f, + 0x23, 0x01, 0x03, 0x1b, 0x18, 0xc3, 0x42, 0xbb, + 0xdd, 0x0f, 0x18, 0x17, 0x42, 0xb7, 0xdb, 0x09, + 0x9a, 0x00, 0x1b, 0x12, 0x2a, 0x00, 0xdc, 0x00, + 0x19, 0x52, 0x42, 0x93, 0xdd, 0x11, 0x18, 0x20, + 0x62, 0x08, 0xe0, 0x0e, 0x62, 0x0f, 0x1c, 0x14, + 0xe0, 0x0b, 0x18, 0x10, 0x62, 0x08, 0x1c, 0x14, + 0xe0, 0x07, 0x18, 0x12, 0x42, 0xb2, 0xdb, 0x00, + 0x62, 0x0c, 0x6a, 0x0a, 0x18, 0x10, 0x62, 0x08, + 0x1c, 0x14, 0x1c, 0x20, 0xb0, 0x01, 0xbc, 0xf0, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x1c, + 0x2e, 0x08, 0x3c, 0x20, 0x48, 0x03, 0x6a, 0x81, + 0x62, 0x01, 0x69, 0x01, 0x31, 0x01, 0x61, 0x01, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x1c, + 0xb5, 0xf7, 0x04, 0x05, 0x0c, 0x2d, 0x04, 0x0e, + 0x0c, 0x36, 0xb0, 0x81, 0x23, 0x01, 0x03, 0x1b, + 0x98, 0x03, 0x42, 0x9e, 0xdd, 0x05, 0x20, 0xff, + 0xb0, 0x01, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x4f, 0x24, 0x68, 0xb9, 0x29, 0xff, + 0xdb, 0x02, 0x20, 0xff, 0xb0, 0x01, 0xe7, 0xf4, + 0x00, 0x69, 0x19, 0x49, 0x00, 0x89, 0x4a, 0x20, + 0x18, 0x8c, 0x89, 0x21, 0x29, 0x01, 0xd0, 0x02, + 0x20, 0xff, 0xb0, 0x01, 0xe7, 0xe9, 0x79, 0x81, + 0x91, 0x00, 0x88, 0xa0, 0x08, 0x40, 0x07, 0x80, + 0xd1, 0x02, 0x1c, 0x28, 0xf0, 0x05, 0xfa, 0xf4, + 0x88, 0xa0, 0x23, 0x06, 0x40, 0x18, 0x28, 0x02, + 0xd1, 0x09, 0x88, 0xe0, 0x99, 0x00, 0x42, 0x88, + 0xd1, 0x05, 0x1c, 0x28, 0xf0, 0x05, 0xfa, 0xe8, + 0x20, 0xff, 0xb0, 0x01, 0xe7, 0xd1, 0x88, 0xe0, + 0x4b, 0x10, 0x42, 0x98, 0xd1, 0x01, 0x99, 0x00, + 0x80, 0xe1, 0x68, 0x39, 0x00, 0xc8, 0x4a, 0x0e, + 0x52, 0x15, 0x18, 0x80, 0x80, 0x46, 0x9a, 0x03, + 0x31, 0x01, 0x60, 0x42, 0x20, 0x00, 0x23, 0xff, + 0x60, 0x39, 0x33, 0x01, 0x42, 0x99, 0xd1, 0x00, + 0x60, 0x38, 0x68, 0xb9, 0x31, 0x01, 0x60, 0xb9, + 0x68, 0xfb, 0x42, 0x99, 0xdd, 0x00, 0x60, 0xf9, + 0xb0, 0x01, 0xe7, 0xb2, 0x2e, 0x08, 0x00, 0x1c, + 0x2e, 0x08, 0x48, 0x28, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x3c, 0x20, 0xb5, 0xf0, 0x26, 0xff, + 0xb0, 0x83, 0x49, 0x3b, 0x91, 0x01, 0x48, 0x3b, + 0x8e, 0x80, 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x4f, 0x38, + 0xcf, 0x05, 0x3f, 0x08, 0x1a, 0x80, 0x60, 0xb8, + 0x1c, 0x01, 0xd5, 0x02, 0x1d, 0xc8, 0x30, 0xf9, + 0x60, 0xb8, 0x68, 0xb8, 0x28, 0x00, 0xd1, 0x03, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0xd0, 0x49, 0x30, 0x5a, 0x0d, 0x18, 0x40, + 0x88, 0x44, 0x68, 0x40, 0x90, 0x00, 0x00, 0xa8, + 0x49, 0x2d, 0x58, 0x09, 0x91, 0x02, 0x29, 0x00, + 0xd0, 0x08, 0x49, 0x2c, 0x58, 0x0b, 0x99, 0x00, + 0x9e, 0x02, 0x1c, 0x28, 0x1c, 0x22, 0xf0, 0x1d, + 0xfa, 0xdb, 0x26, 0x00, 0x48, 0x28, 0x78, 0x00, + 0x28, 0x00, 0xd0, 0x09, 0x1c, 0x28, 0xf0, 0x0d, + 0xfa, 0xc3, 0x28, 0xff, 0xd1, 0x04, 0x98, 0x00, + 0x1c, 0x21, 0xf0, 0x0d, 0xfa, 0x3f, 0x26, 0x00, + 0x2e, 0x00, 0xd0, 0x29, 0x06, 0xed, 0x0e, 0xed, + 0x1c, 0xe0, 0x08, 0x82, 0x00, 0x92, 0x98, 0x00, + 0x99, 0x01, 0x6a, 0xfb, 0xf0, 0x1d, 0xfa, 0xba, + 0x00, 0x68, 0x19, 0x40, 0x00, 0x80, 0x49, 0x1b, + 0x18, 0x40, 0x88, 0x80, 0x21, 0x0c, 0x40, 0x01, + 0x29, 0x0c, 0xd1, 0x04, 0x02, 0x29, 0x31, 0x02, + 0x04, 0x09, 0x0c, 0x09, 0xe0, 0x03, 0x02, 0x29, + 0x31, 0x01, 0x04, 0x09, 0x0c, 0x09, 0x08, 0x40, + 0xd3, 0x04, 0x04, 0x08, 0x0c, 0x00, 0x21, 0x01, + 0x03, 0xc9, 0x43, 0x01, 0x48, 0x09, 0x85, 0x01, + 0x85, 0x44, 0x21, 0x01, 0x02, 0x49, 0x86, 0x81, + 0x68, 0x78, 0x28, 0xff, 0xd1, 0x02, 0x20, 0x00, + 0x60, 0x78, 0xe0, 0x01, 0x30, 0x01, 0x60, 0x78, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2c, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x3c, 0x20, + 0x2e, 0x08, 0x4a, 0x98, 0x2e, 0x08, 0x4b, 0x18, + 0x2e, 0x08, 0x1a, 0x94, 0x2e, 0x08, 0x48, 0x28, + 0xb4, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x4f, 0x14, + 0x8e, 0xba, 0x2a, 0x00, 0xd0, 0x03, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0xf0, 0x47, 0x70, 0x1c, 0x05, + 0x4c, 0x10, 0x1d, 0x48, 0xd5, 0x00, 0x30, 0x01, + 0x10, 0x40, 0x04, 0x01, 0x0c, 0x09, 0x20, 0x00, + 0x29, 0x02, 0xdb, 0xf2, 0x29, 0xe0, 0xdc, 0xf0, + 0x22, 0x00, 0x29, 0x00, 0xdd, 0x07, 0x00, 0x53, + 0x5a, 0xee, 0x52, 0xe6, 0x32, 0x01, 0x04, 0x12, + 0x0c, 0x12, 0x42, 0x8a, 0xdb, 0xf7, 0x22, 0x04, + 0x85, 0x3a, 0x00, 0x49, 0x85, 0x79, 0x21, 0x0f, + 0x02, 0x49, 0x86, 0xb9, 0xbc, 0xf0, 0x47, 0x70, + 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1e, 0x00, + 0xb5, 0xb0, 0x27, 0x00, 0x4d, 0x13, 0x8e, 0xa9, + 0x29, 0x00, 0xd0, 0x03, 0x43, 0xf8, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x79, 0x04, 0x09, + 0x0c, 0x09, 0x1c, 0x3a, 0x1c, 0x0f, 0x56, 0x81, + 0x29, 0x00, 0xd1, 0xf7, 0x24, 0x00, 0x2f, 0xfe, + 0xdd, 0x03, 0x27, 0xfe, 0x1d, 0xc1, 0x31, 0xd9, + 0x77, 0xcc, 0x1c, 0x7a, 0x49, 0x08, 0xf7, 0xff, + 0xfb, 0x8f, 0x20, 0x04, 0x85, 0x28, 0x1c, 0xf8, + 0x08, 0x80, 0x00, 0x80, 0x85, 0x68, 0x20, 0x0f, + 0x02, 0x40, 0x86, 0xa8, 0x1c, 0x20, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, + 0x2c, 0x00, 0x1e, 0x00, 0xb5, 0x90, 0x06, 0x04, + 0x0e, 0x24, 0x06, 0x0f, 0x0e, 0x3f, 0xb0, 0x88, + 0xf0, 0x04, 0xfa, 0x1e, 0x28, 0x00, 0xd0, 0x05, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x08, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xab, 0x00, 0x70, 0x1c, + 0x70, 0x5f, 0x46, 0x68, 0x21, 0x20, 0xf0, 0x0a, + 0xfa, 0x6f, 0xb0, 0x08, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0xb4, 0xf0, 0x04, 0x0a, 0x0c, 0x12, + 0x4b, 0x15, 0x8e, 0x9f, 0x2f, 0x00, 0xd0, 0x03, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0x47, 0x70, + 0x07, 0xd7, 0x0f, 0xff, 0x04, 0x09, 0x0c, 0x09, + 0x08, 0x49, 0x2f, 0x00, 0xd0, 0x03, 0x31, 0x03, + 0x04, 0x09, 0x0c, 0x09, 0xe0, 0x02, 0x31, 0x02, + 0x04, 0x09, 0x0c, 0x09, 0x1c, 0x05, 0x4c, 0x0b, + 0x20, 0x00, 0x29, 0x00, 0xdd, 0x07, 0x00, 0x47, + 0x5b, 0xee, 0x53, 0xe6, 0x30, 0x01, 0x04, 0x00, + 0x0c, 0x00, 0x42, 0x88, 0xdb, 0xf7, 0x20, 0x05, + 0x85, 0x18, 0x85, 0x5a, 0x20, 0x01, 0x02, 0x40, + 0x86, 0x98, 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, + 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x02, 0x00, + 0x04, 0x01, 0x0c, 0x09, 0x48, 0x0b, 0x6f, 0xc2, + 0x20, 0x00, 0x43, 0xc0, 0x2a, 0x00, 0xd1, 0x0f, + 0x4a, 0x09, 0x8e, 0xd3, 0x2b, 0x00, 0xd1, 0x0b, + 0x48, 0x08, 0x86, 0xc1, 0x23, 0x07, 0x86, 0x83, + 0x85, 0x93, 0x85, 0xd1, 0x20, 0x09, 0x02, 0x40, + 0x86, 0xd0, 0x20, 0x01, 0x87, 0x90, 0x20, 0x00, + 0x47, 0x70, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0x80, + 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xc0, + 0xb5, 0x80, 0x1c, 0x01, 0x4a, 0x0d, 0x8e, 0xd3, + 0x20, 0x00, 0x43, 0xc0, 0x2b, 0x00, 0xd1, 0x12, + 0x8d, 0x93, 0x2b, 0x07, 0xd1, 0x0f, 0x8d, 0xd7, + 0x20, 0x00, 0x85, 0x90, 0x2f, 0x00, 0xd0, 0x0a, + 0x23, 0x01, 0x02, 0xdb, 0x42, 0x9f, 0xdc, 0x06, + 0x1c, 0x3a, 0x48, 0x05, 0x4b, 0x05, 0x6a, 0xdb, + 0xf0, 0x1d, 0xf9, 0x98, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, + 0x2c, 0x00, 0x12, 0x00, 0x2e, 0x08, 0x00, 0x1c, + 0xb5, 0xf0, 0xb0, 0x83, 0x49, 0x62, 0x8e, 0x88, + 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x4e, 0x5f, 0x78, 0x30, + 0x49, 0x5f, 0x91, 0x02, 0x78, 0x09, 0x42, 0x88, + 0xd1, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x00, 0x4d, 0x5b, 0x4b, 0x5c, + 0x93, 0x01, 0x1d, 0xd9, 0x31, 0x19, 0x7d, 0x0a, + 0x00, 0x53, 0x18, 0x9b, 0x01, 0x1b, 0x19, 0x5b, + 0x78, 0xdc, 0x1c, 0x1f, 0x79, 0x1b, 0x42, 0x9c, + 0xd1, 0x04, 0x79, 0x7b, 0x07, 0xdb, 0x0f, 0xdb, + 0x2b, 0x01, 0xd1, 0x06, 0x7d, 0x0b, 0x93, 0x00, + 0x32, 0x01, 0x07, 0x52, 0x0f, 0x52, 0x75, 0x0a, + 0xe0, 0x08, 0x32, 0x01, 0x07, 0x52, 0x0f, 0x52, + 0x75, 0x0a, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, + 0x28, 0x08, 0xdb, 0xe0, 0x28, 0x08, 0xd1, 0x03, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x00, 0x00, 0x43, 0x18, 0x18, 0x01, 0x00, + 0x19, 0x47, 0x78, 0xf8, 0x00, 0xc0, 0x19, 0xc0, + 0x89, 0x84, 0x23, 0x01, 0x03, 0x1b, 0x42, 0x9c, + 0xdd, 0x00, 0x1c, 0x1c, 0x68, 0x81, 0x89, 0xc0, + 0x18, 0x08, 0x1c, 0xe1, 0x08, 0x8a, 0x00, 0x92, + 0x49, 0x3e, 0x9b, 0x01, 0x6a, 0xdb, 0xf0, 0x1d, + 0xf9, 0x35, 0x88, 0x38, 0x02, 0x00, 0x30, 0x09, + 0x49, 0x35, 0x85, 0x08, 0x85, 0x4c, 0x20, 0x01, + 0x02, 0x40, 0x86, 0x88, 0x78, 0xf8, 0x00, 0xc0, + 0x19, 0xc0, 0x89, 0xc1, 0x19, 0x09, 0x81, 0xc1, + 0x78, 0xf8, 0x00, 0xc0, 0x19, 0xc0, 0x89, 0x81, + 0x1b, 0x09, 0x81, 0x81, 0x78, 0xf8, 0x00, 0xc0, + 0x19, 0xc0, 0x89, 0x81, 0x29, 0x00, 0xd1, 0x4f, + 0x24, 0x00, 0x81, 0xc4, 0x78, 0xf9, 0x6a, 0xb8, + 0x18, 0x40, 0x73, 0x04, 0x78, 0xf8, 0x30, 0x01, + 0x07, 0x80, 0x0f, 0x80, 0x70, 0xf8, 0x78, 0x30, + 0x30, 0x01, 0x70, 0x30, 0x78, 0xf8, 0x79, 0x39, + 0x42, 0x88, 0xd1, 0x3d, 0x79, 0x78, 0x21, 0x02, + 0x40, 0x01, 0x29, 0x02, 0xd1, 0x1e, 0x70, 0xfc, + 0x71, 0x3c, 0x71, 0x7c, 0x49, 0x22, 0x80, 0x39, + 0x6a, 0xb8, 0x68, 0x00, 0xf0, 0x04, 0xfd, 0xb6, + 0x6a, 0xb8, 0xf0, 0x04, 0xfd, 0xb3, 0x20, 0x00, + 0x49, 0x1d, 0x00, 0x42, 0x18, 0x12, 0x01, 0x12, + 0x5a, 0xaa, 0x42, 0x8a, 0xd1, 0x04, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf4, + 0x28, 0x08, 0xd1, 0x1d, 0x70, 0x34, 0x99, 0x02, + 0x70, 0x0c, 0xe0, 0x19, 0x07, 0xc0, 0x0f, 0xc0, + 0x28, 0x01, 0xd1, 0x15, 0x70, 0xfc, 0x71, 0x3c, + 0x21, 0x06, 0x1d, 0xf8, 0x30, 0x19, 0x73, 0x41, + 0x6a, 0xb9, 0x72, 0x0c, 0x79, 0x79, 0x08, 0x49, + 0x00, 0x49, 0x71, 0x79, 0x22, 0x04, 0x7b, 0x01, + 0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85, + 0x6a, 0xbb, 0xf0, 0x0f, 0xfd, 0xc3, 0xb0, 0x02, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x03, 0xc0, + 0x2e, 0x08, 0x03, 0xbc, 0x2e, 0x08, 0x45, 0x18, + 0x2e, 0x08, 0x00, 0x1c, 0x2c, 0x00, 0x02, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x4f, 0x0b, + 0x68, 0x38, 0x28, 0x00, 0xd1, 0x0f, 0x20, 0x2f, + 0x02, 0x80, 0xf0, 0x04, 0xfd, 0x91, 0x60, 0x38, + 0x20, 0x00, 0x49, 0x07, 0x60, 0x08, 0x49, 0x07, + 0x60, 0x08, 0x49, 0x07, 0x60, 0x08, 0x20, 0x2f, + 0x02, 0x80, 0x49, 0x06, 0x60, 0x08, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0xcb, 0x04, + 0x2e, 0x02, 0xcb, 0x0c, 0x2e, 0x02, 0xcb, 0x08, + 0x2e, 0x02, 0xcb, 0x10, 0x2e, 0x02, 0xcb, 0x14, + 0xb5, 0x80, 0x4f, 0x04, 0x68, 0x38, 0xf0, 0x04, + 0xfd, 0x7d, 0x20, 0x00, 0x60, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0xcb, 0x04, + 0xb5, 0xf0, 0xb0, 0x82, 0x4a, 0x33, 0x8e, 0x90, + 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x48, 0x30, 0x68, 0x01, + 0x4e, 0x30, 0x68, 0x30, 0x1a, 0x09, 0xd1, 0x03, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x29, 0x00, 0xda, 0x02, 0x23, 0x2f, 0x02, 0x9b, + 0x18, 0xc9, 0x23, 0x2f, 0x01, 0x1b, 0x42, 0x99, + 0xda, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x4a, 0x24, 0x8e, 0xd2, 0x2a, 0x00, + 0xd0, 0x06, 0x4b, 0x25, 0x42, 0x99, 0xda, 0x03, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1f, 0xcf, 0x3f, 0xff, 0x3f, 0x72, 0x4b, 0x21, + 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 0x21, 0x2f, + 0x02, 0x89, 0x1a, 0x0c, 0x4d, 0x1e, 0x49, 0x1f, + 0x91, 0x01, 0x42, 0xa7, 0xdd, 0x14, 0x1b, 0x3a, + 0x92, 0x00, 0x99, 0x01, 0x68, 0x09, 0x18, 0x08, + 0x1c, 0x22, 0x49, 0x1b, 0x6b, 0x2b, 0xf0, 0x1d, + 0xf8, 0x45, 0x4b, 0x19, 0x18, 0xe1, 0x98, 0x01, + 0x9a, 0x00, 0x68, 0x00, 0x6b, 0x2b, 0xf0, 0x1d, + 0xf8, 0x3d, 0x9a, 0x00, 0x60, 0x32, 0xe0, 0x0e, + 0x99, 0x01, 0x68, 0x09, 0x18, 0x08, 0x1c, 0x3a, + 0x49, 0x11, 0x6b, 0x2b, 0xf0, 0x1d, 0xf8, 0x32, + 0x68, 0x30, 0x19, 0xc1, 0x20, 0x2f, 0x02, 0x80, + 0xf0, 0x1d, 0xf8, 0x36, 0x60, 0x31, 0x20, 0x12, + 0x4a, 0x04, 0x85, 0x10, 0x85, 0x57, 0x20, 0x01, + 0x02, 0x40, 0x86, 0x90, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x02, 0xcb, 0x0c, 0x2e, 0x02, 0xcb, 0x08, + 0x00, 0x00, 0x0a, 0x48, 0x00, 0x00, 0x0f, 0x6c, + 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x02, 0xcb, 0x04, + 0x2c, 0x00, 0x02, 0x00, 0x2a, 0x00, 0xd0, 0x05, + 0x78, 0x03, 0x70, 0x0b, 0x30, 0x01, 0x31, 0x01, + 0x3a, 0x01, 0xd1, 0xf9, 0x47, 0x70, 0xb5, 0xf3, + 0xb0, 0x83, 0x98, 0x03, 0x78, 0x40, 0x00, 0x80, + 0x1c, 0x0f, 0x49, 0x3d, 0x58, 0x08, 0x28, 0x00, + 0xd1, 0x05, 0x20, 0xb0, 0xb0, 0x03, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x03, + 0x88, 0x45, 0x30, 0x04, 0xc8, 0x41, 0x1d, 0xf2, + 0x32, 0xb9, 0x1a, 0x14, 0x23, 0x01, 0x03, 0x1b, + 0x42, 0x9d, 0xdd, 0x03, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x03, 0xe7, 0xec, 0x19, 0x79, 0x91, 0x00, + 0x4b, 0x30, 0x93, 0x02, 0x2c, 0xbc, 0xdc, 0x01, + 0x2c, 0x00, 0xda, 0x07, 0x9b, 0x02, 0x68, 0x18, + 0x30, 0x01, 0x60, 0x18, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x03, 0xe7, 0xdc, 0x42, 0xac, 0xdb, 0x06, + 0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a, + 0xf0, 0x1c, 0xff, 0xd0, 0xe0, 0x44, 0x2d, 0x00, + 0xdd, 0x42, 0x4b, 0x25, 0x93, 0x01, 0x99, 0x00, + 0x42, 0x8f, 0xd9, 0x07, 0x9b, 0x02, 0x68, 0x18, + 0x30, 0x01, 0x60, 0x18, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x03, 0xe7, 0xc4, 0x42, 0xa5, 0xdd, 0x07, + 0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x22, + 0xf0, 0x1c, 0xff, 0xb8, 0x68, 0x36, 0xe0, 0x05, + 0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a, + 0xf0, 0x1c, 0xff, 0xb0, 0x19, 0x3f, 0x1b, 0x2d, + 0x79, 0xb0, 0x19, 0x80, 0x9a, 0x03, 0x78, 0x52, + 0x00, 0xd3, 0x1a, 0x9a, 0x00, 0x92, 0x9b, 0x01, + 0x68, 0x1b, 0x18, 0xd2, 0x78, 0x92, 0x06, 0xd2, + 0x0e, 0xd2, 0x1d, 0x31, 0x2a, 0x12, 0xd1, 0x06, + 0x78, 0xca, 0x0a, 0x12, 0xd2, 0x03, 0x78, 0x89, + 0x29, 0x09, 0xd1, 0x00, 0x38, 0x01, 0x1d, 0xf1, + 0x31, 0xb9, 0x1a, 0x0c, 0x2c, 0xbc, 0xdc, 0x01, + 0x2c, 0x00, 0xda, 0x03, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x03, 0xe7, 0x90, 0x2d, 0x00, 0xdc, 0xbe, + 0x20, 0x00, 0xb0, 0x03, 0xe7, 0x8b, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x00, 0x58, + 0x2e, 0x08, 0x9b, 0x30, 0xb4, 0xf0, 0x68, 0x42, + 0x68, 0x84, 0x1d, 0xe1, 0x31, 0xb7, 0x1c, 0x16, + 0xb0, 0x81, 0x42, 0x91, 0xd9, 0x09, 0x78, 0x51, + 0x07, 0x09, 0x0f, 0x09, 0x02, 0x09, 0x78, 0x92, + 0x43, 0x11, 0x31, 0x03, 0x04, 0x09, 0x0c, 0x09, + 0xe0, 0x5b, 0x68, 0x21, 0x79, 0x8b, 0x93, 0x00, + 0x1d, 0x0f, 0x18, 0x59, 0x78, 0x45, 0x00, 0xeb, + 0x1b, 0x5b, 0x00, 0x9b, 0x4d, 0x2b, 0x68, 0x2d, + 0x19, 0x5b, 0x78, 0x9b, 0x06, 0xdb, 0x0e, 0xdb, + 0x2b, 0x12, 0xd1, 0x31, 0x1d, 0xe3, 0x33, 0xb9, + 0x1b, 0x9b, 0x06, 0x1d, 0x0e, 0x2d, 0x78, 0xfe, + 0x0a, 0x33, 0xd2, 0x29, 0x2d, 0x0e, 0xda, 0x27, + 0x9b, 0x00, 0x2b, 0x09, 0xdd, 0x06, 0x79, 0x3b, + 0x18, 0xfb, 0x33, 0x05, 0x42, 0x8b, 0xd0, 0x1f, + 0x39, 0x01, 0xe0, 0x1d, 0x9b, 0x00, 0x2b, 0x09, + 0xd1, 0x1a, 0x79, 0x3b, 0x2b, 0x00, 0xd0, 0x01, + 0x39, 0x01, 0xe0, 0x15, 0x39, 0x01, 0x1d, 0xe3, + 0x33, 0xb8, 0x42, 0x93, 0xd9, 0x09, 0x78, 0x53, + 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, 0x04, 0x1b, + 0x0c, 0x1b, 0x33, 0x03, 0x04, 0x1b, 0x0c, 0x1b, + 0xe0, 0x03, 0x78, 0x4b, 0x33, 0x03, 0x04, 0x1b, + 0x0c, 0x1b, 0x42, 0x9d, 0xda, 0x00, 0x31, 0x01, + 0x1d, 0xe3, 0x33, 0xb8, 0x42, 0x93, 0xd9, 0x0b, + 0x78, 0x52, 0x07, 0x12, 0x0f, 0x12, 0x02, 0x12, + 0x04, 0x12, 0x0c, 0x12, 0x78, 0x09, 0x18, 0x51, + 0x31, 0x03, 0x04, 0x09, 0x0c, 0x09, 0xe0, 0x08, + 0x78, 0x0a, 0x07, 0x12, 0x0f, 0x12, 0x02, 0x12, + 0x78, 0x49, 0x43, 0x11, 0x31, 0x03, 0x04, 0x09, + 0x0c, 0x09, 0x80, 0x41, 0xb0, 0x01, 0xbc, 0xf0, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x30, + 0x4a, 0x02, 0xc2, 0x03, 0x3a, 0x08, 0x20, 0x00, + 0x60, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x44, 0x20, + 0x48, 0x01, 0x68, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x44, 0x20, 0x48, 0x01, 0x68, 0x80, + 0x08, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x44, 0x20, + 0x48, 0x02, 0x68, 0x81, 0x08, 0xc9, 0x68, 0x00, + 0x18, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x44, 0x20, + 0xb4, 0xf0, 0x1c, 0x03, 0x20, 0x00, 0xb0, 0x82, + 0x49, 0x53, 0x91, 0x01, 0x68, 0x89, 0x18, 0xcf, + 0x97, 0x00, 0x08, 0xca, 0x07, 0x4c, 0x0f, 0x64, + 0x49, 0x4f, 0x68, 0x09, 0xd1, 0x32, 0x1c, 0x1f, + 0xd5, 0x04, 0x42, 0x7f, 0x07, 0x7f, 0x0f, 0x7f, + 0x42, 0x7f, 0xe0, 0x01, 0x07, 0x7f, 0x0f, 0x7f, + 0x2f, 0x00, 0xd1, 0x27, 0x2b, 0x10, 0xd0, 0x16, + 0xdc, 0x05, 0x2b, 0x00, 0xd0, 0x5a, 0x2b, 0x08, + 0xd1, 0x59, 0x5c, 0x88, 0xe0, 0x81, 0x2b, 0x18, + 0xd0, 0x13, 0x2b, 0x20, 0xd1, 0x53, 0x5c, 0x88, + 0x06, 0x00, 0x18, 0x89, 0x78, 0x4a, 0x04, 0x12, + 0x18, 0x80, 0x78, 0x8a, 0x02, 0x12, 0x18, 0x80, + 0x78, 0xc9, 0x18, 0x40, 0xe0, 0x71, 0x5c, 0x88, + 0x02, 0x00, 0x18, 0x89, 0x78, 0x49, 0x18, 0x40, + 0xe0, 0x6b, 0x5c, 0x88, 0x04, 0x00, 0x18, 0x89, + 0x78, 0x4a, 0x02, 0x12, 0x18, 0x80, 0x78, 0x89, + 0x18, 0x40, 0xe0, 0x62, 0x2b, 0x00, 0xd1, 0x03, + 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x9f, 0x00, 0x08, 0xfd, 0x07, 0x7f, 0x0f, 0x7f, + 0x2b, 0x20, 0xdc, 0x56, 0x1a, 0xae, 0x4d, 0x2f, + 0x2e, 0x05, 0xd2, 0x52, 0xa3, 0x01, 0x5d, 0x9b, + 0x00, 0x5b, 0x44, 0x9f, 0x02, 0x09, 0x14, 0x25, + 0x38, 0x00, 0x5c, 0x88, 0x5d, 0x29, 0x40, 0x08, + 0x21, 0x08, 0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x44, + 0x1c, 0x50, 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, + 0x02, 0x12, 0x5c, 0x08, 0x18, 0x80, 0x21, 0x08, + 0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x39, 0x1c, 0x50, + 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 0x02, 0x12, + 0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, 0x02, 0x00, + 0x5c, 0xc9, 0x18, 0x08, 0x21, 0x08, 0x1b, 0xc9, + 0x40, 0xc8, 0xe0, 0x2a, 0xe0, 0x29, 0xe0, 0x28, + 0x1c, 0x50, 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, + 0x02, 0x12, 0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, + 0x02, 0x00, 0x1c, 0x5a, 0x5c, 0xcb, 0x18, 0x18, + 0x02, 0x00, 0x5c, 0x89, 0x18, 0x08, 0x21, 0x08, + 0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x15, 0x1c, 0x50, + 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 0x02, 0x12, + 0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, 0x02, 0x00, + 0x1c, 0x5a, 0x5c, 0xcb, 0x18, 0x18, 0x02, 0x03, + 0x1c, 0x50, 0x5c, 0x8a, 0x18, 0xd2, 0x40, 0xba, + 0x5c, 0x08, 0x21, 0x08, 0x1b, 0xc9, 0x40, 0xc8, + 0x18, 0x80, 0x99, 0x01, 0x9f, 0x00, 0x60, 0x8f, + 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x44, 0x20, 0x2e, 0x08, 0x00, 0x60, + 0xb5, 0xb0, 0x1c, 0x07, 0x20, 0x00, 0x24, 0x00, + 0x2f, 0x00, 0xdd, 0x09, 0x00, 0x85, 0x18, 0x2d, + 0x00, 0x6d, 0x20, 0x04, 0xf7, 0xff, 0xff, 0x44, + 0x19, 0x40, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf5, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x47, 0x70, 0xb5, 0xb0, 0x1c, 0x0c, 0x1c, 0x05, + 0x1c, 0x17, 0xb0, 0x90, 0xf0, 0x22, 0xfa, 0x20, + 0x49, 0x25, 0x20, 0x0c, 0xf0, 0x22, 0xf9, 0xe8, + 0xf0, 0x22, 0xf9, 0xde, 0x4b, 0x23, 0x40, 0x18, + 0xf0, 0x22, 0xf9, 0xde, 0xf0, 0x22, 0xfa, 0x4a, + 0x20, 0x10, 0x90, 0x0a, 0x20, 0xff, 0x90, 0x0b, + 0xa8, 0x0f, 0x90, 0x0c, 0x20, 0x0c, 0x90, 0x0d, + 0x48, 0x1d, 0x90, 0x0e, 0xa8, 0x0a, 0xf0, 0x14, + 0xfb, 0xa5, 0xab, 0x07, 0x70, 0x1d, 0x94, 0x08, + 0x72, 0x1f, 0x24, 0x00, 0xab, 0x09, 0x70, 0x5c, + 0x27, 0x00, 0x4d, 0x18, 0xf0, 0x14, 0xfc, 0x06, + 0x28, 0x00, 0xd0, 0x02, 0x37, 0x01, 0x42, 0xaf, + 0xdb, 0xf8, 0x20, 0x01, 0xa9, 0x07, 0xf0, 0x14, + 0xfc, 0x07, 0xf0, 0x14, 0xfb, 0xfb, 0x28, 0x00, + 0xd1, 0xfb, 0x94, 0x0b, 0xa8, 0x0a, 0xf0, 0x14, + 0xfb, 0x89, 0xf0, 0x22, 0xf9, 0xe9, 0x21, 0x00, + 0x20, 0x0c, 0xf0, 0x22, 0xf9, 0xb1, 0xf0, 0x22, + 0xf9, 0xa7, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, + 0xf0, 0x22, 0xf9, 0xa6, 0xf0, 0x22, 0xfa, 0x12, + 0x46, 0x68, 0xf0, 0x14, 0xfb, 0xc3, 0x98, 0x04, + 0xb0, 0x10, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x00, 0x15, 0xa5, 0xff, 0xff, 0xf7, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x27, 0x10, + 0xb5, 0xff, 0x9e, 0x09, 0x1c, 0x04, 0x1c, 0x0d, + 0x1c, 0x17, 0xb0, 0x93, 0xf0, 0x22, 0xf9, 0xc4, + 0x49, 0x31, 0x20, 0x0c, 0xf0, 0x22, 0xf9, 0x8c, + 0xf0, 0x22, 0xf9, 0x82, 0x4b, 0x2f, 0x40, 0x18, + 0xf0, 0x22, 0xf9, 0x82, 0xf0, 0x22, 0xf9, 0xee, + 0x20, 0x10, 0x90, 0x0d, 0x20, 0xff, 0x90, 0x0e, + 0xa8, 0x12, 0x90, 0x0f, 0x20, 0x0c, 0x90, 0x10, + 0x48, 0x29, 0x90, 0x11, 0xa8, 0x0d, 0xf0, 0x14, + 0xfb, 0x49, 0xab, 0x07, 0x70, 0x1c, 0x95, 0x08, + 0x72, 0x1f, 0x20, 0xff, 0xab, 0x09, 0x70, 0x58, + 0x1c, 0x60, 0x71, 0x18, 0x9b, 0x16, 0x93, 0x0b, + 0xab, 0x0c, 0x70, 0x1e, 0x20, 0xff, 0x70, 0x58, + 0x24, 0x00, 0x4d, 0x20, 0xf0, 0x14, 0xfb, 0xa2, + 0x28, 0x00, 0xd0, 0x02, 0x34, 0x01, 0x42, 0xac, + 0xdb, 0xf8, 0x2f, 0x00, 0xd1, 0x04, 0x20, 0x01, + 0xa9, 0x0a, 0xf0, 0x14, 0xfb, 0xa1, 0xe0, 0x03, + 0x20, 0x02, 0xa9, 0x07, 0xf0, 0x14, 0xfb, 0x9c, + 0xf0, 0x14, 0xfb, 0x90, 0x28, 0x00, 0xd1, 0xfb, + 0x27, 0x00, 0x97, 0x0e, 0xa8, 0x0d, 0xf0, 0x14, + 0xfb, 0x1d, 0xf0, 0x22, 0xf9, 0x7d, 0x21, 0x00, + 0x20, 0x0c, 0xf0, 0x22, 0xf9, 0x45, 0xf0, 0x22, + 0xf9, 0x3b, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, + 0xf0, 0x22, 0xf9, 0x3a, 0xf0, 0x22, 0xf9, 0xa6, + 0x46, 0x68, 0xf0, 0x14, 0xfb, 0x57, 0x98, 0x01, + 0x0a, 0x80, 0xd2, 0x05, 0x20, 0x01, 0xb0, 0x13, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0xb0, 0x13, 0xe7, 0xf8, 0x00, 0x00, + 0x2e, 0x00, 0x15, 0xa5, 0xff, 0xff, 0xf7, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x27, 0x10, + 0x1c, 0x01, 0x48, 0x04, 0x61, 0xc1, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x01, 0x48, 0x02, 0x60, 0x01, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x68, + 0x6e, 0x00, 0x17, 0x00, 0xb5, 0xb0, 0x4f, 0x41, + 0x69, 0x38, 0x4c, 0x41, 0x28, 0x00, 0xd0, 0x07, + 0x20, 0x03, 0x60, 0x20, 0x69, 0x38, 0x38, 0x01, + 0x61, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x02, 0x69, 0x78, 0x28, 0x00, 0xd0, 0x04, + 0x60, 0x21, 0x69, 0x78, 0x38, 0x01, 0x61, 0x78, + 0xd1, 0xf3, 0x68, 0xf8, 0x28, 0x00, 0xd0, 0x20, + 0x38, 0x01, 0x60, 0xf8, 0x4a, 0x35, 0xd0, 0x08, + 0x68, 0xbb, 0x18, 0xd2, 0x3a, 0x20, 0x7f, 0xd2, + 0x1e, 0x45, 0x40, 0xea, 0x07, 0xd2, 0x0f, 0xd2, + 0xe0, 0x09, 0x68, 0xbb, 0x18, 0xd2, 0x3a, 0x20, + 0x7f, 0xd2, 0x4b, 0x2f, 0x5c, 0x9a, 0x23, 0x01, + 0x40, 0x5a, 0x06, 0x12, 0x0e, 0x12, 0x23, 0x01, + 0x2a, 0x00, 0xd0, 0x02, 0x61, 0x79, 0x61, 0x3b, + 0xe0, 0x01, 0x61, 0x39, 0x61, 0x7b, 0x28, 0x00, + 0xd1, 0xcf, 0x68, 0xb8, 0x30, 0x01, 0x60, 0xb8, + 0x23, 0x09, 0x68, 0x7a, 0x1c, 0x01, 0x42, 0x90, + 0xdc, 0x03, 0x60, 0xfb, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x20, 0x1c, 0x55, 0x42, 0x8d, + 0xd1, 0x03, 0x61, 0x78, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x95, 0x42, 0x8d, 0xd1, 0x0d, + 0x7e, 0x3d, 0x2d, 0xff, 0xd0, 0x0a, 0x2d, 0x00, + 0xd0, 0x03, 0x60, 0xfb, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x19, 0x61, 0x38, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x32, 0x03, 0x42, 0x8a, + 0xd1, 0x04, 0x20, 0x22, 0x61, 0x78, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x69, 0xf9, 0x60, 0x21, + 0x68, 0x79, 0x68, 0xba, 0x31, 0x04, 0x42, 0x91, + 0xd1, 0x0a, 0x69, 0xf9, 0x29, 0x00, 0xd0, 0x03, + 0x61, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x61, 0x78, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0xf0, 0x03, 0xff, 0xca, 0x20, 0x00, 0x60, 0x38, + 0x69, 0xf8, 0x60, 0x20, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x68, + 0x6e, 0x00, 0x17, 0x00, 0x2e, 0x08, 0x44, 0x2c, + 0x2e, 0x08, 0x00, 0x68, 0xb5, 0xb0, 0x04, 0x0b, + 0x0c, 0x1b, 0x04, 0x14, 0x0c, 0x24, 0x49, 0x14, + 0x68, 0x0a, 0x2a, 0x00, 0xd0, 0x02, 0x68, 0x0a, + 0x2a, 0x00, 0xd1, 0xfc, 0x22, 0x01, 0x60, 0x0a, + 0x2b, 0x0a, 0xdd, 0x00, 0x23, 0x0a, 0x22, 0x00, + 0x4f, 0x0e, 0x2b, 0x00, 0xdd, 0x05, 0x00, 0x55, + 0x5b, 0x45, 0x54, 0xbd, 0x32, 0x01, 0x42, 0x9a, + 0xdb, 0xf9, 0x76, 0x0c, 0x20, 0xff, 0x18, 0xfa, + 0x70, 0x50, 0x20, 0x00, 0x60, 0x4b, 0x22, 0x20, + 0x61, 0x08, 0x61, 0x4a, 0x60, 0x88, 0x60, 0xc8, + 0x49, 0x05, 0x20, 0x32, 0xf0, 0x03, 0xff, 0x66, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x01, 0x68, 0x2e, 0x08, 0x44, 0x2c, + 0x2e, 0x00, 0x17, 0x61, 0xb5, 0x80, 0x04, 0x01, + 0x0c, 0x09, 0x20, 0x00, 0x22, 0x00, 0xb0, 0x88, + 0x00, 0x47, 0x46, 0x6b, 0x53, 0xda, 0x30, 0x01, + 0x04, 0x00, 0x14, 0x00, 0x28, 0x10, 0xdb, 0xf7, + 0x22, 0x80, 0x00, 0x43, 0x46, 0x68, 0x52, 0xc2, + 0x46, 0x6a, 0x1c, 0x08, 0x21, 0x05, 0xf0, 0x04, + 0xfa, 0x33, 0x49, 0x06, 0x80, 0x88, 0x00, 0x42, + 0x18, 0x12, 0x00, 0x92, 0x4b, 0x04, 0x5a, 0x9a, + 0x81, 0x0a, 0xb0, 0x08, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x88, + 0x2e, 0x08, 0x48, 0x28, 0xb5, 0x80, 0xb0, 0xb2, + 0x46, 0x68, 0xf0, 0x15, 0xf8, 0x99, 0xaf, 0x16, + 0xcf, 0x83, 0x9a, 0x19, 0xf0, 0x00, 0xf9, 0xd2, + 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0xed, 0xb0, 0x32, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, + 0x06, 0x00, 0x0e, 0x00, 0x06, 0x09, 0x0e, 0x09, + 0xf0, 0x0f, 0xfd, 0x7a, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x09, + 0x0e, 0x09, 0x4b, 0x05, 0x68, 0x1b, 0x06, 0x1b, + 0x0e, 0x1b, 0x2b, 0x30, 0xd3, 0x01, 0xf0, 0x0f, + 0xfd, 0x6b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xbc, 0xb5, 0xf0, 0x25, 0x00, + 0x4e, 0x1a, 0x4c, 0x1b, 0x4f, 0x1b, 0x68, 0x30, + 0x68, 0x00, 0x00, 0x40, 0x0a, 0x40, 0x02, 0x40, + 0x21, 0x19, 0x06, 0x89, 0x6a, 0x89, 0x4b, 0x18, + 0x40, 0x19, 0x0a, 0x49, 0x43, 0x08, 0x49, 0x17, + 0x64, 0x08, 0xf0, 0x01, 0xfc, 0x63, 0xf0, 0x02, + 0xf9, 0x3b, 0x68, 0x38, 0x30, 0x01, 0x60, 0x38, + 0x48, 0x13, 0x88, 0x01, 0x31, 0x01, 0x80, 0x01, + 0x20, 0x0c, 0x68, 0x21, 0xf0, 0x1c, 0xfc, 0x42, + 0x29, 0x00, 0xd1, 0x01, 0xf7, 0xff, 0xff, 0xae, + 0x20, 0x32, 0x68, 0x21, 0xf0, 0x1c, 0xfc, 0x3a, + 0x4b, 0x0c, 0x42, 0x98, 0xd9, 0x01, 0x49, 0x0c, + 0x60, 0xf9, 0x42, 0x85, 0xd0, 0xd3, 0x1c, 0x05, + 0xf0, 0x00, 0xfe, 0x40, 0x20, 0x00, 0x60, 0x38, + 0xe7, 0xcd, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xa4, + 0x2e, 0x08, 0x05, 0xbc, 0x2e, 0x08, 0x01, 0x88, + 0x00, 0x03, 0xfe, 0x00, 0x2c, 0x00, 0x1f, 0x80, + 0x2c, 0x00, 0x1f, 0xc8, 0x00, 0x00, 0x05, 0x46, + 0x2e, 0x00, 0x19, 0x65, 0xb5, 0xf0, 0x27, 0x00, + 0xb0, 0x94, 0x46, 0x68, 0x4c, 0x2f, 0xcc, 0x6e, + 0xc0, 0x6e, 0xcc, 0x6e, 0xc0, 0x6e, 0x23, 0x28, + 0x22, 0x41, 0x00, 0xd2, 0x21, 0x00, 0x20, 0x01, + 0xf0, 0x0d, 0xfd, 0xda, 0x22, 0xff, 0x21, 0x64, + 0x20, 0x01, 0x32, 0xf5, 0xf0, 0x0d, 0xfe, 0x9c, + 0x20, 0x00, 0x46, 0x69, 0x5c, 0x09, 0x40, 0x41, + 0x23, 0x35, 0x40, 0x59, 0xaa, 0x0a, 0x54, 0x11, + 0x30, 0x01, 0x28, 0x25, 0xdb, 0xf5, 0x24, 0x00, + 0xa9, 0x0a, 0x54, 0x0c, 0x22, 0x00, 0x20, 0x01, + 0x1c, 0x23, 0xf0, 0x0e, 0xf8, 0xfa, 0x4e, 0x1e, + 0x4d, 0x1e, 0x4c, 0x1f, 0xf0, 0x03, 0xff, 0x6e, + 0xf0, 0x03, 0xff, 0x6c, 0x28, 0x28, 0xd9, 0x10, + 0x42, 0xb0, 0xd3, 0x0e, 0x69, 0xe9, 0x08, 0xc9, + 0xd3, 0x0b, 0x4b, 0x1a, 0x18, 0xc1, 0x20, 0x1e, + 0xf0, 0x1c, 0xfb, 0xe0, 0x21, 0x64, 0x1d, 0xc2, + 0x32, 0xff, 0x32, 0xee, 0x20, 0x01, 0xf0, 0x0d, + 0xfe, 0x6f, 0xf0, 0x01, 0xfb, 0xeb, 0xf0, 0x02, + 0xf8, 0xc3, 0xf0, 0x03, 0xff, 0x53, 0x1c, 0x01, + 0x20, 0x7d, 0x00, 0xc0, 0xf0, 0x1c, 0xfb, 0xce, + 0x1c, 0x01, 0x48, 0x0f, 0x88, 0x02, 0x32, 0x01, + 0x80, 0x02, 0x42, 0xb9, 0xd0, 0xd6, 0x2f, 0x04, + 0xd3, 0x06, 0x20, 0x01, 0xf0, 0x0d, 0xfd, 0x78, + 0xb0, 0x14, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x0f, 0xf0, 0x00, 0xfd, 0xcb, 0x20, 0x00, + 0x60, 0x20, 0xe7, 0xc7, 0x2e, 0x02, 0xcc, 0x74, + 0x00, 0x00, 0x0b, 0xb8, 0x72, 0x00, 0x01, 0x00, + 0x2e, 0x08, 0x01, 0x88, 0xff, 0xff, 0xf4, 0x48, + 0x2c, 0x00, 0x1f, 0xc8, 0xb5, 0x80, 0x27, 0x00, + 0x48, 0x08, 0x81, 0x07, 0x48, 0x08, 0x49, 0x09, + 0x60, 0xc8, 0xf0, 0x03, 0xfd, 0x43, 0xf7, 0xff, + 0xff, 0x85, 0xf0, 0x00, 0xf8, 0xd3, 0xf7, 0xff, + 0xff, 0x39, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x00, 0x19, 0x53, 0x2e, 0x08, 0x01, 0x88, + 0x47, 0x70, 0xb5, 0xf0, 0x4d, 0x29, 0x68, 0x01, + 0x31, 0x03, 0x10, 0x89, 0x1e, 0xcb, 0x68, 0x41, + 0x10, 0x89, 0x68, 0x82, 0x10, 0x92, 0x00, 0x89, + 0x30, 0x0c, 0x18, 0x0c, 0x21, 0x03, 0x05, 0x89, + 0x27, 0x35, 0x06, 0x7f, 0x60, 0x39, 0x49, 0x22, + 0x68, 0x0e, 0x08, 0xb6, 0x00, 0xb6, 0x60, 0x0e, + 0x21, 0x00, 0x2b, 0x00, 0xd9, 0x04, 0xc8, 0x40, + 0xc5, 0x40, 0x31, 0x01, 0x42, 0x99, 0xd3, 0xfa, + 0x23, 0x00, 0x49, 0x1c, 0x65, 0x8b, 0x20, 0x00, + 0x2a, 0x00, 0xd9, 0x04, 0xcc, 0x20, 0x64, 0x8d, + 0x30, 0x01, 0x42, 0x90, 0xd3, 0xfa, 0x48, 0x18, + 0x60, 0x03, 0x60, 0x3b, 0x66, 0x8b, 0x60, 0x3b, + 0x22, 0x01, 0x64, 0xca, 0x21, 0x00, 0x4a, 0x15, + 0x68, 0x03, 0x2b, 0x00, 0xd1, 0x05, 0x33, 0x01, + 0x2b, 0x64, 0xdb, 0xfc, 0x31, 0x01, 0x42, 0x91, + 0xdb, 0xf6, 0x48, 0x11, 0x68, 0x01, 0x23, 0x01, + 0x43, 0x19, 0x60, 0x01, 0x49, 0x0f, 0x20, 0x33, + 0x06, 0x40, 0x65, 0x41, 0x49, 0x0e, 0x65, 0x81, + 0x49, 0x0e, 0x66, 0x81, 0x39, 0x04, 0x66, 0x41, + 0x21, 0x03, 0x67, 0x01, 0x21, 0x00, 0x20, 0x0d, + 0xf0, 0x14, 0xfd, 0x62, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x70, 0x6a, 0x00, 0x00, 0x80, + 0xcc, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x27, 0x10, + 0x6a, 0x00, 0x00, 0x10, 0xcc, 0x00, 0x0f, 0x84, + 0xcc, 0x00, 0x0f, 0x88, 0x98, 0x00, 0x0f, 0x88, + 0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08, + 0xf0, 0x15, 0xf9, 0x9c, 0x48, 0x08, 0x21, 0x40, + 0xf0, 0x14, 0xfe, 0x6c, 0x20, 0x01, 0x21, 0x35, + 0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0, + 0x49, 0x04, 0x63, 0x08, 0x20, 0x00, 0x21, 0x39, + 0x06, 0x49, 0x62, 0xc8, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x02, 0x3b, 0x04, 0x72, 0x00, 0x01, 0x00, + 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x0f, 0xd0, 0x10, + 0x29, 0x01, 0xd0, 0x12, 0x29, 0x02, 0xd0, 0x14, + 0x29, 0x03, 0xd1, 0x01, 0x49, 0x0c, 0x60, 0x01, + 0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00, + 0x21, 0x1e, 0xf0, 0x15, 0xf9, 0xdb, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x01, 0x04, 0x49, 0x60, 0x01, + 0xe7, 0xf2, 0x21, 0x21, 0x03, 0x09, 0x60, 0x01, + 0xe7, 0xee, 0x21, 0x41, 0x03, 0x09, 0x60, 0x01, + 0xe7, 0xea, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x98, + 0x00, 0x08, 0x10, 0x08, 0xb5, 0x00, 0x1c, 0x01, + 0x48, 0x0b, 0xd0, 0x0e, 0x29, 0x01, 0xd0, 0x0f, + 0x29, 0x02, 0xd1, 0x01, 0x21, 0x04, 0x60, 0x41, + 0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00, + 0x21, 0x1e, 0xf0, 0x15, 0xf9, 0xb7, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x01, 0x60, 0x41, 0xe7, 0xf3, + 0x21, 0x02, 0x60, 0x41, 0xe7, 0xf0, 0x00, 0x00, + 0x2e, 0x08, 0x01, 0x98, 0xb5, 0x80, 0x4b, 0x09, + 0x22, 0x0a, 0x21, 0x0a, 0x20, 0x0b, 0xf0, 0x15, + 0xfb, 0xeb, 0x20, 0x0b, 0xf0, 0x15, 0xfd, 0x0d, + 0x4f, 0x05, 0x60, 0x38, 0x00, 0x80, 0xf0, 0x03, + 0xff, 0x2b, 0x60, 0x78, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xc4, + 0x2e, 0x08, 0x01, 0xd4, 0xb5, 0xb0, 0x25, 0x00, + 0x1c, 0x0c, 0x1c, 0x07, 0x2a, 0x08, 0xd2, 0x30, + 0xa3, 0x01, 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, + 0x2c, 0x29, 0x29, 0x03, 0x29, 0x29, 0x03, 0x29, + 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x4d, 0x23, 0x2d, + 0x01, 0x1b, 0x42, 0x9f, 0xd0, 0x13, 0x23, 0x0b, + 0x01, 0x9b, 0x42, 0x9f, 0xd0, 0x0f, 0x23, 0xff, + 0x33, 0xe1, 0x42, 0x9f, 0xd0, 0x0b, 0x23, 0xff, + 0x33, 0x61, 0x42, 0x9f, 0xd0, 0x07, 0x23, 0x21, + 0x01, 0x1b, 0x42, 0x9f, 0xd0, 0x03, 0x23, 0x11, + 0x01, 0x5b, 0x42, 0x9f, 0xd1, 0x08, 0x23, 0x09, + 0x01, 0x9b, 0x42, 0x9c, 0xd0, 0x09, 0x08, 0x5b, + 0x42, 0x9c, 0xd0, 0x06, 0x2c, 0xf0, 0xd0, 0x04, + 0x25, 0x01, 0xe0, 0x02, 0x20, 0x01, 0xf0, 0x00, + 0xf8, 0x27, 0x4f, 0x12, 0x6c, 0x78, 0x42, 0x85, + 0xd0, 0x1c, 0x1d, 0xfb, 0x33, 0x35, 0x2d, 0x00, + 0xd0, 0x12, 0x1f, 0xda, 0x3a, 0x0d, 0x21, 0x03, + 0x1d, 0x10, 0xb4, 0x07, 0x22, 0x0b, 0xb4, 0x04, + 0x1c, 0x19, 0x23, 0x00, 0x22, 0x00, 0x20, 0x00, + 0xf0, 0x0f, 0xff, 0xe4, 0x6a, 0xb8, 0x1c, 0x29, + 0xb0, 0x04, 0xf0, 0x11, 0xf9, 0x33, 0xe0, 0x04, + 0x21, 0x00, 0x6a, 0xb8, 0x1c, 0x1a, 0xf0, 0x10, + 0xfa, 0xe9, 0x64, 0x7d, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x98, + 0xb5, 0xf0, 0x1c, 0x07, 0xb0, 0x81, 0x4d, 0x56, + 0x1d, 0xee, 0x36, 0x19, 0x79, 0x30, 0x42, 0x87, + 0xd1, 0x03, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x24, 0x00, 0x6c, 0x68, 0x28, 0x00, + 0xd0, 0x05, 0x64, 0x6c, 0x4a, 0x4f, 0x21, 0x00, + 0x6a, 0xa8, 0xf0, 0x10, 0xfa, 0xcb, 0x71, 0x37, + 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x14, 0xfc, 0x5c, + 0x20, 0x00, 0xf0, 0x11, 0xff, 0x5d, 0x20, 0x1f, + 0xf0, 0x0e, 0xff, 0xf2, 0x26, 0x03, 0x02, 0x76, + 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0x20, 0x1f, + 0x1c, 0x33, 0xf0, 0x0e, 0xfe, 0x69, 0x20, 0x1e, + 0xf0, 0x0f, 0xf8, 0xb0, 0x22, 0x01, 0x02, 0xd2, + 0x21, 0x02, 0x20, 0x1e, 0x1c, 0x33, 0xf0, 0x0e, + 0xfe, 0x5f, 0x26, 0x1c, 0x1c, 0x39, 0x48, 0x3e, + 0x27, 0x0c, 0x29, 0x06, 0xd2, 0x07, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x03, 0x12, 0x03, 0x21, 0x12, 0x30, 0x48, 0x39, + 0x21, 0x40, 0xf0, 0x14, 0xfd, 0x5b, 0xab, 0x00, + 0x70, 0x1c, 0x20, 0x08, 0x70, 0x58, 0x70, 0x9e, + 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x15, + 0xf8, 0x7d, 0xe0, 0x2b, 0x21, 0x1f, 0x43, 0xc9, + 0xf0, 0x14, 0xfd, 0x4c, 0xab, 0x00, 0x70, 0x1c, + 0x70, 0x5c, 0x70, 0x9f, 0x70, 0xdc, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x15, 0xf8, 0x6e, + 0xe0, 0x1c, 0x21, 0x40, 0xf0, 0x14, 0xfd, 0x3e, + 0xab, 0x00, 0x70, 0x1c, 0x20, 0x10, 0x70, 0x58, + 0x70, 0x9e, 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, + 0x20, 0x08, 0xf0, 0x15, 0xf8, 0x5f, 0xe0, 0x0d, + 0x21, 0x1f, 0x43, 0xc9, 0xf0, 0x14, 0xfd, 0x2e, + 0xab, 0x00, 0x70, 0x1c, 0x70, 0x5c, 0x70, 0x9f, + 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08, + 0xf0, 0x15, 0xf8, 0x50, 0x20, 0x01, 0x21, 0x35, + 0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0, + 0x49, 0x19, 0x63, 0x08, 0x20, 0x39, 0x06, 0x40, + 0x62, 0xc4, 0xcd, 0x03, 0x43, 0x08, 0x22, 0x00, + 0x21, 0x1e, 0xf0, 0x15, 0xf8, 0xa7, 0x48, 0x15, + 0xf0, 0x11, 0xfe, 0x68, 0x20, 0x00, 0xf0, 0x11, + 0xfe, 0xd9, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x68, + 0x20, 0x00, 0xf0, 0x03, 0xfb, 0x15, 0x20, 0x01, + 0xf0, 0x11, 0xfe, 0xde, 0x4a, 0x0e, 0xb4, 0x04, + 0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0d, 0x1e, 0xc8, + 0xf7, 0xfe, 0xfb, 0xae, 0x21, 0x00, 0x20, 0x0d, + 0xb0, 0x01, 0xf0, 0x14, 0xfb, 0xcd, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xd4, + 0x2e, 0x02, 0x81, 0x70, 0x2e, 0x02, 0x3b, 0x04, + 0x72, 0x00, 0x01, 0x00, 0x00, 0x80, 0x10, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, + 0xb5, 0xb0, 0x1c, 0x07, 0x4c, 0x10, 0x6a, 0x20, + 0x42, 0x87, 0xd0, 0x19, 0x20, 0x00, 0x2f, 0x03, + 0xd1, 0x02, 0x21, 0x01, 0x61, 0x61, 0xe0, 0x00, + 0x61, 0x60, 0x21, 0x02, 0x4d, 0x0b, 0x60, 0x29, + 0x71, 0x28, 0x71, 0x68, 0x22, 0x01, 0xb4, 0x04, + 0x7a, 0x23, 0x7c, 0x22, 0x7b, 0x21, 0x20, 0x00, + 0xf0, 0x14, 0xfe, 0x9a, 0x69, 0x61, 0x1c, 0x28, + 0xb0, 0x01, 0xf0, 0x15, 0xff, 0x41, 0x62, 0x27, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xb0, + 0xb5, 0x00, 0x22, 0x02, 0x49, 0x09, 0x60, 0x0a, + 0x22, 0x00, 0x71, 0x0a, 0x71, 0x4a, 0x39, 0x48, + 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd1, 0x00, + 0x72, 0x08, 0x6a, 0x08, 0x62, 0x0a, 0xf7, 0xff, + 0xff, 0xc7, 0xbc, 0x08, 0x47, 0x18, 0x72, 0x0a, + 0xe7, 0xf7, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xe0, + 0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x0b, + 0xd0, 0x02, 0x20, 0x00, 0x73, 0x38, 0xe0, 0x01, + 0x20, 0x01, 0x73, 0x38, 0x22, 0x01, 0xb4, 0x04, + 0x7a, 0x3b, 0x7c, 0x3a, 0x7b, 0x39, 0x20, 0x00, + 0xf0, 0x14, 0xfe, 0x62, 0x69, 0x79, 0xb0, 0x01, + 0x48, 0x03, 0xf0, 0x15, 0xff, 0x09, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x01, 0x98, + 0x2e, 0x08, 0x01, 0xb0, 0xb5, 0x80, 0x06, 0x00, + 0x0e, 0x00, 0x1c, 0x01, 0x4f, 0x08, 0x74, 0x39, + 0x22, 0x01, 0xb4, 0x04, 0x7a, 0x3b, 0x7b, 0x39, + 0x1c, 0x02, 0x20, 0x00, 0xf0, 0x14, 0xfe, 0x48, + 0x69, 0x79, 0xb0, 0x01, 0x48, 0x03, 0xf0, 0x15, + 0xfe, 0xef, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xb0, + 0xb4, 0xb0, 0x21, 0x00, 0x48, 0x08, 0x60, 0x01, + 0x20, 0x00, 0x4c, 0x08, 0x4f, 0x08, 0x4b, 0x09, + 0x4a, 0x09, 0x00, 0x85, 0x51, 0x61, 0x54, 0x39, + 0x54, 0x19, 0x54, 0x11, 0x30, 0x01, 0x28, 0x20, + 0xdb, 0xf7, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x01, 0xe8, 0x2e, 0x08, 0x44, 0x38, + 0x2e, 0x08, 0x44, 0xb8, 0x2e, 0x08, 0x44, 0xf8, + 0x2e, 0x08, 0x44, 0xd8, 0x06, 0x00, 0x0e, 0x00, + 0x21, 0x01, 0x40, 0x81, 0x43, 0xca, 0x49, 0x05, + 0x68, 0x0b, 0x40, 0x1a, 0x60, 0x0a, 0x21, 0x00, + 0x00, 0x82, 0x4b, 0x03, 0x50, 0x99, 0x4a, 0x03, + 0x54, 0x11, 0x47, 0x70, 0x2e, 0x08, 0x01, 0xe8, + 0x2e, 0x08, 0x44, 0x38, 0x2e, 0x08, 0x44, 0xb8, + 0xb5, 0xf0, 0xb0, 0x84, 0x4f, 0x36, 0x68, 0x38, + 0x1d, 0xc1, 0x31, 0x0d, 0x20, 0x00, 0xf0, 0x2a, + 0xfb, 0x93, 0x1c, 0x04, 0x68, 0x38, 0x1d, 0xc1, + 0x31, 0x05, 0x20, 0x00, 0xf0, 0x2a, 0xfb, 0x8c, + 0x1c, 0x05, 0x68, 0x38, 0x1d, 0xc1, 0x31, 0x09, + 0x20, 0x00, 0xf0, 0x2a, 0xfb, 0x85, 0x43, 0x2c, + 0x1c, 0x20, 0x4c, 0x2c, 0x68, 0x21, 0x43, 0x08, + 0x27, 0x00, 0x60, 0x20, 0x1c, 0x05, 0xd0, 0x4a, + 0x48, 0x29, 0x90, 0x03, 0x48, 0x29, 0x90, 0x02, + 0x4a, 0x29, 0x92, 0x01, 0x4e, 0x29, 0x08, 0x68, + 0xd3, 0x3c, 0x98, 0x03, 0x5d, 0xc0, 0x28, 0x00, + 0xd0, 0x32, 0x98, 0x02, 0x5d, 0xc0, 0x28, 0x00, + 0xd0, 0x2a, 0x46, 0x68, 0x1c, 0x39, 0xf0, 0x16, + 0xfb, 0x01, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01, + 0xd1, 0x1b, 0x68, 0x60, 0x30, 0x01, 0x60, 0x60, + 0x5d, 0xf0, 0x28, 0x00, 0xd1, 0x06, 0x20, 0xff, + 0x55, 0xf0, 0x21, 0x00, 0x00, 0xb8, 0x9a, 0x01, + 0x50, 0x11, 0xe0, 0x1f, 0x20, 0x02, 0x1c, 0x39, + 0xf0, 0x00, 0xf8, 0x8e, 0x28, 0x00, 0xd1, 0x19, + 0x21, 0x00, 0x55, 0xf1, 0x20, 0x01, 0x40, 0xb8, + 0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, + 0xe0, 0x10, 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, + 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 0xe0, 0x09, + 0x68, 0x60, 0x30, 0x01, 0x60, 0x60, 0xe0, 0x05, + 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 0x68, 0x21, + 0x40, 0x08, 0x60, 0x20, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0x08, 0x6d, 0xd1, 0xbb, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0x78, 0x2e, 0x08, 0x01, 0xe8, + 0x2e, 0x08, 0x44, 0xd8, 0x2e, 0x08, 0x44, 0xf8, + 0x2e, 0x08, 0x44, 0x38, 0x2e, 0x08, 0x44, 0xb8, + 0xb5, 0xf0, 0x27, 0x00, 0xb0, 0x85, 0x4c, 0x26, + 0x68, 0x25, 0x2d, 0x00, 0xd0, 0x44, 0x4e, 0x25, + 0x48, 0x25, 0x90, 0x04, 0x49, 0x25, 0x91, 0x03, + 0x4a, 0x25, 0x92, 0x02, 0x48, 0x25, 0x90, 0x01, + 0x08, 0x68, 0xd3, 0x34, 0x5d, 0xf0, 0x28, 0x00, + 0xd0, 0x2b, 0x98, 0x04, 0x5d, 0xc0, 0x28, 0x00, + 0xd0, 0x2d, 0x46, 0x68, 0x1c, 0x39, 0xf0, 0x16, + 0xfa, 0x9d, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01, + 0xd1, 0x18, 0x68, 0x60, 0x30, 0x01, 0x60, 0x60, + 0x00, 0xb8, 0x99, 0x03, 0x58, 0x09, 0x69, 0x09, + 0x9a, 0x02, 0x50, 0x11, 0x20, 0x02, 0x1c, 0x39, + 0xf0, 0x00, 0xf8, 0x2e, 0x28, 0x00, 0xd1, 0x16, + 0x21, 0x00, 0x98, 0x01, 0x55, 0xc1, 0x20, 0x01, + 0x40, 0xb8, 0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, + 0x60, 0x20, 0xe0, 0x0c, 0x20, 0x01, 0x40, 0xb8, + 0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, + 0xe0, 0x05, 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, + 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0x08, 0x6d, 0xd1, 0xc3, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x01, 0xe8, 0x2e, 0x08, 0x44, 0xd8, + 0x2e, 0x08, 0x44, 0xf8, 0x2e, 0x08, 0x9b, 0xc8, + 0x2e, 0x08, 0x44, 0x38, 0x2e, 0x08, 0x44, 0xb8, + 0xb4, 0xf0, 0x06, 0x02, 0x0e, 0x12, 0xb0, 0x82, + 0x92, 0x00, 0x06, 0x0c, 0x0e, 0x24, 0x00, 0xa0, + 0xb0, 0x81, 0x49, 0x31, 0x58, 0x09, 0x91, 0x00, + 0x29, 0x00, 0xd1, 0x03, 0x20, 0xb0, 0xb0, 0x03, + 0xbc, 0xf0, 0x47, 0x70, 0x49, 0x2d, 0x68, 0x09, + 0x18, 0x47, 0x00, 0xe1, 0x1b, 0x09, 0x00, 0x89, + 0x4a, 0x2b, 0x68, 0x12, 0x18, 0x89, 0x9a, 0x01, + 0x4d, 0x2a, 0x4b, 0x2b, 0x93, 0x02, 0x2a, 0x01, + 0xd0, 0x28, 0x2a, 0x02, 0xd1, 0x44, 0x4b, 0x29, + 0x58, 0x1a, 0x2a, 0x00, 0xd1, 0x03, 0x20, 0xff, + 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x60, 0x4a, + 0x22, 0x00, 0x50, 0x1a, 0x5c, 0xa8, 0x42, 0xa0, + 0xd1, 0x06, 0x00, 0x90, 0x9b, 0x02, 0x58, 0x18, + 0x78, 0x46, 0x23, 0x80, 0x43, 0x9e, 0x70, 0x46, + 0x1c, 0x50, 0x06, 0x02, 0x0e, 0x12, 0x2a, 0x20, + 0xdb, 0xf0, 0x88, 0x08, 0x4b, 0x1c, 0x40, 0x18, + 0x80, 0x08, 0x98, 0x00, 0x9a, 0x01, 0x70, 0xc2, + 0x68, 0x38, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x38, 0xe0, 0x19, 0x68, 0x38, 0x4b, 0x17, + 0x40, 0x18, 0x60, 0x38, 0x98, 0x00, 0x9a, 0x01, + 0x70, 0xc2, 0x20, 0x00, 0x60, 0x88, 0x70, 0xc8, + 0x60, 0xc8, 0x5c, 0x29, 0x42, 0xa1, 0xd1, 0x06, + 0x00, 0x81, 0x9b, 0x02, 0x58, 0x59, 0x78, 0x4a, + 0x23, 0x80, 0x43, 0x1a, 0x70, 0x4a, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf0, + 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, + 0x20, 0xbc, 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x38, + 0x2e, 0x08, 0x9b, 0x30, 0x2e, 0x08, 0x9d, 0x10, + 0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x44, 0x38, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xb4, 0xf0, 0x78, 0x43, 0x00, 0x9e, 0x49, 0x32, + 0x59, 0x8c, 0x88, 0x42, 0x68, 0x87, 0x68, 0x40, + 0x1d, 0xf9, 0x31, 0xb9, 0x1a, 0x09, 0x42, 0x91, + 0xda, 0x3d, 0x25, 0x00, 0x1c, 0x18, 0x00, 0xdb, + 0x1a, 0x18, 0x00, 0x80, 0x4b, 0x2b, 0x68, 0x1b, + 0x18, 0xc0, 0x78, 0x80, 0x06, 0xc0, 0x0e, 0xc0, + 0x28, 0x12, 0xd1, 0x02, 0x29, 0x0e, 0xda, 0x00, + 0x25, 0x01, 0x2a, 0x00, 0xdd, 0x2b, 0x42, 0x8a, + 0xdd, 0x05, 0x68, 0x3f, 0x2f, 0x00, 0xd1, 0x02, + 0x20, 0xba, 0xbc, 0xf0, 0x47, 0x70, 0x1a, 0x52, + 0x79, 0xb9, 0x23, 0xc0, 0x1a, 0x59, 0x79, 0xfb, + 0x1d, 0x38, 0x08, 0x5b, 0xd3, 0x01, 0x22, 0x00, + 0xe0, 0x16, 0x2d, 0x00, 0xd0, 0x14, 0x42, 0x91, + 0xdb, 0x01, 0x31, 0x01, 0xe0, 0x10, 0x1c, 0x4b, + 0x42, 0x93, 0xd1, 0x0d, 0x78, 0x85, 0x2d, 0x09, + 0xdd, 0x06, 0x79, 0x05, 0x78, 0x80, 0x35, 0x09, + 0x42, 0x85, 0xd0, 0x05, 0x1c, 0x19, 0xe0, 0x03, + 0x78, 0x80, 0x28, 0x09, 0xd1, 0x00, 0x1c, 0x19, + 0x25, 0x00, 0x2a, 0x00, 0xdc, 0xd3, 0x69, 0x21, + 0x20, 0x00, 0x1c, 0x0a, 0x42, 0xb9, 0xd0, 0xd4, + 0x68, 0x0b, 0x42, 0xbb, 0xd0, 0x08, 0x68, 0x09, + 0x29, 0x00, 0xd1, 0x02, 0x20, 0xba, 0xbc, 0xf0, + 0x47, 0x70, 0x68, 0x0b, 0x42, 0xbb, 0xd1, 0xf6, + 0x4b, 0x07, 0x51, 0x9a, 0x60, 0x08, 0x69, 0xa2, + 0x69, 0x23, 0x60, 0x13, 0x61, 0xa1, 0x61, 0x27, + 0x61, 0x67, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x30, + 0x2e, 0x08, 0x44, 0x38, 0xb5, 0xf0, 0x06, 0x07, + 0x0e, 0x3f, 0x04, 0x0c, 0x0c, 0x24, 0x06, 0x15, + 0x0e, 0x2d, 0x00, 0xf8, 0x49, 0x2c, 0x68, 0x09, + 0x18, 0x40, 0x00, 0xb9, 0x4a, 0x2b, 0x68, 0x12, + 0x18, 0x8a, 0x00, 0xf9, 0x1b, 0xc9, 0x00, 0x89, + 0x4b, 0x29, 0x68, 0x1b, 0x18, 0xc9, 0x68, 0x16, + 0x23, 0x01, 0x03, 0x5b, 0x43, 0x9e, 0x60, 0x16, + 0x68, 0x06, 0x23, 0x03, 0x03, 0x9b, 0x43, 0x9e, + 0x60, 0x06, 0x4b, 0x24, 0x42, 0x9c, 0xd0, 0x36, + 0x68, 0x06, 0x23, 0x21, 0x43, 0x9e, 0x60, 0x06, + 0x68, 0x16, 0x23, 0x07, 0x03, 0x5b, 0x40, 0x33, + 0x60, 0x13, 0x23, 0x07, 0x03, 0x5b, 0x43, 0x9c, + 0x1c, 0x23, 0x68, 0x14, 0x43, 0x23, 0x60, 0x13, + 0x22, 0x00, 0x75, 0x0a, 0x88, 0x0c, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x9c, 0x80, 0x0c, 0x07, 0xab, + 0x0f, 0x9b, 0x2b, 0x01, 0xd1, 0x04, 0x88, 0x0c, + 0x23, 0x10, 0x43, 0x23, 0x80, 0x0b, 0xe0, 0x03, + 0x88, 0x0c, 0x23, 0x10, 0x43, 0x9c, 0x80, 0x0c, + 0x68, 0x01, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x19, + 0x60, 0x01, 0x00, 0xf9, 0x4b, 0x0e, 0x68, 0x1b, + 0x18, 0xc9, 0x60, 0x4a, 0x68, 0x01, 0x4b, 0x0d, + 0x43, 0x19, 0x60, 0x01, 0x68, 0x01, 0x60, 0x01, + 0x21, 0x0f, 0x60, 0x41, 0xe0, 0x04, 0x1c, 0x38, + 0xf0, 0x13, 0xfa, 0xb6, 0x28, 0x00, 0xd1, 0x00, + 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x9b, 0x3c, 0x2e, 0x08, 0x9b, 0x38, + 0x2e, 0x08, 0x9b, 0x30, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x9b, 0x40, 0x00, 0x00, 0x20, 0xa0, + 0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x07, + 0xb0, 0x8a, 0x48, 0x58, 0x29, 0x00, 0xd1, 0x0a, + 0x4d, 0x57, 0x69, 0x01, 0x91, 0x04, 0x49, 0x57, + 0x91, 0x03, 0x69, 0x41, 0x91, 0x02, 0x6a, 0x00, + 0x1e, 0x43, 0x93, 0x01, 0xe0, 0x0b, 0x29, 0x20, + 0xd1, 0x15, 0x4d, 0x53, 0x69, 0x81, 0x91, 0x04, + 0x49, 0x52, 0x91, 0x03, 0x69, 0xc1, 0x91, 0x02, + 0x6a, 0x40, 0x1e, 0x43, 0x93, 0x01, 0x24, 0x00, + 0x4b, 0x4f, 0x93, 0x09, 0x4a, 0x4f, 0x92, 0x08, + 0x4b, 0x4f, 0x93, 0x07, 0x4e, 0x4f, 0x96, 0x06, + 0x4a, 0x4f, 0x92, 0x05, 0xe0, 0x7a, 0x20, 0xb3, + 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x04, 0x00, 0x80, 0x19, 0x40, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xc0, 0x68, 0x01, 0x98, 0x04, + 0x00, 0x80, 0x58, 0x28, 0x9a, 0x04, 0x18, 0xaa, + 0x00, 0x5b, 0x18, 0xd2, 0x78, 0x12, 0x92, 0x00, + 0x22, 0x00, 0x9b, 0x04, 0x18, 0xee, 0x23, 0x01, + 0x02, 0xdb, 0x18, 0xf3, 0x70, 0x1a, 0x9a, 0x04, + 0x32, 0x01, 0x92, 0x04, 0x9b, 0x01, 0x40, 0x1a, + 0x92, 0x04, 0x29, 0x00, 0xd0, 0x56, 0xb0, 0x82, + 0x91, 0x01, 0x21, 0x01, 0x9a, 0x02, 0x2a, 0x80, + 0xd1, 0x19, 0x22, 0x00, 0x9b, 0x01, 0x40, 0x0b, + 0xd0, 0x10, 0x9b, 0x0b, 0x5c, 0x9b, 0x2b, 0xff, + 0xd0, 0x0c, 0x9b, 0x0b, 0x5c, 0x9b, 0x93, 0x00, + 0x00, 0x91, 0x9a, 0x0a, 0x58, 0x52, 0x00, 0xa1, + 0x19, 0xc9, 0x61, 0x0a, 0x1c, 0x61, 0x06, 0x0c, + 0x0e, 0x24, 0xe0, 0x1c, 0x00, 0x49, 0x32, 0x01, + 0x2a, 0x10, 0xd3, 0xe7, 0xe0, 0x17, 0x22, 0x00, + 0x9b, 0x01, 0x40, 0x0b, 0xd0, 0x0f, 0x9b, 0x09, + 0x5c, 0x9b, 0x2b, 0xff, 0xd0, 0x0b, 0x93, 0x00, + 0x00, 0x93, 0x9e, 0x08, 0x58, 0xf6, 0x00, 0xa3, + 0x19, 0xdb, 0x61, 0x1e, 0x28, 0x00, 0xd0, 0x02, + 0x1c, 0x63, 0x06, 0x1c, 0x0e, 0x24, 0x00, 0x49, + 0x32, 0x01, 0x2a, 0x20, 0xd3, 0xe8, 0x2c, 0x00, + 0xd0, 0x1b, 0x9b, 0x00, 0x70, 0x7b, 0x60, 0x78, + 0x9b, 0x00, 0x00, 0x99, 0x9a, 0x07, 0x58, 0x52, + 0x69, 0x51, 0xe0, 0x07, 0x68, 0x09, 0x29, 0x00, + 0xd1, 0x04, 0x20, 0xba, 0xb0, 0x0c, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x42, 0x88, 0xd3, 0xf5, + 0x1d, 0xcb, 0x33, 0xb9, 0x42, 0x83, 0xd3, 0xf1, + 0x60, 0xb9, 0x61, 0x51, 0x1c, 0x38, 0xf0, 0x13, + 0xfa, 0xc0, 0xb0, 0x02, 0x98, 0x04, 0x99, 0x02, + 0x42, 0x88, 0xd0, 0x01, 0x2c, 0x00, 0xd0, 0x83, + 0x70, 0x3c, 0x98, 0x04, 0x99, 0x03, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x9e, 0x00, 0x04, 0x80, + 0x2e, 0x08, 0x9d, 0xfc, 0x9e, 0x00, 0x04, 0x90, + 0x2e, 0x08, 0xa6, 0xfc, 0x9e, 0x00, 0x04, 0x98, + 0x2e, 0x08, 0x9d, 0x30, 0x2e, 0x08, 0x9c, 0xd0, + 0x2e, 0x08, 0x9d, 0x10, 0x2e, 0x08, 0x9c, 0x50, + 0x2e, 0x08, 0x9b, 0xc8, 0xb5, 0x00, 0x20, 0xff, + 0x49, 0x03, 0x60, 0x08, 0x20, 0x01, 0x05, 0x00, + 0xf0, 0x21, 0xf9, 0x74, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x01, 0xe8, 0xb5, 0xf0, 0x06, 0x07, + 0x0e, 0x3f, 0x06, 0x0c, 0x0e, 0x24, 0x20, 0x10, + 0x2f, 0x1f, 0xdc, 0x2c, 0x2c, 0x1f, 0xdc, 0x2a, + 0x1c, 0x39, 0x43, 0x21, 0x08, 0x49, 0xd2, 0x26, + 0x49, 0x14, 0x1c, 0x38, 0xf0, 0x21, 0xf9, 0x70, + 0x26, 0x01, 0x1c, 0x35, 0x40, 0xbd, 0x1c, 0x30, + 0x40, 0xa0, 0x1c, 0x04, 0x43, 0x28, 0xf0, 0x21, + 0xf9, 0x5a, 0xf0, 0x21, 0xf9, 0x5d, 0x43, 0xa8, + 0xf0, 0x21, 0xf9, 0x5e, 0xf0, 0x21, 0xf9, 0x58, + 0x43, 0xa0, 0xf0, 0x21, 0xf9, 0x59, 0x1c, 0x38, + 0xf0, 0x15, 0xfc, 0x02, 0x1c, 0x04, 0xd1, 0x07, + 0x21, 0x03, 0x05, 0x09, 0x20, 0x00, 0x1c, 0x3a, + 0x1c, 0x33, 0xf0, 0x16, 0xfa, 0xb3, 0x1c, 0x04, + 0xf7, 0xff, 0xfc, 0x92, 0x1c, 0x20, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x00, 0x2c, 0x0b, + 0xb5, 0xf0, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x0d, + 0x0c, 0x2d, 0x06, 0x16, 0x0e, 0x36, 0x9f, 0x05, + 0x06, 0x38, 0x0e, 0x00, 0x22, 0x00, 0x21, 0x00, + 0xb4, 0x07, 0x21, 0x10, 0x1c, 0x1a, 0xb4, 0x06, + 0x23, 0x10, 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32, + 0xf0, 0x00, 0xf8, 0x54, 0xb0, 0x05, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x06, 0x04, + 0x0e, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x06, 0x16, + 0x0e, 0x36, 0x9f, 0x05, 0x06, 0x38, 0x0e, 0x00, + 0x22, 0x00, 0x21, 0x00, 0xb4, 0x07, 0x21, 0x18, + 0x1c, 0x1a, 0xb4, 0x06, 0x23, 0x11, 0x1c, 0x20, + 0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00, 0xf8, 0x3a, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf0, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x0d, + 0x0c, 0x2d, 0x06, 0x16, 0x0e, 0x36, 0x9f, 0x05, + 0x06, 0x38, 0x0e, 0x00, 0x22, 0x00, 0x21, 0x00, + 0xb4, 0x07, 0x21, 0x20, 0x1c, 0x1a, 0xb4, 0x06, + 0x23, 0x51, 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32, + 0xf0, 0x00, 0xf8, 0x20, 0xb0, 0x05, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x06, 0x03, + 0x0e, 0x1b, 0x04, 0x0d, 0x0c, 0x2d, 0x06, 0x16, + 0x0e, 0x36, 0x9c, 0x09, 0x9f, 0x0a, 0x06, 0x20, + 0x0e, 0x00, 0x22, 0x00, 0x1c, 0x39, 0xb4, 0x07, + 0x21, 0x10, 0x9a, 0x06, 0xb4, 0x06, 0x1c, 0x18, + 0x23, 0x62, 0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00, + 0xf8, 0x05, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9e, 0x09, + 0x9f, 0x0b, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x09, + 0x0c, 0x09, 0xb0, 0x88, 0x91, 0x00, 0x06, 0x15, + 0x0e, 0x2d, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, + 0x06, 0x32, 0x0e, 0x12, 0x92, 0x02, 0x06, 0x38, + 0x0e, 0x00, 0x90, 0x03, 0xb0, 0x82, 0xf0, 0x21, + 0xf8, 0xbf, 0x0d, 0x40, 0xd2, 0x09, 0x20, 0xff, + 0x90, 0x00, 0xf0, 0x21, 0xf8, 0xb9, 0x23, 0x01, + 0x05, 0x1b, 0x43, 0x18, 0xf0, 0x21, 0xf8, 0xb8, + 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x03, + 0x08, 0x40, 0xd3, 0x02, 0x22, 0x12, 0x92, 0x01, + 0xe0, 0x01, 0x22, 0x11, 0x92, 0x01, 0x22, 0x01, + 0x1c, 0x11, 0x40, 0xa9, 0x4b, 0x5f, 0x1c, 0x0f, + 0x68, 0x18, 0x40, 0x07, 0xd0, 0x01, 0x27, 0x11, + 0xe0, 0xa2, 0x27, 0x00, 0x43, 0x08, 0x60, 0x18, + 0x23, 0x1c, 0x98, 0x05, 0x40, 0x18, 0x28, 0x1c, + 0xd1, 0x06, 0x21, 0x01, 0x20, 0x7d, 0x01, 0x00, + 0xf0, 0x15, 0xff, 0x60, 0x1c, 0x06, 0xe0, 0x0d, + 0x98, 0x05, 0x08, 0x40, 0xd3, 0x05, 0x21, 0x01, + 0x20, 0xc8, 0xf0, 0x15, 0xff, 0x57, 0x1c, 0x06, + 0xe0, 0x04, 0x21, 0x01, 0x20, 0x3c, 0xf0, 0x15, + 0xff, 0x51, 0x1c, 0x06, 0x20, 0x34, 0xf0, 0x03, + 0xf9, 0x57, 0x00, 0xaa, 0x92, 0x09, 0x49, 0x4c, + 0x91, 0x08, 0x50, 0x88, 0x00, 0xa1, 0x91, 0x07, + 0x48, 0x4a, 0x90, 0x06, 0x58, 0x40, 0x28, 0x00, + 0xd1, 0x05, 0x00, 0xb0, 0xf0, 0x03, 0xf9, 0x48, + 0x99, 0x07, 0x9a, 0x06, 0x50, 0x50, 0x98, 0x09, + 0x99, 0x08, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x04, + 0x98, 0x06, 0x99, 0x07, 0x58, 0x40, 0x28, 0x00, + 0xd1, 0x01, 0x27, 0x13, 0xe0, 0x64, 0x99, 0x07, + 0x4a, 0x3f, 0x58, 0x51, 0x29, 0x00, 0xd1, 0x3a, + 0x9a, 0x01, 0xb4, 0x04, 0x23, 0x40, 0x1c, 0x31, + 0x1c, 0x22, 0xf0, 0x15, 0xff, 0xaf, 0xb0, 0x01, + 0x1c, 0x07, 0xd1, 0x17, 0x23, 0x03, 0x02, 0x5b, + 0x22, 0x01, 0x02, 0xd2, 0x21, 0x01, 0x1c, 0x20, + 0xf0, 0x0e, 0xf8, 0xf2, 0x22, 0x00, 0xb4, 0x04, + 0x22, 0x02, 0x99, 0x03, 0x9b, 0x02, 0x1c, 0x20, + 0xf0, 0x0d, 0xff, 0x26, 0xb0, 0x01, 0x1c, 0x07, + 0xd1, 0x04, 0x22, 0x01, 0x48, 0x2f, 0x55, 0x02, + 0x48, 0x2f, 0x55, 0x02, 0x2f, 0x00, 0xd1, 0x16, + 0x98, 0x16, 0x28, 0x00, 0xd0, 0x13, 0x21, 0x02, + 0x98, 0x16, 0xf0, 0x15, 0xfe, 0xff, 0x1c, 0x07, + 0x00, 0x80, 0xf0, 0x03, 0xf9, 0x05, 0x99, 0x07, + 0x4a, 0x28, 0x50, 0x50, 0x28, 0x00, 0xd0, 0x05, + 0x1c, 0x39, 0x1c, 0x22, 0xf0, 0x15, 0xff, 0x13, + 0x1c, 0x07, 0xe0, 0x00, 0x27, 0x13, 0x2f, 0x00, + 0xd1, 0x22, 0x98, 0x03, 0x09, 0x80, 0xd3, 0x06, + 0x20, 0x5c, 0xf0, 0x03, 0xf8, 0xf1, 0x28, 0x00, + 0xd1, 0x02, 0x27, 0x13, 0xe0, 0x00, 0x20, 0x00, + 0x1c, 0x02, 0x98, 0x05, 0x99, 0x17, 0xb4, 0x07, + 0x1c, 0x2a, 0xb4, 0x04, 0x98, 0x0d, 0x99, 0x0c, + 0x58, 0x08, 0x99, 0x18, 0x9a, 0x08, 0x9b, 0x07, + 0xf0, 0x00, 0xf9, 0x1c, 0xb0, 0x04, 0x2f, 0x00, + 0xd1, 0x06, 0x98, 0x09, 0x99, 0x08, 0x58, 0x08, + 0x1c, 0x21, 0xf0, 0x12, 0xf9, 0x93, 0x1c, 0x07, + 0x2f, 0x00, 0xd0, 0x03, 0x1c, 0x20, 0x1c, 0x29, + 0xf0, 0x00, 0xf8, 0x20, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0xf0, 0x20, 0xff, 0xf1, 0x4b, 0x0c, + 0x40, 0x18, 0xf0, 0x20, 0xff, 0xf1, 0x1c, 0x38, + 0xb0, 0x0a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xf0, + 0x2e, 0x08, 0x01, 0xf4, 0x2e, 0x08, 0x02, 0x74, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x44, 0xf8, + 0x2e, 0x08, 0x44, 0xd8, 0x2e, 0x08, 0x02, 0xf4, + 0xff, 0xef, 0xff, 0xff, 0xb5, 0xf0, 0x06, 0x07, + 0x0e, 0x3f, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x83, + 0xf0, 0x20, 0xff, 0xce, 0x0d, 0x40, 0xd2, 0x09, + 0x20, 0xff, 0x90, 0x00, 0xf0, 0x20, 0xff, 0xc8, + 0x23, 0x01, 0x05, 0x1b, 0x43, 0x18, 0xf0, 0x20, + 0xff, 0xc7, 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, + 0x24, 0x00, 0x20, 0x01, 0x40, 0xa8, 0x1c, 0x02, + 0x49, 0x3f, 0x1c, 0x13, 0x68, 0x08, 0x40, 0x03, + 0xd0, 0x69, 0x43, 0xd2, 0x40, 0x10, 0x00, 0xae, + 0x60, 0x08, 0x4d, 0x3c, 0x59, 0xa8, 0x28, 0x00, + 0xd0, 0x62, 0x78, 0x81, 0x91, 0x02, 0x08, 0x49, + 0xd3, 0x02, 0x23, 0x12, 0x93, 0x01, 0xe0, 0x01, + 0x23, 0x11, 0x93, 0x01, 0x1c, 0x39, 0xf0, 0x12, + 0xf9, 0xad, 0x1c, 0x04, 0x59, 0xa8, 0x6b, 0x00, + 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x03, 0xf8, 0x96, + 0x59, 0xa8, 0x6a, 0xc0, 0x28, 0x00, 0xd0, 0x01, + 0xf0, 0x03, 0xf8, 0x90, 0x59, 0xa8, 0xf0, 0x03, + 0xf8, 0x8d, 0x20, 0x00, 0x51, 0xa8, 0x00, 0xbd, + 0x48, 0x2b, 0x59, 0x40, 0x78, 0x80, 0x28, 0x00, + 0xd1, 0x40, 0x1c, 0x39, 0xf0, 0x15, 0xfc, 0xd2, + 0x2c, 0x00, 0xd1, 0x2a, 0x98, 0x02, 0x09, 0x80, + 0xd3, 0x0a, 0x21, 0x00, 0x1c, 0x3a, 0x48, 0x25, + 0xf0, 0x15, 0xfe, 0x6d, 0x28, 0x00, 0xd0, 0x03, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x22, 0x00, 0xb4, 0x04, 0x22, 0x02, 0x9b, 0x02, + 0x1c, 0x38, 0x49, 0x1e, 0xf0, 0x0d, 0xfe, 0x54, + 0xb0, 0x01, 0x1c, 0x04, 0xd1, 0x11, 0x9a, 0x01, + 0xb4, 0x04, 0x26, 0x00, 0x21, 0x00, 0x1c, 0x3a, + 0x1c, 0x33, 0x48, 0x18, 0xf0, 0x15, 0xfe, 0xbe, + 0x1c, 0x04, 0xb0, 0x01, 0x48, 0x16, 0x55, 0xc6, + 0x48, 0x16, 0x55, 0xc6, 0x1c, 0x38, 0xf7, 0xff, + 0xfa, 0xc5, 0x4f, 0x15, 0x59, 0x78, 0xf0, 0x03, + 0xf8, 0x51, 0x26, 0x00, 0x51, 0x7e, 0x37, 0x80, + 0x59, 0x78, 0x28, 0x00, 0xd0, 0x04, 0xf0, 0x03, + 0xf8, 0x49, 0x51, 0x7e, 0xe0, 0x02, 0xe0, 0x00, + 0xe0, 0x00, 0x24, 0x12, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0xf0, 0x20, 0xff, 0x45, 0x4b, 0x0b, + 0x40, 0x18, 0xf0, 0x20, 0xff, 0x45, 0x1c, 0x20, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x01, 0xf0, 0x2e, 0x08, 0x01, 0xf4, + 0x2e, 0x08, 0x9b, 0xc8, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x44, 0xf8, 0x2e, 0x08, 0x44, 0xd8, + 0x2e, 0x08, 0x02, 0x74, 0xff, 0xef, 0xff, 0xff, + 0xb5, 0xb0, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x80, + 0x1c, 0x0c, 0x1c, 0x17, 0xb0, 0xad, 0x49, 0x1c, + 0x58, 0x08, 0x90, 0x04, 0x78, 0x81, 0x23, 0x04, + 0x40, 0x19, 0x25, 0x00, 0x29, 0x00, 0xd0, 0x0b, + 0xa9, 0x25, 0xf0, 0x12, 0xfd, 0x6f, 0xab, 0x00, + 0x80, 0x5d, 0xa8, 0x25, 0x90, 0x24, 0x46, 0x68, + 0x21, 0x00, 0xf0, 0x12, 0xfd, 0x8e, 0xe0, 0x0c, + 0x78, 0x00, 0x0a, 0x00, 0xd3, 0x04, 0x20, 0x01, + 0x03, 0x00, 0xab, 0x00, 0x80, 0x58, 0xe0, 0x03, + 0x20, 0x01, 0x02, 0x80, 0xab, 0x00, 0x80, 0x58, + 0x20, 0x00, 0x28, 0x00, 0xd1, 0x0e, 0xa8, 0x00, + 0x88, 0x40, 0x60, 0x38, 0xf0, 0x02, 0xff, 0xd4, + 0x60, 0x20, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x13, + 0xe0, 0x06, 0x1c, 0x01, 0x46, 0x68, 0xf0, 0x12, + 0xfd, 0x70, 0xe0, 0x01, 0x60, 0x25, 0x60, 0x3d, + 0xb0, 0x2d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x01, 0xf4, 0xb4, 0xf0, 0x06, 0x12, + 0x0e, 0x12, 0x06, 0x1b, 0x0e, 0x1b, 0x9c, 0x06, + 0x9f, 0x07, 0x9d, 0x05, 0x9e, 0x04, 0x06, 0x36, + 0x0e, 0x36, 0x06, 0x2d, 0xd0, 0x02, 0x25, 0x80, + 0x70, 0x05, 0xe0, 0x01, 0x25, 0x00, 0x70, 0x05, + 0x25, 0x00, 0x70, 0x45, 0x80, 0x85, 0x72, 0x05, + 0x70, 0xc6, 0x70, 0x83, 0x62, 0xc4, 0x63, 0x07, + 0x27, 0x00, 0x23, 0x00, 0x2a, 0x00, 0xdd, 0x10, + 0x5c, 0xcc, 0x19, 0xc5, 0x73, 0x2c, 0x18, 0xcc, + 0x78, 0x66, 0x1c, 0x7c, 0x06, 0x25, 0x0e, 0x2d, + 0x1c, 0x3c, 0x18, 0x24, 0x77, 0x26, 0x33, 0x02, + 0x06, 0x1b, 0x0e, 0x1b, 0x1c, 0x2f, 0x42, 0x93, + 0xdb, 0xee, 0xbc, 0xf0, 0x47, 0x70, 0xb5, 0xf0, + 0xb0, 0xac, 0x21, 0x00, 0xa8, 0x07, 0xf0, 0x12, + 0xfb, 0xf5, 0xa8, 0x07, 0x78, 0x00, 0x90, 0x06, + 0x28, 0x00, 0xd0, 0x4b, 0x24, 0x00, 0x98, 0x06, + 0x28, 0x00, 0xdd, 0x43, 0xa8, 0x07, 0xf0, 0x12, + 0xff, 0xbc, 0x00, 0xa1, 0xa8, 0x07, 0x18, 0x08, + 0x69, 0x07, 0x78, 0xfe, 0xad, 0x07, 0x88, 0x6d, + 0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12, 0xa8, 0x07, + 0xa9, 0x01, 0xf0, 0x16, 0xfa, 0x0b, 0x78, 0xb8, + 0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, 0x1c, 0x38, + 0xa9, 0x01, 0xf0, 0x16, 0xfa, 0x38, 0xe0, 0x08, + 0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x16, + 0xfa, 0x75, 0xe0, 0x02, 0x20, 0x40, 0xab, 0x00, + 0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, 0x09, 0xc0, + 0xd3, 0x16, 0x1c, 0x28, 0xf7, 0xfd, 0xfe, 0xf8, + 0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x07, 0x1c, 0x39, + 0xf0, 0x12, 0xfe, 0x2e, 0x28, 0x00, 0xd1, 0x09, + 0x1c, 0x30, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfd, + 0xff, 0x47, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, + 0xff, 0x39, 0xe0, 0x01, 0xf7, 0xfd, 0xff, 0x36, + 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0x98, 0x06, + 0x42, 0x84, 0xdb, 0xbb, 0xa8, 0x07, 0xf0, 0x12, + 0xfc, 0x97, 0xe7, 0xaa, 0xf7, 0xff, 0xfa, 0x5c, + 0xb0, 0x2c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf0, 0xb0, 0xad, 0x21, 0x00, 0xa8, 0x08, + 0xf0, 0x12, 0xfb, 0x98, 0x22, 0x05, 0x21, 0x16, + 0x1c, 0x04, 0xf0, 0x03, 0xfd, 0x6a, 0x2c, 0xb2, + 0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, 0xf0, 0x12, + 0xfb, 0x47, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, + 0x28, 0x00, 0xd0, 0x73, 0x25, 0x00, 0x98, 0x06, + 0x28, 0x00, 0xdd, 0x57, 0xa8, 0x08, 0xf0, 0x12, + 0xff, 0x54, 0x00, 0xa9, 0xa8, 0x08, 0x18, 0x08, + 0x69, 0x07, 0x78, 0xf8, 0x90, 0x07, 0xae, 0x08, + 0x88, 0x76, 0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12, + 0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x16, 0xf9, 0xa2, + 0x78, 0xb8, 0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, + 0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x16, 0xf9, 0xcf, + 0xe0, 0x08, 0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, + 0xf0, 0x16, 0xfa, 0x0c, 0xe0, 0x02, 0x20, 0x40, + 0xab, 0x00, 0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, + 0x09, 0xc0, 0xd3, 0x29, 0x78, 0xb8, 0x09, 0x80, + 0xd3, 0x0f, 0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x16, + 0xfb, 0x69, 0x1c, 0x04, 0xa8, 0x00, 0x78, 0x00, + 0x08, 0x80, 0xd2, 0x02, 0x78, 0xb8, 0x08, 0x80, + 0xd3, 0x1a, 0x1c, 0x38, 0xf0, 0x16, 0xfc, 0x70, + 0xe0, 0x16, 0x1c, 0x30, 0xf7, 0xfd, 0xfe, 0x7c, + 0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x08, 0x1c, 0x39, + 0xf0, 0x12, 0xfd, 0xb2, 0x28, 0x00, 0xd1, 0x09, + 0x98, 0x07, 0x1c, 0x31, 0x1c, 0x3a, 0xf7, 0xfd, + 0xfe, 0xcb, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, + 0xfe, 0xbd, 0xe0, 0x01, 0xf7, 0xfd, 0xfe, 0xba, + 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x06, + 0x42, 0x85, 0xdb, 0xa7, 0x98, 0x06, 0x28, 0x00, + 0xd0, 0x08, 0xa8, 0x08, 0xf0, 0x12, 0xfc, 0x18, + 0x2c, 0xb2, 0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, + 0xf0, 0x12, 0xfa, 0xda, 0xf7, 0xff, 0xf9, 0x5c, + 0x21, 0x00, 0xa8, 0x08, 0xf7, 0xff, 0xfb, 0x88, + 0x1c, 0x04, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, + 0x28, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xd1, 0x89, + 0xf7, 0xff, 0xf9, 0xca, 0xb0, 0x2d, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x26, 0x00, + 0x48, 0x28, 0x71, 0x06, 0x70, 0x06, 0x20, 0x00, + 0x4f, 0x27, 0x4a, 0x28, 0x49, 0x28, 0x00, 0x43, + 0x52, 0xd6, 0x52, 0xfe, 0x00, 0x83, 0x50, 0xce, + 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x1d, + 0xdb, 0xf5, 0x28, 0x20, 0xda, 0x08, 0x00, 0x43, + 0x52, 0xd6, 0x00, 0x83, 0x50, 0xce, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf6, + 0x20, 0x01, 0x02, 0x80, 0xf0, 0x20, 0xfd, 0xa3, + 0xf0, 0x20, 0xfd, 0xa6, 0x4b, 0x1b, 0x40, 0x18, + 0xf0, 0x20, 0xfd, 0xa6, 0x49, 0x1a, 0x20, 0x0a, + 0xf0, 0x20, 0xfd, 0xa6, 0x21, 0x00, 0x4f, 0x19, + 0x20, 0xff, 0x4a, 0x19, 0x00, 0x4b, 0x18, 0x5b, + 0x01, 0x1b, 0x52, 0xd7, 0x18, 0x9b, 0x70, 0x98, + 0x70, 0xde, 0x71, 0x1e, 0x1d, 0xdc, 0x34, 0x19, + 0x73, 0x26, 0x71, 0x5e, 0x1c, 0x1d, 0x23, 0x06, + 0x73, 0x63, 0x23, 0x00, 0x00, 0xdc, 0x19, 0x2c, + 0x81, 0xa6, 0x81, 0xe6, 0x33, 0x01, 0x06, 0x1b, + 0x0e, 0x1b, 0x60, 0xa6, 0x2b, 0x04, 0xdb, 0xf5, + 0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x08, + 0xdb, 0xe0, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xbc, + 0x2e, 0x08, 0x4a, 0x60, 0x2e, 0x08, 0x4a, 0x20, + 0x2e, 0x08, 0x46, 0x98, 0xff, 0xff, 0xfb, 0xff, + 0x2e, 0x00, 0x30, 0x45, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x45, 0x18, 0xb5, 0xf0, 0x06, 0x00, + 0x0e, 0x00, 0xb0, 0x83, 0x90, 0x00, 0x04, 0x09, + 0x0c, 0x09, 0x91, 0x01, 0x06, 0x10, 0x0e, 0x00, + 0x04, 0x1c, 0x0c, 0x24, 0x27, 0x00, 0x49, 0x5a, + 0x00, 0x7b, 0x19, 0xdb, 0x01, 0x1b, 0x5a, 0xcd, + 0x4b, 0x58, 0x42, 0x9d, 0xd1, 0x01, 0x1c, 0x3a, + 0xe0, 0x04, 0x1c, 0x7b, 0x06, 0x1f, 0x0e, 0x3f, + 0x2f, 0x08, 0xdb, 0xf1, 0x2f, 0x08, 0xd1, 0x05, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x46, 0x4f, 0x50, + 0x97, 0x02, 0x5b, 0xbb, 0x2b, 0x00, 0xd0, 0x05, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x23, 0x01, 0x9f, 0x02, + 0x53, 0xbb, 0x00, 0x53, 0x18, 0x9a, 0x01, 0x12, + 0x18, 0x57, 0x80, 0x38, 0x20, 0x14, 0xf0, 0x02, + 0xfe, 0x03, 0x1c, 0x01, 0x62, 0xb8, 0x20, 0x00, + 0x29, 0x00, 0xd1, 0x08, 0x49, 0x41, 0x80, 0x39, + 0x9f, 0x02, 0x53, 0xb8, 0x43, 0xc0, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x0d, + 0x21, 0xff, 0x02, 0x09, 0x40, 0x21, 0x12, 0x08, + 0x28, 0x09, 0xd2, 0x1f, 0xa3, 0x01, 0x5c, 0x1b, + 0x00, 0x5b, 0x44, 0x9f, 0x1b, 0x04, 0x06, 0x09, + 0x0c, 0x0f, 0x12, 0x15, 0x18, 0x00, 0x24, 0xb8, + 0xe0, 0x16, 0x24, 0xff, 0x34, 0x71, 0xe0, 0x13, + 0x24, 0x01, 0x02, 0xa4, 0xe0, 0x10, 0x24, 0x01, + 0x02, 0xe4, 0xe0, 0x0d, 0x24, 0x01, 0x03, 0x24, + 0xe0, 0x0a, 0x24, 0x01, 0x03, 0x64, 0xe0, 0x07, + 0x24, 0x01, 0x03, 0xa4, 0xe0, 0x04, 0x24, 0x01, + 0x03, 0xe4, 0xe0, 0x01, 0x24, 0x01, 0x02, 0xa4, + 0x80, 0xac, 0x88, 0xa8, 0x00, 0x80, 0xf0, 0x02, + 0xfd, 0xc7, 0x60, 0x28, 0x28, 0x00, 0xd1, 0x0d, + 0x48, 0x24, 0x80, 0x38, 0x20, 0x00, 0x9f, 0x02, + 0x53, 0xb8, 0x1c, 0x28, 0xf0, 0x02, 0xfd, 0xde, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x00, 0x70, 0xb8, + 0x26, 0x00, 0x88, 0x38, 0x00, 0x80, 0x49, 0x1d, + 0x50, 0x0e, 0x20, 0x00, 0x1c, 0x01, 0x43, 0x61, + 0x68, 0x2a, 0x18, 0x8a, 0x00, 0xc1, 0x19, 0xc9, + 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x60, 0x8a, + 0x28, 0x04, 0xdb, 0xf3, 0x20, 0xb8, 0x1c, 0x21, + 0xf0, 0x1b, 0xf9, 0x30, 0x1d, 0xfc, 0x34, 0x19, + 0x73, 0x20, 0x72, 0x2e, 0x78, 0xb8, 0x23, 0x01, + 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0xf0, 0x0d, + 0xfd, 0x63, 0x22, 0x00, 0xb4, 0x04, 0x78, 0xb8, + 0x23, 0x05, 0x22, 0x02, 0x99, 0x02, 0xf0, 0x0d, + 0xfb, 0x97, 0x22, 0x04, 0x7b, 0x21, 0xb0, 0x01, + 0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85, + 0x6a, 0xbb, 0xf0, 0x0d, 0xfd, 0xdf, 0x1c, 0x30, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x45, 0x18, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x4a, 0x20, 0x2e, 0x08, 0x46, 0x98, + 0xb5, 0xf0, 0xb0, 0x82, 0x46, 0x68, 0xf0, 0x0e, + 0xfb, 0x73, 0x21, 0x00, 0x4f, 0x24, 0x4b, 0x25, + 0x93, 0x01, 0x4a, 0x25, 0x00, 0x48, 0x18, 0x40, + 0x01, 0x00, 0x19, 0xc0, 0x78, 0x84, 0x9d, 0x00, + 0x40, 0xe5, 0x07, 0xeb, 0x0f, 0xdb, 0x2b, 0x01, + 0xd1, 0x31, 0x6a, 0x83, 0x7a, 0x1c, 0x2c, 0xa4, + 0xd0, 0x01, 0x2c, 0xa5, 0xd1, 0x2b, 0x1d, 0xc4, + 0x34, 0x19, 0xe0, 0x0e, 0x79, 0x05, 0x73, 0x65, + 0x88, 0xde, 0x79, 0x05, 0x00, 0xed, 0x18, 0x2d, + 0x81, 0xae, 0x79, 0x05, 0x35, 0x01, 0x07, 0xad, + 0x0f, 0xad, 0x71, 0x05, 0x78, 0x15, 0x35, 0x01, + 0x70, 0x15, 0x7a, 0x9d, 0x7b, 0x66, 0x42, 0xb5, + 0xd0, 0x02, 0x79, 0x45, 0x2d, 0x00, 0xd0, 0xe9, + 0x7a, 0x1b, 0x2b, 0xa5, 0xd1, 0x0f, 0x79, 0x43, + 0x07, 0xdc, 0x0f, 0xe4, 0x2c, 0x01, 0xd0, 0x0a, + 0x1c, 0x1c, 0x23, 0x01, 0x43, 0x23, 0x71, 0x43, + 0x88, 0x00, 0x00, 0x80, 0x9b, 0x01, 0x18, 0xc0, + 0x68, 0x03, 0x33, 0x01, 0x60, 0x03, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0x29, 0x08, 0xdb, 0xbd, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x45, 0x18, 0x2e, 0x08, 0x46, 0x98, + 0x2e, 0x08, 0x03, 0xbc, 0xb5, 0xf0, 0x04, 0x05, + 0x0c, 0x2d, 0x20, 0x00, 0x4c, 0x31, 0x00, 0x42, + 0x18, 0x12, 0x01, 0x12, 0x5a, 0xa2, 0x42, 0xaa, + 0xd1, 0x01, 0x1c, 0x01, 0xe0, 0x04, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf2, + 0x28, 0x08, 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x48, + 0x18, 0x40, 0x01, 0x00, 0x19, 0x07, 0x78, 0xb8, + 0x49, 0x25, 0xf0, 0x0d, 0xfd, 0xab, 0x79, 0x78, + 0x23, 0x02, 0x43, 0x18, 0x71, 0x78, 0x78, 0xbe, + 0x20, 0xff, 0x70, 0xb8, 0x21, 0x00, 0x1d, 0xf8, + 0x30, 0x19, 0x73, 0x01, 0x21, 0x06, 0x73, 0x41, + 0x78, 0xf8, 0x79, 0x39, 0x42, 0x88, 0xd1, 0x11, + 0x79, 0x78, 0x07, 0xc0, 0x0f, 0xc0, 0x28, 0x01, + 0xd0, 0x0c, 0x20, 0x00, 0x70, 0xf8, 0x71, 0x38, + 0x71, 0x78, 0x48, 0x17, 0x80, 0x38, 0x6a, 0xb8, + 0x68, 0x00, 0xf0, 0x02, 0xfc, 0xff, 0x6a, 0xb8, + 0xf0, 0x02, 0xfc, 0xfc, 0x4f, 0x12, 0x00, 0x68, + 0x49, 0x12, 0x52, 0x0f, 0x00, 0x71, 0x4a, 0x12, + 0x52, 0x57, 0x21, 0x00, 0x4a, 0x11, 0x52, 0x11, + 0x1c, 0x30, 0x1c, 0x29, 0xf0, 0x02, 0xff, 0xfa, + 0x20, 0x00, 0x00, 0x41, 0x18, 0x09, 0x01, 0x09, + 0x5a, 0x61, 0x42, 0xb9, 0xd1, 0x04, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf4, + 0x28, 0x08, 0xd1, 0x03, 0x21, 0x00, 0x48, 0x08, + 0x71, 0x01, 0x70, 0x01, 0x20, 0x00, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x45, 0x18, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0xe0, + 0x2e, 0x08, 0x49, 0xa8, 0x2e, 0x08, 0x4a, 0x20, + 0x2e, 0x08, 0x03, 0xbc, 0xb5, 0x80, 0x1c, 0x07, + 0x30, 0x28, 0xf0, 0x02, 0xfc, 0xa5, 0x49, 0x07, + 0x64, 0x88, 0x65, 0x08, 0x65, 0x48, 0x19, 0xc0, + 0x64, 0xc8, 0x20, 0x00, 0x64, 0x08, 0x64, 0x4f, + 0x49, 0x03, 0x84, 0x08, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc4, + 0x2c, 0x00, 0x01, 0x00, 0xb5, 0x80, 0x1c, 0x07, + 0x30, 0x28, 0xf0, 0x02, 0xfc, 0x8d, 0x49, 0x06, + 0x66, 0x08, 0x66, 0x88, 0x66, 0xc8, 0x19, 0xc0, + 0x66, 0x48, 0x20, 0x00, 0x65, 0x88, 0x65, 0xcf, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x03, 0xc4, 0xb4, 0x80, 0x04, 0x09, + 0x0c, 0x09, 0x88, 0x02, 0x42, 0x8a, 0xd0, 0x18, + 0x4a, 0x0d, 0x8f, 0x13, 0x2b, 0x01, 0xd0, 0x04, + 0x23, 0x01, 0x87, 0x13, 0x8f, 0x17, 0x2f, 0x01, + 0xd1, 0xfb, 0x88, 0x03, 0x42, 0x8b, 0xd0, 0x03, + 0x80, 0x01, 0x88, 0x03, 0x42, 0x8b, 0xd1, 0xfb, + 0x8f, 0x11, 0x1c, 0x10, 0x29, 0x00, 0xd0, 0x04, + 0x21, 0x00, 0x87, 0x01, 0x8f, 0x02, 0x2a, 0x00, + 0xd1, 0xfb, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0x80, 0x48, 0x27, + 0x8f, 0x40, 0x28, 0x00, 0xd1, 0x47, 0x4f, 0x26, + 0x88, 0x38, 0x12, 0x00, 0x4a, 0x25, 0x28, 0x06, + 0xd0, 0x21, 0xdc, 0x08, 0x28, 0x06, 0xd2, 0x36, + 0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, + 0x3a, 0x09, 0x09, 0x15, 0x32, 0x09, 0x28, 0x0a, + 0xd0, 0x1b, 0xdc, 0x08, 0x28, 0x07, 0xd0, 0x15, + 0x28, 0x09, 0xd1, 0x28, 0x88, 0x79, 0x88, 0x38, + 0xf0, 0x00, 0xf8, 0xd4, 0xe0, 0x27, 0x28, 0x0b, + 0xd0, 0x1c, 0x28, 0x80, 0xd1, 0x1f, 0xf0, 0x00, + 0xf9, 0x25, 0xe0, 0x20, 0x88, 0x79, 0x88, 0x38, + 0xf0, 0x00, 0xf8, 0x2c, 0xe0, 0x1b, 0xf0, 0x00, + 0xf9, 0x75, 0xe0, 0x18, 0xf0, 0x00, 0xf9, 0xe0, + 0xe0, 0x15, 0x88, 0x38, 0xb0, 0x84, 0xab, 0x00, + 0x80, 0x18, 0x88, 0x78, 0x70, 0x98, 0x92, 0x01, + 0x46, 0x69, 0x20, 0x75, 0xf0, 0x08, 0xf8, 0x04, + 0xb0, 0x04, 0xe0, 0x08, 0x88, 0x79, 0x88, 0x38, + 0xf0, 0x00, 0xfc, 0x50, 0xe0, 0x03, 0x48, 0x08, + 0x8e, 0x81, 0x31, 0x01, 0x86, 0x81, 0x21, 0x00, + 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x8f, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, + 0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x01, 0x00, + 0x2e, 0x08, 0x04, 0x04, 0xb5, 0xf0, 0x04, 0x04, + 0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x17, + 0xf0, 0x20, 0xfb, 0x5e, 0x2d, 0x10, 0xdd, 0x03, + 0x20, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x68, 0x10, 0x40, 0x00, 0x40, 0x04, 0x01, + 0x0c, 0x09, 0x1c, 0x88, 0x00, 0x40, 0x1d, 0x02, + 0x48, 0x1b, 0x6c, 0x03, 0x18, 0x9d, 0x6c, 0x46, + 0x4b, 0x1a, 0x42, 0xb5, 0xdd, 0x08, 0x88, 0x19, + 0x1c, 0x18, 0x23, 0x20, 0x43, 0x19, 0x80, 0x01, + 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x64, 0x05, 0x35, 0x28, 0x42, 0xb5, 0xdd, 0x04, + 0x88, 0x1e, 0x1c, 0x1d, 0x23, 0x10, 0x43, 0x33, + 0x80, 0x2b, 0x6d, 0x03, 0x80, 0x9c, 0x6d, 0x04, + 0x80, 0xe2, 0x23, 0x00, 0x29, 0x00, 0xdd, 0x08, + 0x88, 0x3d, 0x00, 0x5c, 0x6d, 0x06, 0x19, 0xa4, + 0x81, 0x25, 0x33, 0x01, 0x37, 0x02, 0x42, 0x8b, + 0xdb, 0xf6, 0x6d, 0x01, 0x18, 0x8a, 0x6c, 0xc3, + 0x42, 0x9a, 0xd9, 0x00, 0x6c, 0x82, 0x60, 0x0a, + 0x65, 0x02, 0xf0, 0x20, 0xfb, 0x53, 0x20, 0x00, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x03, 0xc4, 0x2c, 0x00, 0x00, 0xf8, + 0xb4, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x08, + 0x0c, 0x00, 0x28, 0x10, 0xdd, 0x02, 0x20, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x30, 0x01, 0x4f, 0x1c, + 0x40, 0x07, 0x1c, 0xb8, 0x00, 0x40, 0x1d, 0x01, + 0x48, 0x1a, 0x6d, 0x83, 0x18, 0x5d, 0x6d, 0xc6, + 0x4b, 0x19, 0x42, 0xb5, 0xdd, 0x07, 0x88, 0x19, + 0x1c, 0x18, 0x23, 0x02, 0x43, 0x19, 0x80, 0x01, + 0x20, 0x01, 0xbc, 0xf0, 0x47, 0x70, 0x65, 0x85, + 0x35, 0x28, 0x42, 0xb5, 0xdd, 0x04, 0x88, 0x1e, + 0x1c, 0x1d, 0x23, 0x01, 0x43, 0x33, 0x80, 0x2b, + 0x6e, 0x83, 0x80, 0x9c, 0x6e, 0x84, 0x80, 0xe1, + 0x23, 0x00, 0x2f, 0x00, 0xdd, 0x08, 0x88, 0x15, + 0x00, 0x5c, 0x6e, 0x86, 0x19, 0xa4, 0x81, 0x25, + 0x32, 0x02, 0x33, 0x01, 0x42, 0xbb, 0xdb, 0xf6, + 0x6e, 0x82, 0x18, 0x51, 0x6e, 0x43, 0x42, 0x99, + 0xd3, 0x00, 0x6e, 0x01, 0x60, 0x11, 0x66, 0x81, + 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xfe, 0x2e, 0x08, 0x03, 0xc4, + 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0xb0, 0x04, 0x04, + 0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x17, + 0xf0, 0x20, 0xfa, 0xc2, 0x1c, 0x20, 0x1c, 0x29, + 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xa9, 0x1c, 0x07, + 0xf0, 0x20, 0xfa, 0xf0, 0x1c, 0x38, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0xb4, 0xf0, 0x04, 0x04, + 0x0c, 0x24, 0x04, 0x09, 0x0c, 0x09, 0x29, 0x08, + 0xdd, 0x02, 0x20, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x00, 0x88, 0x1d, 0xc7, 0x37, 0x01, 0x48, 0x19, + 0x6d, 0x83, 0x19, 0xdd, 0x6d, 0xc6, 0x4b, 0x18, + 0x42, 0xb5, 0xdd, 0x07, 0x88, 0x19, 0x1c, 0x18, + 0x23, 0x02, 0x43, 0x19, 0x80, 0x01, 0x20, 0x01, + 0xbc, 0xf0, 0x47, 0x70, 0x65, 0x85, 0x35, 0x28, + 0x42, 0xb5, 0xdd, 0x04, 0x88, 0x1e, 0x1c, 0x1d, + 0x23, 0x01, 0x43, 0x33, 0x80, 0x2b, 0x6e, 0x83, + 0x80, 0x9c, 0x6e, 0x84, 0x80, 0xe7, 0x23, 0x00, + 0x6e, 0x84, 0x29, 0x00, 0xdd, 0x06, 0xca, 0x40, + 0x00, 0x9d, 0x19, 0x2d, 0x60, 0xae, 0x33, 0x01, + 0x42, 0x8b, 0xdb, 0xf8, 0x6e, 0x81, 0x19, 0xca, + 0x6e, 0x43, 0x42, 0x9a, 0xd3, 0x00, 0x6e, 0x02, + 0x60, 0x0a, 0x66, 0x82, 0x20, 0x00, 0xbc, 0xf0, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc4, + 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x80, 0x48, 0x28, + 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x27, + 0x28, 0x01, 0xd0, 0x13, 0x28, 0x02, 0xd0, 0x1a, + 0x28, 0x03, 0xd1, 0x0c, 0x68, 0x38, 0x88, 0x41, + 0x29, 0x0e, 0xdb, 0x02, 0x88, 0x41, 0x29, 0x0f, + 0xdd, 0x2f, 0x88, 0x01, 0x04, 0x09, 0x88, 0x40, + 0x43, 0x08, 0xf0, 0x10, 0xfd, 0x0f, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x68, 0x38, 0x88, 0x82, + 0x88, 0x41, 0x88, 0x00, 0xf0, 0x13, 0xfb, 0xee, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x38, + 0x88, 0x81, 0x04, 0x09, 0x88, 0xc2, 0x43, 0x11, + 0x88, 0x02, 0x04, 0x12, 0x88, 0x40, 0x43, 0x10, + 0xf0, 0x13, 0xf8, 0x92, 0x68, 0x38, 0x88, 0x41, + 0x29, 0x0e, 0xd1, 0x08, 0x88, 0x81, 0x04, 0x09, + 0x88, 0xc0, 0x43, 0x08, 0xf0, 0x10, 0xfb, 0x8c, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, + 0xf0, 0x10, 0xfb, 0x86, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x88, 0x41, 0x48, 0x08, 0x29, 0x0e, + 0xd1, 0x02, 0x21, 0x00, 0x60, 0x01, 0xe0, 0x01, + 0x21, 0x01, 0x60, 0x01, 0x68, 0x00, 0xf0, 0x00, + 0xfb, 0xb7, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2c, 0x00, 0x00, 0xfc, 0x2e, 0x08, 0x03, 0xc4, + 0x2e, 0x08, 0x04, 0xf8, 0xb5, 0x90, 0x48, 0x31, + 0x88, 0x00, 0x06, 0x04, 0x0e, 0x24, 0x48, 0x30, + 0x22, 0x03, 0x21, 0x02, 0x4f, 0x2f, 0x2c, 0x08, + 0xd2, 0x4f, 0xa3, 0x02, 0x5d, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x4b, 0x10, 0x16, + 0x1c, 0x28, 0x34, 0x3f, 0x68, 0x39, 0x88, 0x49, + 0x06, 0x09, 0x0e, 0x09, 0x88, 0x00, 0x06, 0x00, + 0x0e, 0x00, 0xf0, 0x03, 0xfa, 0x8d, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x03, 0xf7, 0xfe, + 0xf8, 0x9f, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x02, 0xf7, 0xfe, 0xf8, 0x99, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x88, 0x00, 0x4b, 0x1e, + 0x28, 0x00, 0xd0, 0x03, 0x60, 0x1a, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x60, 0x19, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x88, 0x00, 0x4b, 0x19, + 0x28, 0x00, 0xd0, 0x03, 0x60, 0x1a, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x60, 0x19, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x02, 0xfe, 0x4c, + 0x68, 0x39, 0x88, 0x4a, 0x1d, 0x08, 0x88, 0x09, + 0xf7, 0xfe, 0xf9, 0x10, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0x38, 0x88, 0x81, 0x04, 0x09, + 0x88, 0xc2, 0x18, 0x8a, 0x88, 0x01, 0x04, 0x09, + 0x88, 0x40, 0x50, 0x0a, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x1d, 0xf8, 0x30, 0x39, 0x8e, 0x81, + 0x31, 0x01, 0x86, 0x81, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x00, 0xfc, + 0x2c, 0x00, 0x01, 0x00, 0x2e, 0x08, 0x03, 0xc4, + 0x6e, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x12, 0x00, + 0xb5, 0x90, 0xb0, 0x84, 0x48, 0x73, 0x88, 0x00, + 0x06, 0x00, 0x0e, 0x00, 0x4c, 0x72, 0x4f, 0x73, + 0x28, 0x0a, 0xd2, 0x60, 0xa3, 0x01, 0x5c, 0x1b, + 0x00, 0x5b, 0x44, 0x9f, 0x04, 0x0e, 0x16, 0x39, + 0x5d, 0x85, 0x8f, 0xb6, 0xbe, 0xcc, 0xf0, 0x10, + 0xfe, 0xc7, 0x90, 0x03, 0x14, 0x00, 0x68, 0x39, + 0x80, 0x08, 0x98, 0x03, 0x68, 0x39, 0x80, 0x48, + 0xe0, 0xc7, 0x20, 0x1e, 0xa9, 0x03, 0xf0, 0x10, + 0xfd, 0xc9, 0x98, 0x03, 0x68, 0x39, 0x80, 0x08, + 0xe0, 0xbf, 0x1c, 0x20, 0xf0, 0x13, 0xf9, 0xc0, + 0x20, 0x00, 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, + 0x68, 0x3b, 0x52, 0x99, 0x30, 0x01, 0x28, 0x04, + 0xdd, 0xf7, 0x20, 0x07, 0x00, 0x81, 0x58, 0x61, + 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, + 0x87, 0x91, 0x30, 0x01, 0x28, 0x0b, 0xdd, 0xf5, + 0x20, 0x0d, 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, + 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, 0x87, 0x51, + 0x30, 0x01, 0x28, 0x12, 0xdd, 0xf5, 0xe0, 0x9c, + 0x20, 0x13, 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, + 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, 0x83, 0x51, + 0x30, 0x01, 0x28, 0x15, 0xdd, 0xf5, 0x20, 0x00, + 0x00, 0x81, 0x19, 0x09, 0x6d, 0x89, 0x00, 0x42, + 0x68, 0x3b, 0x18, 0xd2, 0x80, 0xd1, 0x30, 0x01, + 0x28, 0x0a, 0xdd, 0xf5, 0x20, 0x00, 0x00, 0x81, + 0x19, 0x09, 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, + 0x68, 0x3b, 0x18, 0xd2, 0x83, 0x91, 0x30, 0x01, + 0x28, 0x01, 0xdd, 0xf4, 0xe0, 0x79, 0xe0, 0x73, + 0x20, 0x02, 0x00, 0x81, 0x19, 0x09, 0x31, 0x80, + 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, + 0x3a, 0x40, 0x87, 0x91, 0x30, 0x01, 0x28, 0x05, + 0xdd, 0xf3, 0x20, 0x09, 0x00, 0x81, 0x19, 0x09, + 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, + 0x18, 0xd2, 0x3a, 0x40, 0x86, 0xd1, 0x30, 0x01, + 0x28, 0x0f, 0xdd, 0xf3, 0x20, 0x11, 0x00, 0x81, + 0x19, 0x09, 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, + 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, 0x86, 0x91, + 0x30, 0x01, 0x28, 0x13, 0xdd, 0xf3, 0xe0, 0x50, + 0x22, 0x00, 0x21, 0x00, 0x20, 0x01, 0x02, 0xc0, + 0xf7, 0xff, 0xfe, 0x48, 0x6f, 0xb8, 0x49, 0x2a, + 0x80, 0x08, 0xe0, 0x46, 0x46, 0x68, 0xf0, 0x15, + 0xff, 0xa7, 0x98, 0x00, 0x0c, 0x00, 0x68, 0x39, + 0x80, 0x08, 0x98, 0x00, 0x68, 0x39, 0x80, 0x48, + 0x98, 0x01, 0x0c, 0x00, 0x68, 0x39, 0x80, 0x88, + 0x98, 0x01, 0x68, 0x39, 0x80, 0xc8, 0x98, 0x02, + 0x0c, 0x00, 0x68, 0x39, 0x81, 0x08, 0x98, 0x02, + 0x68, 0x39, 0x81, 0x48, 0x20, 0x01, 0x68, 0x39, + 0x81, 0x88, 0x48, 0x1c, 0x68, 0x39, 0x81, 0xc8, + 0x48, 0x1b, 0x68, 0x01, 0x14, 0x09, 0x68, 0x3a, + 0x82, 0x11, 0x68, 0x00, 0x68, 0x39, 0x82, 0x48, + 0xe0, 0x1f, 0x20, 0x19, 0x06, 0x80, 0x6b, 0x80, + 0x06, 0x00, 0x0e, 0x00, 0x68, 0x39, 0x80, 0x08, + 0xe0, 0x17, 0x68, 0x38, 0x88, 0x01, 0x04, 0x09, + 0x88, 0x40, 0x18, 0x08, 0x68, 0x00, 0x90, 0x03, + 0x14, 0x00, 0x68, 0x39, 0x80, 0x08, 0x98, 0x03, + 0x68, 0x39, 0x80, 0x48, 0xe0, 0x09, 0x48, 0x0d, + 0x68, 0x00, 0x68, 0x39, 0x80, 0x08, 0xe0, 0x04, + 0x1d, 0xf8, 0x30, 0x39, 0x8e, 0x81, 0x31, 0x01, + 0x86, 0x81, 0xb0, 0x04, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x00, 0xfc, + 0x2e, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x03, 0xc4, + 0x2c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x25, 0x02, + 0x2e, 0x08, 0x05, 0x74, 0x2e, 0x08, 0x00, 0x58, + 0xb5, 0x80, 0x4f, 0x53, 0x6d, 0x78, 0x6d, 0x39, + 0x42, 0x81, 0xd0, 0x59, 0x88, 0x81, 0x06, 0x09, + 0x0e, 0x09, 0x29, 0x12, 0xd2, 0x55, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x09, 0x10, 0x1a, 0x14, 0x20, 0x52, 0x24, 0x2f, + 0x3a, 0x45, 0x56, 0x60, 0x67, 0x6c, 0x70, 0x74, + 0x7a, 0x81, 0x89, 0xc3, 0x89, 0x82, 0x89, 0x41, + 0x89, 0x00, 0xf0, 0x0b, 0xfe, 0x91, 0xe0, 0x72, + 0x89, 0x00, 0xf0, 0x0b, 0xfe, 0x75, 0xe0, 0x6e, + 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x0b, + 0xff, 0x4f, 0xe0, 0x68, 0x89, 0x82, 0x89, 0x41, + 0x89, 0x00, 0xf0, 0x0b, 0xfe, 0xf7, 0xe0, 0x62, + 0x89, 0x00, 0xf0, 0x0b, 0xff, 0x8d, 0xe0, 0x5e, + 0x8a, 0x42, 0x8a, 0x01, 0xb4, 0x06, 0x89, 0xc3, + 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x0c, + 0xf8, 0x11, 0xb0, 0x02, 0xe0, 0x53, 0x8a, 0x42, + 0x8a, 0x01, 0xb4, 0x06, 0x89, 0xc3, 0x89, 0x82, + 0x89, 0x41, 0x89, 0x00, 0xf0, 0x0c, 0xf8, 0x58, + 0xb0, 0x02, 0xe0, 0x48, 0x89, 0x83, 0x89, 0x42, + 0x89, 0x00, 0x49, 0x2e, 0xf0, 0x0c, 0xf9, 0x99, + 0x21, 0x00, 0x48, 0x2c, 0xf7, 0xff, 0xfc, 0x7e, + 0xe0, 0x3d, 0x89, 0xc1, 0x04, 0x0b, 0x14, 0x1b, + 0x89, 0x81, 0x04, 0x0a, 0x14, 0x12, 0x89, 0x41, + 0x89, 0x00, 0xf0, 0x0c, 0xf9, 0xb9, 0xe0, 0x32, + 0xe0, 0x43, 0xe0, 0x30, 0x89, 0x00, 0xf0, 0x0b, + 0xff, 0x6b, 0xe0, 0x2c, 0x89, 0xc1, 0x04, 0x09, + 0x8a, 0x02, 0x18, 0x8b, 0x89, 0x82, 0x89, 0x41, + 0x89, 0x00, 0xf0, 0x0c, 0xf9, 0xf1, 0xe0, 0x22, + 0x89, 0xc3, 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, + 0xf0, 0x0c, 0xfa, 0x1c, 0xe0, 0x1b, 0x89, 0x41, + 0x89, 0x00, 0xf0, 0x0b, 0xff, 0x8d, 0xe0, 0x16, + 0x89, 0x00, 0xf0, 0x0b, 0xff, 0xa7, 0xe0, 0x12, + 0x89, 0x00, 0xf0, 0x0b, 0xff, 0xb7, 0xe0, 0x0e, + 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x0c, + 0xfa, 0x9b, 0xe0, 0x08, 0x89, 0xc3, 0x89, 0x82, + 0x89, 0x41, 0x89, 0x00, 0xf0, 0x0c, 0xfb, 0x34, + 0xe0, 0x01, 0xf0, 0x0c, 0xfb, 0xcb, 0x6d, 0x78, + 0x88, 0xc0, 0x6c, 0x39, 0x1a, 0x08, 0x64, 0x38, + 0x6c, 0x79, 0x1a, 0x08, 0x28, 0x28, 0xdb, 0x05, + 0x48, 0x07, 0x88, 0x01, 0x23, 0x10, 0x43, 0xdb, + 0x40, 0x19, 0x80, 0x01, 0x6d, 0x78, 0x68, 0x00, + 0x65, 0x78, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x03, 0xc4, 0x2c, 0x00, 0x01, 0x20, + 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x80, 0x06, 0x00, + 0x0e, 0x00, 0x06, 0x09, 0x0e, 0x09, 0x89, 0xd7, + 0x23, 0xc7, 0x40, 0x7b, 0x81, 0xd3, 0x4b, 0x06, + 0x6f, 0xdf, 0x37, 0x01, 0x67, 0xdf, 0x2f, 0x28, + 0xda, 0x03, 0x4b, 0x04, 0x68, 0x1b, 0xf0, 0x1a, + 0xfb, 0xf5, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x03, 0xc4, 0x2e, 0x08, 0x01, 0x94, + 0xb5, 0x90, 0x4f, 0x5d, 0x6e, 0xf8, 0x6e, 0xb9, + 0x42, 0x81, 0xd0, 0x5c, 0x88, 0x81, 0x0a, 0x0a, + 0x2a, 0x0a, 0xd2, 0x59, 0xa3, 0x01, 0x5c, 0x9b, + 0x00, 0x5b, 0x44, 0x9f, 0x99, 0x04, 0x3e, 0x99, + 0x99, 0x44, 0x99, 0x99, 0x6c, 0x72, 0x06, 0x09, + 0x0e, 0x09, 0x24, 0x00, 0x29, 0x0c, 0xd2, 0x4b, + 0xa3, 0x01, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, + 0x1e, 0x0a, 0x14, 0x2b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x28, 0x8b, 0x05, 0x68, 0x38, 0x88, 0x00, + 0xf0, 0x03, 0xf8, 0xde, 0xe0, 0x80, 0x22, 0x00, + 0xb4, 0x04, 0x89, 0x01, 0x1c, 0x23, 0x4a, 0x49, + 0x1e, 0x50, 0xf7, 0xfc, 0xfd, 0xe9, 0xb0, 0x01, + 0xe0, 0x76, 0x22, 0x00, 0xb4, 0x04, 0x89, 0x02, + 0x1c, 0x23, 0x49, 0x44, 0x1e, 0x48, 0xf7, 0xfc, + 0xfd, 0xdf, 0xb0, 0x01, 0xe0, 0x6c, 0x8a, 0x02, + 0xb4, 0x04, 0x89, 0xc3, 0x89, 0x82, 0x89, 0x41, + 0x89, 0x00, 0xf7, 0xfc, 0xfd, 0xd5, 0xb0, 0x01, + 0xe0, 0x62, 0xf7, 0xfc, 0xfd, 0x9d, 0xe0, 0x5f, + 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0xea, + 0xe0, 0x5a, 0x06, 0x09, 0xd1, 0x58, 0x89, 0x00, + 0xf7, 0xfc, 0xff, 0x76, 0xe0, 0x54, 0x06, 0x09, + 0x0e, 0x09, 0x29, 0x06, 0xd2, 0x0c, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x03, 0x09, 0x0d, 0x11, 0x15, 0x19, 0x89, 0x00, + 0xf7, 0xfe, 0xf8, 0xaa, 0xe0, 0x44, 0xe0, 0x54, + 0xe0, 0x42, 0x89, 0x00, 0xf7, 0xfe, 0xf8, 0xca, + 0xe0, 0x3e, 0x89, 0x00, 0xf7, 0xfe, 0xf9, 0x58, + 0xe0, 0x3a, 0x89, 0x00, 0xf7, 0xfe, 0xfa, 0x3c, + 0xe0, 0x36, 0x89, 0x00, 0xf7, 0xfe, 0xfa, 0x6e, + 0xe0, 0x32, 0x89, 0x00, 0x06, 0x00, 0x0e, 0x00, + 0xf7, 0xfe, 0xfa, 0x4a, 0xe0, 0x2c, 0x06, 0x08, + 0xd1, 0x2a, 0x6f, 0xb8, 0x30, 0x01, 0x67, 0xb8, + 0xe0, 0x26, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x08, + 0xd2, 0x22, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x0c, 0x08, 0x0f, + 0x12, 0x16, 0x19, 0x1c, 0x89, 0x00, 0xf0, 0x01, + 0xf9, 0x93, 0xe0, 0x15, 0x89, 0x00, 0xf0, 0x01, + 0xf9, 0xbb, 0xe0, 0x11, 0xf0, 0x01, 0xfa, 0x06, + 0xe0, 0x0e, 0xf0, 0x01, 0xfa, 0x5d, 0xe0, 0x0b, + 0x89, 0x00, 0xf0, 0x01, 0xfa, 0xe1, 0xe0, 0x07, + 0xf0, 0x01, 0xfb, 0x1a, 0xe0, 0x04, 0xf0, 0x01, + 0xfb, 0x33, 0xe0, 0x01, 0xf0, 0x01, 0xfa, 0x90, + 0x6e, 0xf8, 0x88, 0xc0, 0x6d, 0xb9, 0x1a, 0x08, + 0x65, 0xb8, 0x6d, 0xf9, 0x1a, 0x08, 0x28, 0x28, + 0xdb, 0x04, 0x48, 0x07, 0x88, 0x01, 0x08, 0x49, + 0x00, 0x49, 0x80, 0x01, 0x6e, 0xf8, 0x68, 0x00, + 0x66, 0xf8, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x03, 0xc4, 0x00, 0x00, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x80, 0x06, 0x00, + 0x0e, 0x00, 0x1c, 0x17, 0x28, 0x03, 0xd0, 0x0b, + 0x28, 0x07, 0xd0, 0x0e, 0x28, 0x08, 0xd1, 0x03, + 0x88, 0x38, 0xf0, 0x02, 0xfa, 0x5d, 0x80, 0x78, + 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0x5e, + 0xe7, 0xf6, 0x88, 0x79, 0x88, 0x38, 0x1d, 0x3a, + 0xf0, 0x02, 0xf8, 0xce, 0x49, 0x01, 0x68, 0x09, + 0x80, 0x08, 0xe7, 0xed, 0x2e, 0x08, 0x03, 0xc4, + 0x48, 0x0d, 0x6f, 0xc0, 0x28, 0x00, 0xd1, 0x0c, + 0x49, 0x0c, 0x60, 0x08, 0x48, 0x0c, 0x8e, 0x83, + 0x49, 0x0c, 0x22, 0x01, 0x2b, 0x00, 0xd0, 0x05, + 0x8d, 0x03, 0x86, 0x8b, 0x8d, 0x43, 0x86, 0xcb, + 0x87, 0x82, 0x47, 0x70, 0x8e, 0xc3, 0x2b, 0x00, + 0xd0, 0xfb, 0x8d, 0x83, 0x86, 0x8b, 0x8d, 0xc3, + 0x86, 0xcb, 0x87, 0x82, 0x47, 0x70, 0x00, 0x00, + 0x2c, 0x00, 0x1f, 0x80, 0x2e, 0x08, 0x04, 0x44, + 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xc0, + 0xb5, 0x00, 0xf0, 0x00, 0xfa, 0x91, 0xf7, 0xfd, + 0xf9, 0x53, 0xf7, 0xfc, 0xff, 0xd7, 0xf7, 0xfd, + 0xfa, 0x53, 0xf0, 0x03, 0xf8, 0xb1, 0xf7, 0xff, + 0xff, 0xcf, 0x48, 0x16, 0x8e, 0x80, 0x28, 0x00, + 0xd1, 0x21, 0x48, 0x15, 0x6f, 0xc0, 0x28, 0x00, + 0xd1, 0x13, 0x48, 0x14, 0x78, 0x00, 0x28, 0x00, + 0xd0, 0x0f, 0xb0, 0x82, 0x46, 0x69, 0xa8, 0x01, + 0xf0, 0x01, 0xfa, 0xd8, 0xa8, 0x01, 0x78, 0x00, + 0x28, 0x32, 0xda, 0x05, 0xa8, 0x00, 0x78, 0x00, + 0x28, 0x32, 0xda, 0x01, 0xf0, 0x07, 0xf9, 0xb0, + 0xb0, 0x02, 0x48, 0x0b, 0x69, 0xc0, 0x08, 0xc0, + 0xd3, 0x07, 0x48, 0x0a, 0x6c, 0x00, 0x28, 0x00, + 0xd0, 0x03, 0xf7, 0xff, 0xfd, 0xfd, 0xbc, 0x08, + 0x47, 0x18, 0xf7, 0xff, 0xfe, 0xc1, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, + 0x2c, 0x00, 0x1f, 0x80, 0x2e, 0x08, 0x1a, 0x94, + 0x72, 0x00, 0x01, 0x00, 0x2e, 0x08, 0x03, 0xc4, + 0xb4, 0x80, 0x02, 0x4f, 0x4b, 0x07, 0x40, 0x3b, + 0x43, 0x1a, 0x23, 0x19, 0x06, 0x9b, 0x62, 0x9a, + 0x0a, 0x49, 0x02, 0x49, 0x08, 0x49, 0x07, 0xc0, + 0x43, 0x08, 0x49, 0x03, 0x68, 0x09, 0x60, 0x08, + 0xbc, 0x80, 0x47, 0x70, 0x00, 0x03, 0xfe, 0x00, + 0x2e, 0x08, 0x9b, 0xa4, 0xb4, 0x90, 0x4b, 0x0c, + 0x68, 0x1f, 0x68, 0x3f, 0x0f, 0xff, 0x60, 0x07, + 0x68, 0x18, 0x68, 0x00, 0x00, 0x40, 0x0a, 0x47, + 0x02, 0x7f, 0x20, 0x19, 0x06, 0x80, 0x6a, 0x84, + 0x4b, 0x06, 0x40, 0x23, 0x0a, 0x5b, 0x43, 0x3b, + 0x60, 0x0b, 0x6a, 0x80, 0x05, 0xc0, 0x0d, 0xc0, + 0x60, 0x10, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xa4, 0x00, 0x03, 0xfe, 0x00, + 0xb5, 0x00, 0x49, 0x1d, 0x62, 0xc8, 0x28, 0x00, + 0xd0, 0x11, 0x28, 0x01, 0xd0, 0x1b, 0x28, 0x02, + 0xd0, 0x25, 0x28, 0x03, 0xd1, 0x09, 0x48, 0x19, + 0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, + 0x22, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0x10, + 0xfd, 0x47, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x13, + 0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, + 0x48, 0x11, 0x68, 0x01, 0x04, 0x03, 0x43, 0x19, + 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x0d, + 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, + 0x48, 0x0b, 0x68, 0x01, 0x4b, 0x0b, 0x40, 0x19, + 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x07, + 0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, + 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x10, + 0xfd, 0x23, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0xc8, 0x6a, 0x00, 0x00, 0x18, + 0x6c, 0x00, 0x00, 0x20, 0xff, 0xdf, 0xff, 0xff, + 0xb5, 0x90, 0x48, 0x11, 0x6c, 0xc1, 0x6c, 0x80, + 0x1a, 0x0f, 0x48, 0x10, 0xd5, 0x01, 0x69, 0x01, + 0x18, 0x7f, 0x69, 0x00, 0x10, 0x80, 0x4c, 0x0e, + 0x42, 0xb8, 0xda, 0x0b, 0x68, 0xe0, 0x28, 0x00, + 0xd1, 0x08, 0x48, 0x0c, 0x68, 0x01, 0x23, 0x02, + 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x20, 0x02, + 0xf0, 0x10, 0xf8, 0xc4, 0x2f, 0x00, 0xd1, 0x04, + 0x20, 0x01, 0x61, 0xe0, 0x6b, 0xa0, 0x30, 0x01, + 0x63, 0xa0, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x48, + 0x2e, 0x08, 0x04, 0xc8, 0x6c, 0x00, 0x00, 0x20, + 0xb5, 0x00, 0x20, 0x03, 0xf0, 0x10, 0xf8, 0xae, + 0x20, 0x1e, 0xf0, 0x0d, 0xf8, 0xab, 0x23, 0x03, + 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, + 0x20, 0x1e, 0xf0, 0x0c, 0xfe, 0x59, 0x22, 0x00, + 0xb4, 0x04, 0x23, 0x02, 0x22, 0x02, 0x49, 0x07, + 0x20, 0x1e, 0xf0, 0x0c, 0xfc, 0x8d, 0x23, 0x01, + 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, + 0xb0, 0x01, 0xf0, 0x0c, 0xfe, 0x49, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, + 0xb5, 0x00, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x12, + 0xfc, 0x23, 0x20, 0x1f, 0xf0, 0x0c, 0xff, 0xbc, + 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, + 0x21, 0x02, 0x20, 0x1f, 0xf0, 0x0c, 0xfe, 0x34, + 0x20, 0x00, 0xf0, 0x0f, 0xff, 0x19, 0x22, 0x00, + 0xb4, 0x04, 0x23, 0x01, 0x22, 0x02, 0x49, 0x07, + 0x20, 0x1f, 0xf0, 0x0c, 0xfc, 0x65, 0x23, 0x01, + 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, + 0xb0, 0x01, 0xf0, 0x0c, 0xfe, 0x21, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, + 0xb5, 0x80, 0x20, 0x0f, 0x02, 0x40, 0x4f, 0x0a, + 0x61, 0x38, 0x49, 0x0a, 0x6c, 0x89, 0x61, 0x79, + 0xf0, 0x01, 0xfe, 0x42, 0x1d, 0xf9, 0x31, 0x79, + 0x61, 0x08, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, + 0x61, 0xf8, 0x62, 0x38, 0x64, 0xf8, 0x20, 0xff, + 0x72, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x48, 0x66, 0x00, 0x00, 0x80, + 0xb5, 0x80, 0x4f, 0x05, 0x69, 0x38, 0x28, 0x00, + 0xd0, 0x03, 0xf0, 0x01, 0xfe, 0x4b, 0x20, 0x00, + 0x61, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0xc8, 0xb5, 0x00, 0x4a, 0x0d, + 0xb4, 0x04, 0x1f, 0x10, 0x1e, 0x51, 0x1c, 0x13, + 0xf7, 0xfc, 0xfb, 0xaa, 0x21, 0x33, 0x06, 0x49, + 0x6d, 0x88, 0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01, + 0x48, 0x07, 0x62, 0x42, 0x6d, 0x49, 0x62, 0xc1, + 0x21, 0x00, 0x65, 0x81, 0x21, 0x01, 0x02, 0xc9, + 0x64, 0x41, 0x21, 0x01, 0x30, 0x60, 0x76, 0x01, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x04, 0x48, 0xb5, 0x00, 0x4a, 0x10, + 0xb4, 0x04, 0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0f, + 0x1e, 0xc8, 0xf7, 0xfc, 0xfb, 0x89, 0x21, 0x33, + 0x06, 0x49, 0x6d, 0x88, 0x6d, 0x4a, 0x1a, 0x82, + 0xb0, 0x01, 0x48, 0x0b, 0x62, 0x42, 0x6d, 0x49, + 0x62, 0xc1, 0x21, 0x00, 0x65, 0x81, 0x21, 0x01, + 0x02, 0xc9, 0x64, 0x41, 0x21, 0x01, 0x30, 0x60, + 0x76, 0x01, 0x48, 0x06, 0x23, 0x02, 0x68, 0x01, + 0x43, 0x19, 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, + 0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x00, 0x04, + 0x48, 0x03, 0x23, 0x02, 0x43, 0xdb, 0x68, 0x01, + 0x40, 0x19, 0x60, 0x01, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x00, 0x04, 0xb5, 0xf0, 0x20, 0x0f, + 0x02, 0x40, 0x4c, 0x11, 0x61, 0x20, 0x20, 0x00, + 0xf7, 0xfc, 0xfc, 0xf6, 0x48, 0x0f, 0xf7, 0xfc, + 0xfc, 0xf3, 0x26, 0x00, 0x1d, 0xe0, 0x30, 0x59, + 0x77, 0x06, 0x25, 0xff, 0x1d, 0xe7, 0x37, 0x79, + 0x70, 0x3d, 0x20, 0x01, 0x63, 0x78, 0x60, 0xe6, + 0x69, 0x78, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x41, + 0x01, 0x40, 0xf0, 0x01, 0xfd, 0xb1, 0x61, 0x78, + 0x69, 0x78, 0x28, 0x00, 0xd0, 0x01, 0x76, 0x3e, + 0x70, 0x3d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x48, 0x00, 0x00, 0x1f, 0xff, + 0xb5, 0x00, 0x20, 0x00, 0xf7, 0xfd, 0xff, 0xdc, + 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x06, + 0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfb, 0x28, + 0x21, 0x00, 0x20, 0x0d, 0xb0, 0x01, 0xf0, 0x12, + 0xfb, 0x47, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x22, 0x00, + 0xb4, 0x04, 0x27, 0x00, 0x1c, 0x3b, 0x4a, 0x17, + 0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfb, 0x14, + 0x22, 0x00, 0xb0, 0x01, 0xb4, 0x04, 0x1c, 0x3b, + 0x4a, 0x12, 0x49, 0x13, 0x20, 0x00, 0xf7, 0xfc, + 0xfb, 0x0b, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x88, + 0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01, 0x48, 0x0f, + 0x62, 0x42, 0x6d, 0x49, 0x63, 0x01, 0x21, 0x01, + 0x02, 0xc9, 0x64, 0x81, 0x21, 0x01, 0x65, 0x87, + 0x30, 0x60, 0x76, 0x01, 0x77, 0x07, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x00, 0xf7, 0xff, 0xfe, 0x28, + 0x20, 0x00, 0xf7, 0xff, 0xfe, 0x59, 0x21, 0x00, + 0x20, 0x0d, 0xf0, 0x12, 0xfb, 0x11, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x1f, 0xfe, 0x2e, 0x08, 0x04, 0x48, + 0xb5, 0xf0, 0x06, 0x05, 0x0e, 0x2d, 0x20, 0x0f, + 0x02, 0x40, 0x4f, 0x2f, 0x26, 0x33, 0x06, 0x76, + 0x61, 0x38, 0x6d, 0xb0, 0x6d, 0x71, 0x1a, 0x40, + 0x62, 0x78, 0x62, 0xb8, 0x20, 0x00, 0x1d, 0xfc, + 0x34, 0x79, 0x60, 0xe0, 0x2d, 0x00, 0xd0, 0x02, + 0x20, 0xff, 0xf7, 0xfd, 0xff, 0x79, 0x22, 0x00, + 0xb4, 0x04, 0x23, 0x00, 0x21, 0x00, 0x20, 0x00, + 0xf7, 0xfc, 0xfa, 0xc6, 0x22, 0x01, 0x21, 0x01, + 0x20, 0x00, 0xb0, 0x01, 0xf0, 0x10, 0xfb, 0x84, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x10, 0xfc, 0x44, + 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x1d, + 0x20, 0x00, 0x1e, 0x51, 0xf7, 0xfc, 0xfa, 0xb4, + 0x20, 0x01, 0x63, 0x60, 0x69, 0x60, 0xb0, 0x01, + 0x28, 0x00, 0xd1, 0x04, 0x20, 0x41, 0x01, 0x40, + 0xf0, 0x01, 0xfd, 0x1a, 0x61, 0x60, 0x69, 0x60, + 0x28, 0x00, 0xd0, 0x03, 0x20, 0x00, 0x76, 0x20, + 0x20, 0xff, 0x70, 0x20, 0x6d, 0x70, 0x63, 0x38, + 0x20, 0x01, 0x02, 0xc0, 0x64, 0xb8, 0x20, 0x00, + 0x26, 0x01, 0x65, 0xb8, 0x1d, 0xf9, 0x31, 0x59, + 0x76, 0x0e, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, + 0xf7, 0xff, 0xfd, 0xc6, 0x21, 0x00, 0x20, 0x0d, + 0xf0, 0x12, 0xfa, 0xb2, 0x20, 0x00, 0x60, 0xf8, + 0x2d, 0x00, 0xd1, 0x02, 0xf7, 0xff, 0xfd, 0xf0, + 0x61, 0xe6, 0x20, 0x00, 0x60, 0xb8, 0x66, 0x38, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0x48, 0x00, 0x00, 0x1f, 0xff, + 0xb5, 0xb0, 0x4f, 0x44, 0x25, 0x00, 0x6d, 0x38, + 0x4c, 0x43, 0x28, 0x05, 0xd2, 0x14, 0xa3, 0x02, + 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x10, 0x03, 0x2e, 0x62, 0x70, 0x00, 0x4d, 0x3f, + 0x68, 0x28, 0x08, 0x41, 0xd2, 0x08, 0x08, 0xc0, + 0xd3, 0x09, 0xf7, 0xff, 0xfe, 0xb3, 0x23, 0x04, + 0x43, 0xdb, 0x68, 0x28, 0x40, 0x18, 0x60, 0x28, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x78, + 0x28, 0x00, 0xd0, 0xf9, 0x28, 0x01, 0xd0, 0x01, + 0x28, 0x05, 0xd1, 0x06, 0xf0, 0x00, 0xf8, 0x6a, + 0x8e, 0xa0, 0x28, 0x00, 0xd1, 0xf0, 0xf0, 0x00, + 0xf9, 0x27, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01, + 0x28, 0x05, 0xd1, 0xe9, 0x8e, 0xa0, 0x28, 0x00, + 0xd1, 0xe6, 0xf0, 0x00, 0xfa, 0x49, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, + 0xd1, 0xde, 0x8d, 0xa0, 0x06, 0x00, 0x0e, 0x00, + 0x28, 0x06, 0xd1, 0x12, 0x48, 0x26, 0x78, 0x00, + 0x28, 0x00, 0xd0, 0x06, 0x6d, 0x78, 0x28, 0x01, + 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00, + 0xfc, 0xc3, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01, + 0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0x2c, + 0x85, 0xa5, 0x8d, 0xa0, 0x28, 0x00, 0xd1, 0xc3, + 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x08, 0x28, 0x04, + 0xd0, 0x0b, 0x28, 0x05, 0xd1, 0xbc, 0xf0, 0x00, + 0xfd, 0xdd, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0xf0, 0x00, 0xfd, 0xb2, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0xf0, 0x00, 0xfd, 0x81, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, + 0xd1, 0xaa, 0x20, 0x06, 0x85, 0xa0, 0x85, 0xe5, + 0x20, 0x09, 0x02, 0x40, 0x86, 0xe0, 0x20, 0x04, + 0x65, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x8e, 0xe0, 0x28, 0x00, 0xd1, 0x9c, 0x8d, 0xa0, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x06, 0xd1, 0x97, + 0x85, 0xa5, 0x65, 0x3d, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x48, + 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x00, 0x04, + 0x2e, 0x08, 0x04, 0xc8, 0xb5, 0xb0, 0x48, 0x46, + 0x6c, 0xc1, 0x4c, 0x46, 0x64, 0x21, 0x69, 0x60, + 0x1a, 0x09, 0x1d, 0xe7, 0x37, 0x79, 0x63, 0xf9, + 0x29, 0x00, 0xda, 0x02, 0x69, 0x22, 0x18, 0x89, + 0x63, 0xf9, 0x23, 0xff, 0x6b, 0xf9, 0x33, 0x01, + 0x42, 0x99, 0xdb, 0x73, 0x22, 0x01, 0x03, 0x12, + 0x42, 0x91, 0xdd, 0x00, 0x63, 0xfa, 0x6b, 0xf9, + 0x08, 0x89, 0x00, 0x89, 0x63, 0xf9, 0x7a, 0x3a, + 0x2a, 0x00, 0xd0, 0x05, 0x23, 0xff, 0x03, 0x5b, + 0x1a, 0xc2, 0x61, 0xe2, 0x22, 0x00, 0x72, 0x3a, + 0x18, 0x42, 0x49, 0x35, 0x25, 0x12, 0x42, 0x8a, + 0xdd, 0x2c, 0x1a, 0x08, 0x64, 0x38, 0xf0, 0x1f, + 0xfb, 0x53, 0x4b, 0x32, 0x40, 0x18, 0xf0, 0x1f, + 0xfb, 0x53, 0x22, 0x00, 0x49, 0x30, 0xb4, 0x06, + 0x69, 0x60, 0x69, 0x39, 0x18, 0x41, 0x23, 0xff, + 0x03, 0x5b, 0x1a, 0xc9, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc0, 0x6c, 0x3a, 0x1c, 0x2b, 0xf0, 0x14, + 0xfc, 0x21, 0x22, 0x00, 0xb0, 0x02, 0x49, 0x28, + 0xb4, 0x06, 0x6b, 0xf8, 0x6c, 0x39, 0x1a, 0x42, + 0x69, 0x39, 0x1c, 0x2b, 0x48, 0x25, 0xf0, 0x14, + 0xfc, 0x15, 0xb0, 0x02, 0xf0, 0x1f, 0xfb, 0x30, + 0x23, 0x01, 0x04, 0x9b, 0x43, 0x18, 0xf0, 0x1f, + 0xfb, 0x2f, 0xe0, 0x1d, 0xf0, 0x1f, 0xfb, 0x28, + 0x4b, 0x1c, 0x40, 0x18, 0xf0, 0x1f, 0xfb, 0x28, + 0x22, 0x00, 0x49, 0x1b, 0xb4, 0x06, 0x69, 0x60, + 0x69, 0x39, 0x18, 0x41, 0x23, 0xff, 0x03, 0x5b, + 0x1a, 0xc9, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, + 0x6b, 0xfa, 0x1c, 0x2b, 0xf0, 0x14, 0xfb, 0xf6, + 0xb0, 0x02, 0xf0, 0x1f, 0xfb, 0x11, 0x23, 0x01, + 0x04, 0x9b, 0x43, 0x18, 0xf0, 0x1f, 0xfb, 0x10, + 0x69, 0x60, 0x6b, 0xf9, 0x18, 0x40, 0x23, 0x0d, + 0x06, 0x9b, 0x1a, 0xc1, 0x61, 0x60, 0x4b, 0x0e, + 0x42, 0x99, 0xd3, 0x02, 0x69, 0x21, 0x1a, 0x40, + 0x61, 0x60, 0x23, 0xff, 0x03, 0x5b, 0x69, 0x60, + 0x1a, 0xc0, 0xe0, 0x00, 0xe0, 0x00, 0x62, 0x20, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x48, + 0x00, 0x1f, 0xfe, 0x00, 0xff, 0xfb, 0xff, 0xff, + 0x9e, 0x00, 0x08, 0x00, 0xcc, 0x1f, 0xe0, 0x00, + 0xcc, 0x1f, 0xfe, 0x00, 0x21, 0x00, 0x23, 0xff, + 0x68, 0x02, 0x33, 0xc1, 0x42, 0x9a, 0xd0, 0x01, + 0x1c, 0x08, 0x47, 0x70, 0x79, 0xc2, 0x0a, 0x12, + 0xd2, 0x01, 0x1c, 0x08, 0x47, 0x70, 0x7a, 0x41, + 0x23, 0x0e, 0x40, 0x19, 0x07, 0x49, 0x7a, 0x82, + 0x05, 0x92, 0x43, 0x11, 0x7a, 0xc2, 0x23, 0xfe, + 0x40, 0x1a, 0x03, 0x92, 0x43, 0x11, 0x7b, 0x02, + 0x01, 0xd2, 0x43, 0x11, 0x7b, 0x40, 0x40, 0x18, + 0x08, 0x40, 0x43, 0x08, 0x49, 0x01, 0x67, 0x08, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x48, + 0xb5, 0xf0, 0xb0, 0x86, 0x4c, 0x8c, 0x6c, 0xe0, + 0x1d, 0xe7, 0x37, 0x79, 0x1d, 0xfd, 0x35, 0x39, + 0x28, 0x00, 0xd0, 0x04, 0x28, 0x01, 0xd0, 0x3a, + 0x28, 0x02, 0xd1, 0x73, 0xe0, 0x74, 0x69, 0xe0, + 0x6a, 0x21, 0x1a, 0x09, 0x63, 0xf9, 0x1c, 0x0a, + 0xd5, 0x02, 0x69, 0x21, 0x18, 0x51, 0x63, 0xf9, + 0x6b, 0xf9, 0x29, 0x04, 0xdb, 0x67, 0x69, 0x3e, + 0x5c, 0x31, 0x06, 0x0a, 0x65, 0x7a, 0x92, 0x05, + 0x1c, 0x41, 0x69, 0x20, 0x90, 0x04, 0xf0, 0x19, + 0xfe, 0xe3, 0x61, 0xe1, 0x5c, 0x70, 0x04, 0x00, + 0x9a, 0x05, 0x18, 0x82, 0x65, 0x7a, 0x92, 0x03, + 0x98, 0x04, 0x31, 0x01, 0xf0, 0x19, 0xfe, 0xd8, + 0x61, 0xe1, 0x5c, 0x70, 0x02, 0x00, 0x9a, 0x03, + 0x18, 0x80, 0x65, 0x78, 0x90, 0x02, 0x98, 0x04, + 0x31, 0x01, 0xf0, 0x19, 0xfe, 0xcd, 0x61, 0xe1, + 0x5c, 0x70, 0x9a, 0x02, 0x18, 0x80, 0x65, 0x78, + 0x98, 0x04, 0x31, 0x01, 0xf0, 0x19, 0xfe, 0xc4, + 0x20, 0x01, 0x64, 0xe0, 0x61, 0xe1, 0x6a, 0x20, + 0x69, 0xe1, 0x1a, 0x40, 0x63, 0xf8, 0x1c, 0x01, + 0xd4, 0x05, 0x48, 0x67, 0x69, 0x06, 0x30, 0x80, + 0x69, 0x02, 0x92, 0x01, 0xe0, 0x03, 0x69, 0x20, + 0x18, 0x08, 0x63, 0xf8, 0xe7, 0xf5, 0x6b, 0xf8, + 0x90, 0x00, 0x28, 0x02, 0xdb, 0x22, 0x6d, 0x78, + 0x09, 0x01, 0x01, 0x09, 0x23, 0xff, 0x33, 0xc1, + 0x42, 0x99, 0xd1, 0x31, 0x9a, 0x01, 0x69, 0xe0, + 0x5c, 0x11, 0x02, 0x09, 0x83, 0x29, 0x1c, 0x41, + 0x1c, 0x30, 0xf0, 0x19, 0xfe, 0x9d, 0x61, 0xe1, + 0x69, 0x38, 0x5c, 0x40, 0x8b, 0x2a, 0x18, 0x80, + 0x83, 0x28, 0x8b, 0x28, 0x30, 0x06, 0x83, 0x28, + 0x19, 0x88, 0x1f, 0x41, 0x1c, 0x30, 0xf0, 0x19, + 0xfe, 0x8f, 0x61, 0xe1, 0x21, 0xff, 0x71, 0x39, + 0x20, 0x02, 0x64, 0xe0, 0x6c, 0xe0, 0x28, 0x02, + 0xd1, 0x00, 0xe0, 0x01, 0xe0, 0x94, 0xe0, 0x93, + 0x6a, 0x20, 0x69, 0xe1, 0x1a, 0x40, 0x63, 0xf8, + 0x1c, 0x01, 0xd5, 0x02, 0x69, 0x20, 0x18, 0x08, + 0x63, 0xf8, 0x79, 0x38, 0x28, 0x00, 0xd0, 0x13, + 0x20, 0x01, 0x02, 0xc0, 0x83, 0xa8, 0xe0, 0x11, + 0x02, 0x01, 0x65, 0x79, 0x9a, 0x01, 0x69, 0xe0, + 0x5c, 0x12, 0x18, 0x51, 0x65, 0x79, 0x1c, 0x41, + 0x1c, 0x30, 0xf0, 0x19, 0xfe, 0x69, 0x61, 0xe1, + 0x98, 0x00, 0x38, 0x01, 0x63, 0xf8, 0xe7, 0xb2, + 0x48, 0x3c, 0x83, 0xa8, 0x8b, 0x28, 0x6b, 0xf9, + 0x42, 0x88, 0xda, 0x01, 0x63, 0xf8, 0xe0, 0x02, + 0x8b, 0xa8, 0x42, 0x81, 0xdb, 0x68, 0x8b, 0xa8, + 0x6b, 0xf9, 0x42, 0x81, 0xdd, 0x00, 0x63, 0xf8, + 0x48, 0x35, 0x21, 0x00, 0x66, 0x78, 0x80, 0x01, + 0x30, 0x02, 0x21, 0xff, 0x31, 0xc1, 0x66, 0x78, + 0x80, 0x01, 0x48, 0x32, 0x66, 0x78, 0x79, 0x39, + 0x29, 0x00, 0xd0, 0x21, 0x21, 0x00, 0x71, 0x39, + 0x69, 0x3b, 0x69, 0x20, 0x18, 0x1a, 0xb4, 0x04, + 0x69, 0xe0, 0x18, 0x18, 0x6b, 0xfa, 0x49, 0x2a, + 0xf0, 0x00, 0xfe, 0xec, 0x6b, 0xf8, 0x38, 0x06, + 0x6e, 0x79, 0x80, 0x08, 0x31, 0x02, 0x66, 0x79, + 0xb0, 0x01, 0x48, 0x25, 0xf7, 0xff, 0xff, 0x02, + 0x8b, 0x28, 0x6b, 0xf9, 0x1a, 0x40, 0x83, 0x28, + 0x69, 0xe0, 0x6b, 0xf9, 0x18, 0x41, 0x69, 0x20, + 0xf0, 0x19, 0xfe, 0x26, 0x61, 0xe1, 0xe0, 0x26, + 0x6b, 0xf9, 0x31, 0x03, 0x80, 0x01, 0x48, 0x1e, + 0x21, 0x01, 0x03, 0xc9, 0x66, 0x78, 0x80, 0x01, + 0x30, 0x02, 0x21, 0xff, 0x66, 0x78, 0x80, 0x01, + 0x48, 0x1a, 0x66, 0x78, 0x69, 0x3b, 0x69, 0x20, + 0x18, 0x1a, 0xb4, 0x04, 0x69, 0xe0, 0x18, 0x18, + 0x6b, 0xfa, 0x49, 0x17, 0xf0, 0x00, 0xfe, 0xbe, + 0x8b, 0x28, 0x6b, 0xf9, 0x1a, 0x40, 0x83, 0x28, + 0x69, 0xe0, 0x6b, 0xfe, 0x19, 0x81, 0x69, 0x20, + 0xb0, 0x01, 0xf0, 0x19, 0xfe, 0x01, 0x1d, 0xf0, + 0x30, 0x02, 0x61, 0xe1, 0x63, 0xf8, 0x8b, 0x28, + 0x28, 0x00, 0xd1, 0x01, 0x21, 0x00, 0x64, 0xe0, + 0x21, 0x10, 0x48, 0x0c, 0x85, 0x01, 0x6b, 0xf9, + 0x85, 0x41, 0x21, 0x01, 0x02, 0x49, 0x86, 0x81, + 0xb0, 0x06, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x48, 0x00, 0x00, 0x07, 0xf7, + 0x2c, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x02, 0x04, + 0x2c, 0x00, 0x02, 0x06, 0x2c, 0x00, 0x02, 0x0a, + 0x2c, 0x00, 0x02, 0x09, 0x2c, 0x00, 0x1f, 0xc0, + 0xb5, 0xf0, 0x20, 0x33, 0x06, 0x40, 0x6e, 0x40, + 0xb0, 0x81, 0x4f, 0x77, 0x63, 0xb8, 0x6a, 0xf9, + 0x1a, 0x40, 0x1d, 0xfc, 0x34, 0x79, 0x63, 0xe0, + 0x28, 0x00, 0xda, 0x02, 0x6a, 0x79, 0x18, 0x40, + 0x63, 0xe0, 0x6b, 0xe0, 0x4b, 0x71, 0x42, 0x98, + 0xdc, 0x03, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x6d, 0xb9, 0x48, 0x6e, 0x1d, 0xc5, + 0x35, 0x59, 0x29, 0x00, 0xd1, 0x16, 0x7e, 0x01, + 0x29, 0x00, 0xd1, 0x13, 0x21, 0x01, 0x75, 0x01, + 0x21, 0x05, 0x84, 0x29, 0x23, 0x0d, 0x06, 0x9b, + 0x6c, 0x79, 0x1a, 0xca, 0x68, 0x52, 0x31, 0x08, + 0x23, 0x05, 0x02, 0x5b, 0x64, 0x79, 0x66, 0xba, + 0x42, 0x99, 0xdb, 0x06, 0x21, 0x01, 0x02, 0xc9, + 0x64, 0x79, 0xe0, 0x02, 0x21, 0x00, 0x75, 0x01, + 0x84, 0x29, 0x8c, 0x29, 0x1c, 0x4a, 0x6a, 0xfb, + 0x1a, 0x9a, 0x07, 0x92, 0x0f, 0x92, 0x18, 0x51, + 0x84, 0x29, 0x7e, 0x01, 0x29, 0x00, 0xd0, 0x03, + 0x21, 0x00, 0x66, 0x39, 0x66, 0x79, 0x76, 0x01, + 0x6c, 0x79, 0x4a, 0x58, 0x69, 0x52, 0x42, 0x91, + 0xd0, 0x26, 0x6e, 0x7a, 0x2a, 0x00, 0xd1, 0x10, + 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc9, 0x68, 0x09, + 0x66, 0x79, 0x1c, 0x0a, 0x6e, 0x3b, 0x18, 0x59, + 0x66, 0x39, 0x4b, 0x51, 0x42, 0x99, 0xdb, 0x04, + 0x32, 0x01, 0x31, 0x01, 0x40, 0x19, 0x66, 0x39, + 0x66, 0x7a, 0x6e, 0x79, 0x6d, 0xba, 0x1a, 0x89, + 0x65, 0x21, 0x91, 0x00, 0x8c, 0x2b, 0x4e, 0x4b, + 0x1a, 0xf3, 0x42, 0x8b, 0xd3, 0x04, 0x63, 0xe1, + 0x21, 0x00, 0x65, 0xb9, 0x66, 0x79, 0xe0, 0x0a, + 0x18, 0xd1, 0x63, 0xe3, 0x65, 0xb9, 0xe0, 0x06, + 0x8c, 0x29, 0x4a, 0x44, 0x1a, 0x51, 0x63, 0xe1, + 0x6d, 0xba, 0x18, 0x51, 0x65, 0xb9, 0x49, 0x42, + 0x66, 0x61, 0x8c, 0x2a, 0x6b, 0xe1, 0x18, 0x89, + 0x31, 0x03, 0x83, 0xa9, 0x22, 0x00, 0x6e, 0x61, + 0x80, 0x0a, 0x31, 0x02, 0x22, 0xff, 0x32, 0xe1, + 0x66, 0x61, 0x80, 0x0a, 0x31, 0x02, 0x66, 0x61, + 0x8b, 0xaa, 0x80, 0x0a, 0x31, 0x02, 0x66, 0x61, + 0x7d, 0x00, 0x28, 0x00, 0xd0, 0x1d, 0x4a, 0x37, + 0x80, 0x0a, 0x1c, 0x88, 0x66, 0x60, 0x8c, 0x29, + 0x02, 0x09, 0x6e, 0xba, 0x0f, 0x52, 0x23, 0x06, + 0x40, 0x1a, 0x43, 0x11, 0x23, 0x21, 0x43, 0x19, + 0x80, 0x01, 0x30, 0x02, 0x66, 0x60, 0x6e, 0xb9, + 0x0b, 0x89, 0x23, 0x01, 0x43, 0x19, 0x80, 0x01, + 0x30, 0x02, 0x66, 0x60, 0x6e, 0xb9, 0x00, 0x49, + 0x43, 0x19, 0x80, 0x01, 0x30, 0x02, 0x66, 0x60, + 0xe0, 0x0b, 0x20, 0x01, 0x03, 0xc0, 0x80, 0x08, + 0x31, 0x02, 0x66, 0x61, 0x8c, 0x28, 0x02, 0x00, + 0x23, 0xff, 0x43, 0x18, 0x80, 0x08, 0x31, 0x02, + 0x66, 0x61, 0x48, 0x23, 0x6e, 0x61, 0x80, 0x08, + 0x31, 0x02, 0x66, 0x61, 0x80, 0x08, 0x31, 0x02, + 0x22, 0x33, 0x06, 0x52, 0x66, 0x61, 0x00, 0x53, + 0x6d, 0x90, 0x18, 0xc2, 0xb4, 0x04, 0x08, 0x5a, + 0x6d, 0x50, 0x18, 0xc6, 0x8c, 0x28, 0x4b, 0x1b, + 0x18, 0xc1, 0x00, 0x53, 0x6a, 0xf8, 0x18, 0xc0, + 0x6b, 0xe2, 0x1c, 0x33, 0xf0, 0x00, 0xfd, 0xb6, + 0x6a, 0xf8, 0x6b, 0xe1, 0x18, 0x40, 0x22, 0x33, + 0x06, 0x52, 0x62, 0xf8, 0x6d, 0x92, 0xb0, 0x01, + 0x42, 0x90, 0xdb, 0x02, 0x6a, 0x79, 0x1a, 0x40, + 0x62, 0xf8, 0x21, 0xff, 0x31, 0x11, 0x48, 0x10, + 0x85, 0x01, 0x8b, 0xa9, 0x31, 0x06, 0x85, 0x41, + 0x21, 0x01, 0x02, 0x49, 0x86, 0x81, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0x48, 0x00, 0x00, 0x0f, 0xee, + 0x2e, 0x08, 0x04, 0xa8, 0xcc, 0x00, 0x0f, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x07, 0xf7, + 0x2c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x2c, 0x00, 0x02, 0x09, + 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0xb0, 0x1c, 0x07, + 0xb0, 0x83, 0x4d, 0x20, 0x6b, 0x28, 0xf7, 0xff, + 0xfa, 0x53, 0x48, 0x1f, 0x6c, 0xc1, 0x6c, 0x80, + 0x1a, 0x08, 0xd5, 0x03, 0x1f, 0xe9, 0x39, 0x79, + 0x69, 0x09, 0x18, 0x40, 0x6e, 0xa9, 0x29, 0x00, + 0xd0, 0x22, 0x29, 0x10, 0xd0, 0x20, 0x29, 0x20, + 0xd0, 0x24, 0x29, 0x30, 0xd1, 0x04, 0x24, 0x2d, + 0x43, 0x44, 0xd5, 0x00, 0x34, 0x3f, 0x11, 0xa4, + 0x46, 0x6a, 0xa8, 0x01, 0xa9, 0x02, 0xf7, 0xff, + 0xfa, 0x19, 0x1b, 0x38, 0x99, 0x02, 0x1a, 0x08, + 0x22, 0x7d, 0x01, 0x52, 0x42, 0x90, 0xdc, 0x01, + 0x42, 0x90, 0xda, 0x05, 0x1a, 0x09, 0x91, 0x02, + 0x22, 0x00, 0x20, 0x00, 0xf7, 0xff, 0xf9, 0xf4, + 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x01, 0x04, 0x1a, 0x24, 0xd5, 0x00, 0x34, 0x1f, + 0x11, 0x64, 0xe7, 0xe1, 0x21, 0x4b, 0x43, 0x41, + 0x20, 0x93, 0xf0, 0x19, 0xfc, 0x91, 0x1c, 0x04, + 0xe7, 0xda, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc8, + 0x66, 0x00, 0x00, 0x80, 0xb5, 0x90, 0x1c, 0x07, + 0xb0, 0x83, 0x4c, 0x18, 0x6f, 0x60, 0x30, 0x01, + 0x46, 0x6a, 0x67, 0x60, 0xa8, 0x01, 0xa9, 0x02, + 0xf7, 0xff, 0xf9, 0xe8, 0x4b, 0x14, 0x18, 0xf9, + 0x98, 0x02, 0x1a, 0x40, 0x4b, 0x13, 0x42, 0x98, + 0xdc, 0x04, 0x42, 0xd8, 0xdb, 0x02, 0x69, 0xe0, + 0x28, 0x01, 0xd1, 0x07, 0x91, 0x02, 0x20, 0x00, + 0x90, 0x01, 0x22, 0x00, 0xf7, 0xff, 0xf9, 0xc0, + 0x20, 0x01, 0x61, 0xe0, 0x69, 0xe0, 0x28, 0x00, + 0xd0, 0x0b, 0x6b, 0x20, 0xf7, 0xff, 0xf9, 0xec, + 0x6f, 0x60, 0x67, 0xa0, 0x48, 0x08, 0x60, 0x07, + 0x6f, 0xe0, 0x30, 0x01, 0x67, 0xe0, 0x20, 0x00, + 0x61, 0xe0, 0xb0, 0x03, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc8, + 0xff, 0xff, 0xec, 0x78, 0x00, 0x02, 0xbf, 0x20, + 0x2e, 0x08, 0x05, 0x48, 0xb4, 0xf0, 0x1c, 0x1c, + 0x23, 0x00, 0x9f, 0x04, 0x60, 0x3b, 0x79, 0x85, + 0x23, 0xc0, 0x40, 0x1d, 0x4b, 0x33, 0x2d, 0x80, + 0xd1, 0x16, 0x25, 0x02, 0x60, 0x9d, 0x79, 0xc5, + 0x0a, 0x2b, 0xd3, 0x06, 0x7a, 0x45, 0x23, 0xe0, + 0x40, 0x2b, 0x2b, 0x20, 0xd1, 0x01, 0x23, 0x09, + 0x60, 0x3b, 0x7a, 0x03, 0x33, 0x09, 0x60, 0x13, + 0x79, 0x02, 0x02, 0x12, 0x79, 0x45, 0x43, 0x2a, + 0x32, 0x06, 0x1a, 0xd2, 0x60, 0x22, 0xe0, 0x25, + 0x25, 0x06, 0x26, 0x01, 0x60, 0x9e, 0x79, 0x83, + 0x2b, 0xff, 0xd1, 0x03, 0x35, 0x01, 0x5d, 0x43, + 0x2b, 0xff, 0xd0, 0xfb, 0x5d, 0x46, 0x23, 0xc0, + 0x40, 0x33, 0x2b, 0x40, 0xd1, 0x00, 0x35, 0x02, + 0x5d, 0x46, 0x09, 0x33, 0x07, 0x9b, 0xd0, 0x08, + 0x60, 0x3d, 0x5d, 0x46, 0x09, 0x73, 0xd3, 0x02, + 0x1d, 0xeb, 0x33, 0x03, 0xe0, 0x02, 0x1d, 0x6b, + 0xe0, 0x00, 0x1c, 0x6b, 0x60, 0x13, 0x79, 0x02, + 0x02, 0x12, 0x79, 0x45, 0x43, 0x2a, 0x32, 0x06, + 0x1a, 0xd2, 0x60, 0x22, 0x68, 0x3a, 0x2a, 0x00, + 0xd0, 0x20, 0x5c, 0x82, 0x23, 0x0e, 0x40, 0x1a, + 0x07, 0x52, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc3, + 0x78, 0x5b, 0x05, 0x9b, 0x43, 0x1a, 0x60, 0x0a, + 0x68, 0x3b, 0x18, 0xc3, 0x78, 0x9c, 0x23, 0xfe, + 0x40, 0x23, 0x03, 0x9b, 0x43, 0x1a, 0x60, 0x0a, + 0x68, 0x3b, 0x18, 0xc3, 0x78, 0xdb, 0x01, 0xdb, + 0x43, 0x1a, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc0, + 0x79, 0x00, 0x23, 0xfe, 0x40, 0x18, 0x08, 0x40, + 0x43, 0x10, 0x60, 0x08, 0x20, 0x00, 0xbc, 0xf0, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x48, + 0xb5, 0xb0, 0xb0, 0x83, 0x48, 0x3f, 0x49, 0x40, + 0x8d, 0xc9, 0x4c, 0x40, 0x63, 0xe1, 0x29, 0x06, + 0xda, 0x03, 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0x01, 0x09, 0x49, 0x01, 0x49, + 0x23, 0xff, 0x33, 0xe1, 0x42, 0x99, 0xd0, 0x03, + 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x46, 0x6a, 0xb4, 0x04, 0xaa, 0x03, 0xab, 0x02, + 0x49, 0x35, 0xf7, 0xff, 0xff, 0x6f, 0xb0, 0x01, + 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, 0x99, 0x01, + 0x18, 0x40, 0x6b, 0xe1, 0x42, 0x88, 0xd0, 0x03, + 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x00, 0x4f, 0x2c, 0x28, 0x00, 0xd0, 0x25, + 0x6e, 0x38, 0x6d, 0xb9, 0x18, 0x40, 0x23, 0x01, + 0x06, 0x1b, 0x66, 0x38, 0x42, 0x98, 0xdb, 0x04, + 0x43, 0xdb, 0x18, 0xc0, 0x66, 0x38, 0x1e, 0x48, + 0x65, 0xb8, 0x23, 0x0d, 0x06, 0x9b, 0x6d, 0xb8, + 0x6c, 0xb9, 0x1a, 0xc9, 0x60, 0x08, 0x6e, 0xe0, + 0x6c, 0xb9, 0x1a, 0xc9, 0x60, 0x48, 0x20, 0x00, + 0x65, 0xb8, 0x6c, 0xb8, 0x30, 0x08, 0x23, 0x05, + 0x02, 0x5b, 0x64, 0xb8, 0x42, 0x98, 0xd1, 0x02, + 0x20, 0x01, 0x02, 0xc0, 0x64, 0xb8, 0x6c, 0xb8, + 0x49, 0x19, 0x61, 0x48, 0x24, 0x33, 0x06, 0x64, + 0x00, 0x63, 0x6d, 0xa0, 0x18, 0xc2, 0xb4, 0x04, + 0x6d, 0x60, 0x18, 0xc5, 0x6e, 0x60, 0x18, 0xc1, + 0x98, 0x03, 0x4b, 0x0e, 0x18, 0xc0, 0x9a, 0x02, + 0x1c, 0x2b, 0xf0, 0x00, 0xfc, 0x53, 0xb0, 0x01, + 0x6d, 0xb8, 0x99, 0x01, 0x18, 0x40, 0x65, 0xb8, + 0x48, 0x0e, 0x68, 0x02, 0x18, 0x51, 0x60, 0x01, + 0x6e, 0x60, 0x6d, 0xa1, 0x42, 0x88, 0xdb, 0x04, + 0x48, 0x0a, 0x68, 0x01, 0x6a, 0x7a, 0x1a, 0x89, + 0x60, 0x01, 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x12, 0x00, + 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x04, 0xc8, + 0x2e, 0x08, 0x05, 0x34, 0x2e, 0x08, 0x04, 0x48, + 0xcc, 0x00, 0x0f, 0x00, 0x66, 0x00, 0x00, 0x64, + 0xb5, 0xf0, 0xb0, 0x83, 0x4e, 0x65, 0x25, 0x00, + 0x4f, 0x65, 0x6a, 0xf8, 0xf7, 0xff, 0xf8, 0xcc, + 0x48, 0x64, 0x8d, 0xc0, 0x63, 0xf8, 0x28, 0x0a, + 0xda, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0x34, 0x09, 0x60, 0x01, 0x40, + 0x23, 0xff, 0x33, 0xc1, 0x42, 0x98, 0xd0, 0x07, + 0x23, 0xff, 0x33, 0xbe, 0x42, 0x9c, 0xd0, 0x03, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x46, 0x6a, 0xb4, 0x04, 0xaa, 0x03, 0xab, 0x02, + 0x49, 0x57, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xd6, + 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, + 0x99, 0x01, 0x18, 0x41, 0x6b, 0xfa, 0x42, 0x91, + 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x01, 0x1c, 0x22, 0x4c, 0x4d, + 0x23, 0xff, 0x33, 0xbe, 0x42, 0x9a, 0xd1, 0x3c, + 0x5c, 0x30, 0x28, 0xa0, 0xd0, 0x03, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xe0, + 0x28, 0x00, 0xd1, 0x1b, 0x20, 0x02, 0x63, 0x78, + 0x60, 0xe1, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0f, + 0xf9, 0x4f, 0x20, 0x00, 0xf7, 0xfb, 0xfe, 0xb8, + 0x98, 0x02, 0x4b, 0x3c, 0x18, 0xc0, 0x79, 0x40, + 0x23, 0x30, 0x40, 0x18, 0x66, 0xb8, 0xd0, 0x16, + 0x28, 0x10, 0xd0, 0x14, 0x28, 0x20, 0xd0, 0x17, + 0x28, 0x30, 0xd1, 0x03, 0x21, 0x20, 0x20, 0x1e, + 0xf0, 0x0f, 0xfc, 0x69, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x2b, 0x6d, 0x60, 0x28, 0x05, 0xd1, 0x28, + 0x68, 0xf8, 0x28, 0x00, 0xd1, 0x25, 0x6f, 0x38, + 0xf7, 0xff, 0xfe, 0x08, 0xe0, 0x21, 0x21, 0x02, + 0x20, 0x1e, 0xf0, 0x0f, 0xfc, 0x58, 0xe7, 0xed, + 0x21, 0x08, 0x20, 0x1e, 0xf0, 0x0f, 0xfc, 0x53, + 0xe7, 0xe8, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x08, + 0x20, 0x00, 0x63, 0x79, 0x21, 0x00, 0x60, 0xe0, + 0xf0, 0x0f, 0xf9, 0x1a, 0x20, 0x02, 0xf0, 0x0f, + 0xf9, 0x6d, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x08, + 0x6d, 0x60, 0x28, 0x05, 0xd1, 0x05, 0x68, 0xf8, + 0x28, 0x00, 0xd1, 0x02, 0x6f, 0x38, 0xf7, 0xff, + 0xfe, 0x2d, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x01, + 0x98, 0x02, 0x1d, 0xc5, 0x6b, 0xf8, 0x1b, 0x42, + 0x63, 0xfa, 0x7e, 0x39, 0x69, 0x78, 0x18, 0x41, + 0x4b, 0x16, 0x18, 0xe8, 0xf7, 0xfb, 0xfb, 0xfc, + 0x7e, 0x38, 0x6b, 0xf9, 0x18, 0x40, 0x07, 0x81, + 0x0f, 0x89, 0x76, 0x39, 0x1a, 0x44, 0x20, 0x01, + 0x06, 0x00, 0x49, 0x15, 0x60, 0x08, 0xf0, 0x1e, + 0xfe, 0x53, 0x4b, 0x14, 0x40, 0x18, 0xf0, 0x1e, + 0xfe, 0x53, 0x22, 0x04, 0x49, 0x10, 0xb4, 0x06, + 0x23, 0x12, 0x21, 0x1e, 0x69, 0x78, 0x1c, 0x22, + 0xf0, 0x13, 0xff, 0x28, 0xb0, 0x02, 0xf0, 0x1e, + 0xfe, 0x43, 0x23, 0x01, 0x04, 0x9b, 0x43, 0x18, + 0xf0, 0x1e, 0xfe, 0x42, 0x69, 0x78, 0x59, 0x01, + 0x60, 0x01, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x12, 0x00, + 0x2e, 0x08, 0x04, 0xc8, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x08, 0x05, 0x38, 0x2e, 0x08, 0x04, 0x48, + 0x9e, 0x00, 0x08, 0x00, 0xff, 0xfb, 0xff, 0xff, + 0x20, 0x33, 0x06, 0x40, 0x6e, 0x81, 0x6e, 0x40, + 0x1a, 0x09, 0x48, 0x0f, 0x63, 0xc1, 0x29, 0x00, + 0xdc, 0x04, 0x1f, 0xc2, 0x3a, 0x79, 0x6a, 0x52, + 0x18, 0x89, 0x63, 0xc1, 0x6b, 0xc1, 0x08, 0x89, + 0x00, 0x89, 0x23, 0x01, 0x02, 0xdb, 0x63, 0xc1, + 0x42, 0x99, 0xdd, 0x0b, 0x4a, 0x07, 0x42, 0x91, + 0xdd, 0x00, 0x63, 0xc2, 0x4a, 0x06, 0x49, 0x07, + 0x85, 0x8a, 0x6b, 0xc0, 0x85, 0xc8, 0x20, 0x09, + 0x02, 0x40, 0x86, 0xc8, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0xc8, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x02, 0x06, 0x2c, 0x00, 0x1f, 0xc0, + 0x48, 0x0f, 0x78, 0x01, 0x29, 0x00, 0xd0, 0x1a, + 0x49, 0x0e, 0x6c, 0x8a, 0x6c, 0xc9, 0x1a, 0x51, + 0x63, 0xc1, 0x1c, 0x0a, 0x29, 0x00, 0xdc, 0x04, + 0x1f, 0xc1, 0x39, 0x79, 0x69, 0x09, 0x18, 0x51, + 0x63, 0xc1, 0x23, 0x01, 0x03, 0x1b, 0x6b, 0xc1, + 0x42, 0x99, 0xdb, 0x08, 0x22, 0xff, 0x32, 0x07, + 0x49, 0x05, 0x85, 0x8a, 0x6b, 0xc0, 0x85, 0xc8, + 0x20, 0x09, 0x02, 0x40, 0x86, 0xc8, 0x47, 0x70, + 0x2e, 0x08, 0x04, 0xc8, 0x66, 0x00, 0x00, 0x80, + 0x2c, 0x00, 0x1f, 0xc0, 0xb4, 0x80, 0x20, 0x00, + 0x49, 0x1e, 0x6c, 0x8a, 0x6c, 0xc9, 0x1a, 0x52, + 0x49, 0x1d, 0x2a, 0x00, 0xdc, 0x01, 0x69, 0x0b, + 0x18, 0xd2, 0x23, 0x01, 0x02, 0xdb, 0x42, 0x9a, + 0xdd, 0x00, 0x08, 0xd8, 0x22, 0x33, 0x06, 0x52, + 0x6e, 0x93, 0x6e, 0x52, 0x1a, 0x9a, 0x2a, 0x00, + 0xdc, 0x01, 0x6a, 0x4b, 0x18, 0xd2, 0x08, 0x92, + 0x00, 0x92, 0x4b, 0x14, 0x68, 0xdb, 0x2b, 0x00, + 0xd0, 0x06, 0x23, 0x01, 0x03, 0x1b, 0x6a, 0x4f, + 0x18, 0xfb, 0x6a, 0x89, 0x1a, 0x59, 0xe0, 0x01, + 0x21, 0x01, 0x03, 0x09, 0x42, 0x8a, 0xdd, 0x04, + 0x04, 0x00, 0x0c, 0x00, 0x23, 0x01, 0x02, 0x5b, + 0x43, 0x18, 0x28, 0x00, 0xd0, 0x0b, 0x4b, 0x0a, + 0x42, 0x9a, 0xdd, 0x00, 0x1c, 0x1a, 0x21, 0x06, + 0x43, 0x01, 0x48, 0x08, 0x85, 0x81, 0x85, 0xc2, + 0x21, 0x09, 0x02, 0x49, 0x86, 0xc1, 0xbc, 0x80, + 0x47, 0x70, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, + 0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x04, 0xc8, + 0x00, 0x00, 0xff, 0xff, 0x2c, 0x00, 0x1f, 0xc0, + 0xb5, 0x90, 0x04, 0x00, 0x0c, 0x00, 0x4f, 0x13, + 0x6d, 0x39, 0x29, 0x00, 0xd1, 0x10, 0x24, 0x01, + 0x28, 0x01, 0xd0, 0x10, 0x28, 0x04, 0xd0, 0x15, + 0x28, 0x05, 0xd1, 0x09, 0xf7, 0xff, 0xf8, 0x52, + 0xf7, 0xff, 0xf8, 0x06, 0x20, 0x00, 0x66, 0xf8, + 0x67, 0x38, 0x20, 0x05, 0x65, 0x78, 0x65, 0x3c, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, + 0xff, 0xfb, 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x3e, + 0x20, 0x04, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x48, + 0xb5, 0x90, 0x04, 0x00, 0x0c, 0x00, 0x4f, 0x23, + 0x6d, 0x39, 0x29, 0x00, 0xd0, 0x0e, 0x29, 0x02, + 0xd1, 0x09, 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x34, + 0x28, 0x04, 0xd0, 0x27, 0x28, 0x05, 0xd1, 0x02, + 0x20, 0xff, 0xf7, 0xff, 0xf8, 0xd1, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x24, 0x02, 0x28, 0x01, + 0xd0, 0x0c, 0x28, 0x04, 0xd0, 0x12, 0x28, 0x05, + 0xd1, 0xf5, 0x20, 0x00, 0xf7, 0xff, 0xf8, 0xc4, + 0x20, 0x05, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x42, + 0x20, 0x01, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x7a, + 0x20, 0x04, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x20, 0x0e, + 0xf0, 0x11, 0xfb, 0xb2, 0x21, 0x00, 0x20, 0x0d, + 0xf0, 0x11, 0xfb, 0xae, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x02, 0xf0, 0x0f, 0xf8, 0x0e, + 0x20, 0xff, 0x49, 0x03, 0x70, 0x08, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x48, + 0x2e, 0x08, 0x04, 0xc8, 0xb5, 0xf0, 0x4f, 0x2b, + 0x24, 0x00, 0x6d, 0x38, 0x28, 0x01, 0xd0, 0x1e, + 0x28, 0x02, 0xd1, 0x19, 0x26, 0x03, 0x6d, 0x78, + 0x1d, 0xfd, 0x35, 0x79, 0x28, 0x01, 0xd0, 0x34, + 0x28, 0x04, 0xd0, 0x3f, 0x28, 0x05, 0xd1, 0x0f, + 0x20, 0x02, 0x63, 0x6c, 0xf0, 0x0e, 0xff, 0xee, + 0x20, 0x00, 0xf7, 0xfb, 0xfd, 0x01, 0xf7, 0xff, + 0xf8, 0x2b, 0x65, 0x3e, 0x20, 0x00, 0x65, 0x78, + 0xf7, 0xfe, 0xfe, 0xc2, 0x20, 0x01, 0x61, 0xe8, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x78, + 0x28, 0x01, 0xd0, 0x0c, 0x28, 0x04, 0xd0, 0x11, + 0x28, 0x05, 0xd1, 0xf5, 0xf7, 0xfe, 0xff, 0x8c, + 0xf7, 0xfe, 0xff, 0xe2, 0x65, 0x3c, 0x65, 0x7c, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, + 0xff, 0x83, 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 0xff, 0xd4, + 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x63, 0x6c, 0x20, 0x02, 0x60, 0xfc, + 0xf0, 0x0e, 0xff, 0xbc, 0x20, 0x00, 0xf7, 0xfb, + 0xfc, 0xcf, 0x65, 0x7c, 0x65, 0x3e, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 0xff, 0xf4, + 0x65, 0x7c, 0x65, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x48, + 0xb5, 0x90, 0x4c, 0x1b, 0x68, 0xe0, 0x28, 0x03, + 0xd0, 0x1f, 0x1f, 0xe7, 0x3f, 0x79, 0x6d, 0x38, + 0x28, 0x02, 0xd1, 0x1a, 0x6d, 0x78, 0x28, 0x01, + 0xd0, 0x1a, 0x28, 0x04, 0xd0, 0x20, 0x28, 0x05, + 0xd1, 0x13, 0x4a, 0x14, 0x49, 0x14, 0x48, 0x15, + 0xf7, 0xfe, 0xfe, 0x54, 0x21, 0x00, 0x20, 0x0e, + 0xf0, 0x11, 0xfb, 0x2a, 0x20, 0x01, 0xf0, 0x0e, + 0xff, 0x8d, 0x20, 0x03, 0x60, 0xe0, 0x68, 0xf8, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x01, 0xf0, 0x0e, + 0xff, 0x85, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x01, 0xf0, 0x0e, 0xff, 0x7f, 0x20, 0x00, + 0x70, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x00, 0x20, 0x0b, 0xf0, 0x11, 0xfb, 0x10, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0xc8, 0x2e, 0x08, 0x05, 0x54, + 0x2e, 0x08, 0x05, 0x4c, 0x2e, 0x08, 0x05, 0x50, + 0xb5, 0xf0, 0x4c, 0x21, 0x6d, 0x20, 0x28, 0x02, + 0xd1, 0x24, 0x26, 0xff, 0x6d, 0x60, 0x1d, 0xe7, + 0x37, 0x79, 0x28, 0x01, 0xd0, 0x1d, 0x28, 0x04, + 0xd0, 0x1f, 0x28, 0x05, 0xd1, 0x1a, 0x20, 0x01, + 0xf0, 0x0e, 0xff, 0x58, 0x25, 0x00, 0x68, 0xe0, + 0x28, 0x00, 0xd0, 0x04, 0x21, 0x00, 0x20, 0x00, + 0xf0, 0x0e, 0xfe, 0xfa, 0x60, 0xe5, 0x70, 0x3e, + 0x68, 0xf8, 0x28, 0x03, 0xd1, 0x14, 0x48, 0x13, + 0x22, 0x00, 0x68, 0x41, 0x20, 0x00, 0xf7, 0xfe, + 0xfd, 0xef, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x20, + 0xe0, 0x0f, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x11, + 0xfa, 0xd3, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x01, 0x61, 0xf8, 0x6b, 0x38, 0xf7, 0xfe, + 0xfe, 0x0f, 0x20, 0x02, 0x60, 0xfd, 0xf0, 0x0e, + 0xff, 0x2d, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x11, + 0xfa, 0xc3, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x05, 0x48, + 0xb5, 0xb0, 0x04, 0x07, 0x0c, 0x3f, 0x2f, 0x01, + 0xda, 0x00, 0x27, 0x01, 0x2f, 0x3f, 0xdd, 0x00, + 0x27, 0x3f, 0x48, 0x17, 0x6d, 0x01, 0x29, 0x02, + 0xd1, 0x13, 0x6d, 0x40, 0x25, 0x02, 0x4c, 0x15, + 0x28, 0x04, 0xd0, 0x11, 0x28, 0x05, 0xd1, 0x0c, + 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x11, 0xfa, 0xa4, + 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x11, 0xfa, 0xa0, + 0x20, 0x22, 0x1c, 0x39, 0xf0, 0x11, 0xfa, 0x9c, + 0x60, 0xe5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x11, 0xfa, 0x94, + 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x11, 0xfa, 0x90, + 0x20, 0x22, 0x1c, 0x39, 0xf0, 0x11, 0xfa, 0x8c, + 0x20, 0x00, 0xf7, 0xfe, 0xfd, 0xcd, 0x60, 0xe5, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x04, 0xc8, + 0xb5, 0x00, 0x48, 0x0b, 0x6d, 0x01, 0x29, 0x02, + 0xd1, 0x10, 0x6d, 0x40, 0x28, 0x04, 0xd0, 0x01, + 0x28, 0x05, 0xd1, 0x0b, 0x21, 0x00, 0x20, 0x16, + 0xf0, 0x11, 0xfa, 0x72, 0x20, 0x00, 0xf7, 0xfe, + 0xfd, 0xb3, 0x21, 0x00, 0x48, 0x03, 0x70, 0x01, + 0x21, 0x01, 0x60, 0xc1, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x04, 0xc8, + 0xb5, 0x00, 0x48, 0x0b, 0x6d, 0x01, 0x29, 0x02, + 0xd1, 0x10, 0x6d, 0x40, 0x28, 0x04, 0xd0, 0x01, + 0x28, 0x05, 0xd1, 0x0b, 0x21, 0x00, 0x20, 0x1a, + 0xf0, 0x11, 0xfa, 0x56, 0x20, 0x00, 0xf7, 0xfe, + 0xfd, 0x97, 0x21, 0x00, 0x48, 0x03, 0x70, 0x01, + 0x21, 0x01, 0x60, 0xc1, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x04, 0xc8, + 0x48, 0x03, 0x6d, 0x00, 0x28, 0x00, 0xd1, 0x00, + 0x47, 0x70, 0x20, 0xff, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0x48, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x0f, 0x4d, 0x52, 0x6d, 0x29, 0x48, 0x52, + 0x26, 0x00, 0x29, 0x01, 0xd0, 0x4c, 0x29, 0x02, + 0xd1, 0x6e, 0x6d, 0x69, 0x29, 0x01, 0xd0, 0x20, + 0x29, 0x04, 0xd0, 0x2e, 0x29, 0x05, 0xd1, 0x3e, + 0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x08, 0xd5, 0x01, + 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, + 0x69, 0x28, 0xf0, 0x18, 0xff, 0xdd, 0x70, 0x20, + 0x20, 0x33, 0x06, 0x40, 0x6e, 0x41, 0x6e, 0x80, + 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, + 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, 0xf0, 0x18, + 0xff, 0xcf, 0x70, 0x38, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x08, + 0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, + 0x43, 0x41, 0x69, 0x28, 0xf0, 0x18, 0xff, 0xc0, + 0x70, 0x20, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x33, 0x06, 0x40, 0x6e, 0x41, + 0x6e, 0x80, 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, + 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, + 0xf0, 0x18, 0xff, 0xae, 0x70, 0x38, 0x70, 0x26, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x70, 0x26, + 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x6d, 0x69, 0x29, 0x01, 0xd0, 0x21, 0x29, 0x04, + 0xd0, 0x2f, 0x29, 0x05, 0xd1, 0x3f, 0x69, 0x69, + 0x6c, 0xc0, 0x1a, 0x40, 0xd5, 0x01, 0x69, 0x29, + 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x69, 0x28, + 0xf0, 0x18, 0xff, 0x92, 0x70, 0x20, 0x21, 0x33, + 0x06, 0x49, 0x6a, 0xe8, 0x6e, 0x49, 0x1a, 0x08, + 0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, + 0x43, 0x41, 0x6a, 0x68, 0xf0, 0x18, 0xff, 0x84, + 0x70, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xe0, 0x26, 0x69, 0x69, 0x6c, 0xc0, 0x1a, 0x40, + 0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, + 0x43, 0x41, 0x69, 0x28, 0xf0, 0x18, 0xff, 0x74, + 0x70, 0x20, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x33, 0x06, 0x49, 0x6a, 0xe8, + 0x6e, 0x49, 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, + 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, + 0xf0, 0x18, 0xff, 0x62, 0x70, 0x38, 0x70, 0x26, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x70, 0x26, + 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x70, 0x26, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x48, + 0x66, 0x00, 0x00, 0x80, 0xb5, 0xf0, 0x1c, 0x17, + 0x9e, 0x05, 0x1a, 0xf2, 0x1c, 0x0d, 0x21, 0x00, + 0x1c, 0x1c, 0x42, 0xba, 0xda, 0x03, 0x1c, 0x08, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x42, 0xa0, + 0xd3, 0x01, 0x42, 0xb0, 0xd9, 0x03, 0x1c, 0x08, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x19, 0xc1, + 0x42, 0xb1, 0xd9, 0x0c, 0x1a, 0x32, 0x4e, 0x0a, + 0x64, 0x32, 0x1c, 0x29, 0xf7, 0xfb, 0xf8, 0x84, + 0x6c, 0x30, 0x1a, 0x3a, 0x18, 0x29, 0x1c, 0x20, + 0xf7, 0xfb, 0xf8, 0x7e, 0xe0, 0x03, 0x1c, 0x29, + 0x1c, 0x3a, 0xf7, 0xfb, 0xf8, 0x79, 0x1c, 0x38, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0xc8, 0xb5, 0xf0, 0x1c, 0x17, + 0x9e, 0x05, 0x1a, 0xf2, 0x1c, 0x05, 0x20, 0x00, + 0x1c, 0x1c, 0x42, 0xba, 0xdb, 0x18, 0x42, 0xa1, + 0xd3, 0x16, 0x42, 0xb1, 0xd2, 0x14, 0x19, 0xc8, + 0x42, 0xb0, 0xd9, 0x0c, 0x1a, 0x72, 0x4e, 0x0a, + 0x64, 0x32, 0x1c, 0x28, 0xf7, 0xfb, 0xf8, 0x5c, + 0x6c, 0x30, 0x1a, 0x3a, 0x18, 0x28, 0x1c, 0x21, + 0xf7, 0xfb, 0xf8, 0x56, 0xe0, 0x03, 0x1c, 0x28, + 0x1c, 0x3a, 0xf7, 0xfb, 0xf8, 0x51, 0x1c, 0x38, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0xc8, 0x47, 0x70, 0xb5, 0x00, + 0xb0, 0x82, 0x46, 0x6a, 0x49, 0x06, 0xa8, 0x01, + 0xf7, 0xfe, 0xfc, 0x58, 0x21, 0x00, 0x20, 0x0b, + 0xf0, 0x11, 0xf9, 0x2e, 0x20, 0x03, 0x49, 0x03, + 0x61, 0x88, 0xb0, 0x02, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x05, 0x64, 0x2e, 0x08, 0x05, 0x48, + 0xb5, 0x80, 0x4f, 0x0b, 0x22, 0x00, 0x20, 0x00, + 0x69, 0xf9, 0xf7, 0xfe, 0xfc, 0x2d, 0x21, 0x00, + 0x20, 0x0d, 0xf0, 0x11, 0xf9, 0x19, 0x21, 0x01, + 0x1f, 0xf8, 0x38, 0x79, 0x61, 0xc1, 0x6b, 0x00, + 0xf7, 0xfe, 0xfc, 0x56, 0x20, 0x00, 0x61, 0xb8, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0x48, 0xb5, 0x80, 0x4f, 0x06, + 0x68, 0x38, 0x1d, 0xc1, 0x31, 0xb5, 0x20, 0x2f, + 0x02, 0x80, 0xf0, 0x18, 0xfe, 0xbd, 0x60, 0x39, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x02, 0xcb, 0x10, 0x48, 0x05, 0x8f, 0xc1, + 0x29, 0x00, 0xd0, 0x05, 0x21, 0x00, 0x87, 0xc1, + 0x48, 0x03, 0x69, 0x01, 0x31, 0x01, 0x61, 0x01, + 0x47, 0x70, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x08, 0x05, 0x68, 0x48, 0x03, 0x21, 0x00, + 0x60, 0x01, 0x48, 0x03, 0x69, 0x41, 0x31, 0x01, + 0x61, 0x41, 0x47, 0x70, 0x2e, 0x08, 0x48, 0x00, + 0x2e, 0x08, 0x05, 0x68, 0xb5, 0x00, 0xb0, 0x88, + 0x46, 0x68, 0xf0, 0x13, 0xfc, 0xbf, 0x48, 0x07, + 0x69, 0x81, 0x31, 0x01, 0x23, 0x01, 0x22, 0x06, + 0x61, 0x81, 0x21, 0x47, 0x02, 0x49, 0x05, 0x48, + 0xf0, 0x13, 0xfb, 0xac, 0xb0, 0x08, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x68, + 0xb5, 0x90, 0x1c, 0x07, 0x20, 0xff, 0x30, 0xa5, + 0xb0, 0x85, 0x90, 0x00, 0x20, 0x01, 0x02, 0x40, + 0x90, 0x02, 0x48, 0x12, 0x90, 0x04, 0x20, 0x0e, + 0xab, 0x03, 0x80, 0x18, 0x46, 0x68, 0xf0, 0x13, + 0xfc, 0xd1, 0x2f, 0x00, 0xd0, 0x16, 0x20, 0x33, + 0x06, 0x40, 0x6d, 0x40, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc7, 0x98, 0x02, 0x1e, 0x79, 0xf0, 0x00, + 0xfb, 0x31, 0x4c, 0x09, 0x68, 0x20, 0x28, 0x00, + 0xd1, 0x04, 0x20, 0xa5, 0x01, 0xc0, 0xf0, 0x00, + 0xfb, 0x37, 0x60, 0x20, 0x98, 0x02, 0x1a, 0x38, + 0x49, 0x04, 0x60, 0x88, 0xb0, 0x05, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x1c, 0x00, 0x00, + 0x2e, 0x08, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x68, + 0xb5, 0x00, 0x22, 0x01, 0x21, 0x01, 0x20, 0x00, + 0xf0, 0x0f, 0xf9, 0x2e, 0x48, 0x04, 0x68, 0x00, + 0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, + 0xf0, 0x00, 0xf9, 0xea, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x9b, 0xc4, 0xb5, 0xf0, 0x48, 0x55, + 0x4e, 0x55, 0x80, 0x30, 0x27, 0x00, 0x4c, 0x55, + 0x86, 0xe7, 0x86, 0xa7, 0x48, 0x54, 0x60, 0x07, + 0xf0, 0x0b, 0xf8, 0x2e, 0x48, 0x53, 0xf0, 0x14, + 0xf8, 0xdb, 0xf7, 0xfa, 0xff, 0x29, 0x21, 0xff, + 0x48, 0x51, 0x60, 0x01, 0x68, 0x01, 0x29, 0x00, + 0xd0, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x01, + 0x4a, 0x4e, 0x60, 0xd1, 0x60, 0x07, 0xf7, 0xfc, + 0xfb, 0x17, 0x20, 0x01, 0xf7, 0xff, 0xff, 0x98, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0e, 0xfc, 0x6c, + 0xf0, 0x01, 0xfa, 0xbc, 0x48, 0x48, 0x60, 0x07, + 0x25, 0x02, 0x48, 0x48, 0x60, 0x05, 0x20, 0x03, + 0x49, 0x47, 0x60, 0x08, 0x49, 0x47, 0x60, 0x08, + 0x49, 0x47, 0x60, 0x0d, 0x49, 0x47, 0x60, 0x08, + 0x48, 0x47, 0x60, 0x07, 0x48, 0x47, 0x65, 0x87, + 0xf0, 0x00, 0xf9, 0x8a, 0xf0, 0x14, 0xf9, 0x48, + 0x20, 0x00, 0xf0, 0x11, 0xfe, 0x85, 0x28, 0x00, + 0xd1, 0x64, 0x48, 0x43, 0xf0, 0x0e, 0xfa, 0xbe, + 0x20, 0x00, 0xf0, 0x0e, 0xfb, 0x2f, 0x87, 0xe7, + 0x87, 0xa7, 0x22, 0x01, 0xb4, 0x04, 0x22, 0x03, + 0x21, 0x01, 0x20, 0x00, 0x1c, 0x2b, 0xf0, 0x11, + 0xfb, 0x2b, 0x20, 0x02, 0xb0, 0x01, 0xf7, 0xfc, + 0xfc, 0x73, 0xf7, 0xff, 0xff, 0x95, 0x20, 0x7d, + 0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xc7, 0x20, 0x7d, + 0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xdb, 0xf0, 0x09, + 0xff, 0x4f, 0xf0, 0x09, 0xff, 0x8d, 0xf7, 0xfb, + 0xf9, 0xbf, 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfd, + 0xf8, 0x11, 0xf7, 0xfd, 0xfb, 0xbf, 0xf7, 0xfb, + 0xfd, 0x0d, 0x03, 0xe8, 0xf0, 0x00, 0xfa, 0x5c, + 0xf0, 0x05, 0xfc, 0x30, 0x49, 0x2b, 0x70, 0x08, + 0x05, 0xa8, 0xf0, 0x1e, 0xf9, 0x78, 0x49, 0x2a, + 0x20, 0x17, 0xf0, 0x1e, 0xf9, 0x81, 0x49, 0x29, + 0x20, 0x08, 0xf0, 0x1e, 0xf9, 0x7d, 0xf0, 0x1e, + 0xf9, 0x73, 0x4b, 0x27, 0x40, 0x18, 0xf0, 0x1e, + 0xf9, 0x73, 0x01, 0xe8, 0xf0, 0x1e, 0xf9, 0x67, + 0x48, 0x24, 0x23, 0x01, 0x22, 0x08, 0x21, 0x81, + 0x01, 0x09, 0x60, 0x07, 0xf0, 0x11, 0xfa, 0x38, + 0xf0, 0x01, 0xfa, 0xd6, 0x49, 0x20, 0x20, 0x04, + 0xf0, 0x1e, 0xf9, 0x66, 0xf0, 0x1e, 0xf9, 0x5c, + 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x1e, + 0xf9, 0x5b, 0x20, 0x10, 0xf0, 0x1e, 0xf9, 0x4f, + 0x87, 0x67, 0x21, 0x00, 0x1c, 0x30, 0xf7, 0xfd, + 0xfd, 0xa9, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x08, 0x04, 0x98, 0x07, 0x77, 0x77, 0x20, + 0x72, 0x00, 0x02, 0x00, 0x2e, 0x08, 0x05, 0x68, + 0x6e, 0x00, 0x10, 0x00, 0x6e, 0x00, 0x11, 0x00, + 0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x15, 0x00, + 0x6e, 0x00, 0x16, 0x00, 0x6e, 0x00, 0x17, 0x00, + 0x6e, 0x00, 0x18, 0x00, 0xcc, 0x00, 0x0f, 0x80, + 0x00, 0x80, 0x10, 0x80, 0x2e, 0x08, 0x1a, 0x94, + 0x2e, 0x00, 0x54, 0xa1, 0x2e, 0x00, 0x54, 0xc1, + 0xff, 0xff, 0xfe, 0xff, 0x2e, 0x08, 0x48, 0x00, + 0x2e, 0x00, 0x54, 0x81, 0xb5, 0x90, 0x1c, 0x0c, + 0x1c, 0x07, 0xf0, 0x1e, 0xf9, 0x55, 0x2f, 0x01, + 0xda, 0x00, 0x27, 0x01, 0x4b, 0x0e, 0x42, 0x9f, + 0xdd, 0x00, 0x1c, 0x1f, 0x3f, 0x01, 0x04, 0x3f, + 0x4b, 0x0c, 0x18, 0xff, 0x21, 0x03, 0x48, 0x0c, + 0x60, 0x01, 0x60, 0x47, 0x21, 0x01, 0x60, 0x01, + 0x20, 0x01, 0x1c, 0x21, 0xf0, 0x1e, 0xf9, 0x0c, + 0xf0, 0x1e, 0xf9, 0x02, 0x23, 0x02, 0x43, 0xdb, + 0x40, 0x18, 0xf0, 0x1e, 0xf9, 0x01, 0xf0, 0x1e, + 0xf9, 0x6d, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x00, 0xfd, 0xe8, 0x00, 0x00, 0x9e, 0x34, + 0x6e, 0x00, 0x03, 0x00, 0xb5, 0x90, 0x1c, 0x0c, + 0x1c, 0x07, 0xf0, 0x1e, 0xf9, 0x29, 0x2f, 0x01, + 0xda, 0x00, 0x27, 0x01, 0x4b, 0x0e, 0x42, 0x9f, + 0xdd, 0x00, 0x1c, 0x1f, 0x3f, 0x01, 0x04, 0x3f, + 0x21, 0x03, 0x37, 0xff, 0x37, 0x96, 0x48, 0x0b, + 0x60, 0x01, 0x60, 0x47, 0x21, 0x01, 0x60, 0x01, + 0x20, 0x01, 0x1c, 0x21, 0xf0, 0x1e, 0xf8, 0xe0, + 0xf0, 0x1e, 0xf8, 0xd6, 0x23, 0x02, 0x43, 0xdb, + 0x40, 0x18, 0xf0, 0x1e, 0xf8, 0xd5, 0xf0, 0x1e, + 0xf9, 0x41, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x00, 0xfd, 0xe8, 0x6e, 0x00, 0x03, 0x00, + 0xb5, 0x00, 0xf0, 0x1e, 0xf9, 0x01, 0x20, 0x03, + 0x49, 0x05, 0x60, 0x08, 0xf0, 0x1e, 0xf8, 0xc0, + 0x23, 0x02, 0x43, 0x18, 0xf0, 0x1e, 0xf8, 0xc0, + 0xf0, 0x1e, 0xf9, 0x2c, 0xbc, 0x08, 0x47, 0x18, + 0x6e, 0x00, 0x03, 0x00, 0xb5, 0x90, 0x1c, 0x0c, + 0x1c, 0x07, 0xf0, 0x1e, 0xf8, 0xed, 0x2f, 0x01, + 0xda, 0x00, 0x27, 0x01, 0x4b, 0x0e, 0x42, 0x9f, + 0xdd, 0x00, 0x1c, 0x1f, 0x3f, 0x01, 0x04, 0x3f, + 0x4b, 0x0c, 0x18, 0xff, 0x21, 0x03, 0x48, 0x0c, + 0x60, 0x01, 0x60, 0x47, 0x21, 0x01, 0x60, 0x01, + 0x20, 0x05, 0x1c, 0x21, 0xf0, 0x1e, 0xf8, 0xa4, + 0xf0, 0x1e, 0xf8, 0x9a, 0x23, 0x20, 0x43, 0xdb, + 0x40, 0x18, 0xf0, 0x1e, 0xf8, 0x99, 0xf0, 0x1e, + 0xf9, 0x05, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x00, 0xfd, 0xe8, 0x00, 0x00, 0x9e, 0x34, + 0x6e, 0x00, 0x04, 0x00, 0xb5, 0x90, 0x1c, 0x0c, + 0x1c, 0x07, 0xf0, 0x1e, 0xf8, 0xc1, 0x2f, 0x01, + 0xda, 0x00, 0x27, 0x01, 0x4b, 0x0e, 0x42, 0x9f, + 0xdd, 0x00, 0x1c, 0x1f, 0x3f, 0x01, 0x04, 0x3f, + 0x21, 0x03, 0x37, 0xff, 0x37, 0x96, 0x48, 0x0b, + 0x60, 0x01, 0x60, 0x47, 0x21, 0x01, 0x60, 0x01, + 0x20, 0x05, 0x1c, 0x21, 0xf0, 0x1e, 0xf8, 0x78, + 0xf0, 0x1e, 0xf8, 0x6e, 0x23, 0x20, 0x43, 0xdb, + 0x40, 0x18, 0xf0, 0x1e, 0xf8, 0x6d, 0xf0, 0x1e, + 0xf8, 0xd9, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x00, 0xfd, 0xe8, 0x6e, 0x00, 0x04, 0x00, + 0xb5, 0x00, 0xf0, 0x1e, 0xf8, 0x99, 0x20, 0x03, + 0x49, 0x05, 0x60, 0x08, 0xf0, 0x1e, 0xf8, 0x58, + 0x23, 0x20, 0x43, 0x18, 0xf0, 0x1e, 0xf8, 0x58, + 0xf0, 0x1e, 0xf8, 0xc4, 0xbc, 0x08, 0x47, 0x18, + 0x6e, 0x00, 0x04, 0x00, 0xb5, 0x00, 0x48, 0x0b, + 0x68, 0x41, 0x31, 0x14, 0x60, 0x41, 0x68, 0x81, + 0x31, 0x01, 0x60, 0x81, 0x48, 0x08, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x28, 0x01, 0xd1, 0x01, + 0xf7, 0xfe, 0xfa, 0x52, 0xbc, 0x08, 0x47, 0x18, + 0x48, 0x04, 0x21, 0x10, 0xf0, 0x0f, 0xf8, 0x34, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, + 0x2e, 0x08, 0x04, 0xfc, 0x2e, 0x08, 0x05, 0xb4, + 0xb5, 0x00, 0xf0, 0x1e, 0xf8, 0x69, 0x21, 0x00, + 0x48, 0x08, 0x60, 0x41, 0x60, 0x81, 0x49, 0x08, + 0x20, 0x07, 0xf0, 0x1e, 0xf8, 0x2d, 0xf0, 0x1e, + 0xf8, 0x23, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x18, + 0xf0, 0x1e, 0xf8, 0x22, 0xf0, 0x1e, 0xf8, 0x8e, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, + 0x2e, 0x00, 0x58, 0xe1, 0x48, 0x01, 0x68, 0x40, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb4, + 0xb5, 0x90, 0x49, 0x0d, 0x1c, 0x0f, 0x48, 0x0d, + 0x24, 0x1e, 0x22, 0x10, 0x1c, 0x23, 0xf0, 0x0f, + 0xf9, 0x35, 0x22, 0x02, 0x21, 0x10, 0x1c, 0x38, + 0x1c, 0x23, 0xf0, 0x0b, 0xfb, 0x9d, 0x49, 0x08, + 0x20, 0x10, 0xf0, 0x1e, 0xf8, 0x05, 0xf0, 0x1d, + 0xff, 0xfb, 0x4b, 0x06, 0x40, 0x18, 0xf0, 0x1d, + 0xff, 0xfb, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x48, 0x10, 0x2e, 0x08, 0x05, 0xb4, + 0x2e, 0x00, 0x59, 0xa5, 0xff, 0xfe, 0xff, 0xff, + 0xb5, 0x00, 0xb0, 0x86, 0x46, 0x68, 0x49, 0x0c, + 0xc9, 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, + 0xc9, 0x0c, 0xc0, 0x0c, 0x48, 0x09, 0xab, 0x00, + 0xcb, 0x0e, 0xb0, 0x03, 0xf0, 0x0f, 0xf9, 0x3a, + 0xb0, 0x03, 0x48, 0x07, 0x68, 0x01, 0x08, 0x4a, + 0xd3, 0x04, 0x08, 0x49, 0x00, 0x49, 0x23, 0x04, + 0x43, 0x19, 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x48, 0x10, 0x2e, 0x08, 0x05, 0xb4, + 0x2e, 0x08, 0x00, 0x04, 0xb5, 0x80, 0x29, 0x0c, + 0xd2, 0x00, 0x21, 0x0c, 0x31, 0x07, 0x08, 0xc9, + 0x00, 0xc9, 0x27, 0x00, 0x68, 0x02, 0x42, 0x82, + 0xd0, 0x03, 0x68, 0x93, 0x42, 0x8b, 0xd3, 0x0d, + 0x1c, 0x17, 0x2f, 0x00, 0xd0, 0x1e, 0x68, 0xb8, + 0x1a, 0x42, 0x2a, 0x0c, 0xd2, 0x00, 0x1c, 0x01, + 0x1a, 0x42, 0xd1, 0x05, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x76, 0xe0, 0x0c, 0x68, 0x12, 0xe7, 0xea, + 0x1d, 0xca, 0x32, 0x01, 0x1a, 0x80, 0x60, 0xb8, + 0x19, 0xc0, 0x1d, 0xc7, 0x37, 0x01, 0x20, 0x00, + 0x60, 0x38, 0x60, 0x78, 0x60, 0xb9, 0x68, 0xb8, + 0x60, 0x38, 0x1d, 0xf8, 0x30, 0x01, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, 0x1f, 0xcc, + 0x3c, 0x01, 0x68, 0x21, 0x19, 0x0a, 0x60, 0xa1, + 0x68, 0x07, 0x32, 0x08, 0x42, 0x87, 0xd1, 0x06, + 0x68, 0x41, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x48, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x42, 0x97, + 0xd1, 0x0f, 0x68, 0x7d, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x46, 0x68, 0xa0, 0x68, 0xb9, 0x18, 0x40, + 0x30, 0x08, 0x60, 0xa0, 0x1c, 0x20, 0x1c, 0x29, + 0xf0, 0x00, 0xf8, 0x36, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0xbb, 0x19, 0xdb, 0x33, 0x08, + 0x42, 0xa3, 0xd1, 0x13, 0x68, 0xb8, 0x18, 0x40, + 0x30, 0x08, 0x60, 0xb8, 0x19, 0xc0, 0x68, 0x3c, + 0x30, 0x08, 0x42, 0xa0, 0xd1, 0xdc, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x29, 0x68, 0xb8, 0x68, 0xa1, + 0x18, 0x40, 0x30, 0x08, 0x60, 0xb8, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x42, 0xbc, 0xd2, 0x06, + 0x68, 0x79, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x14, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x3f, + 0xe7, 0xc0, 0xb5, 0x00, 0x31, 0x10, 0x32, 0x01, + 0x1c, 0x0b, 0x1a, 0x51, 0x39, 0x08, 0x60, 0x99, + 0x60, 0x00, 0x1c, 0x01, 0x60, 0x40, 0x1c, 0x18, + 0xf0, 0x00, 0xf8, 0x02, 0xbc, 0x08, 0x47, 0x18, + 0x68, 0x0a, 0x60, 0x02, 0x60, 0x08, 0x68, 0x02, + 0x60, 0x50, 0x60, 0x41, 0x47, 0x70, 0xc8, 0x06, + 0x38, 0x08, 0x60, 0x11, 0xc8, 0x03, 0x60, 0x41, + 0x47, 0x70, 0xb5, 0x00, 0x1c, 0x0a, 0x1c, 0x01, + 0x48, 0x02, 0xf7, 0xff, 0xff, 0xde, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xd8, + 0xb5, 0x90, 0x1c, 0x07, 0xf0, 0x1d, 0xff, 0x24, + 0x23, 0x11, 0x05, 0x1b, 0x1c, 0x04, 0x43, 0x18, + 0xf0, 0x1d, 0xff, 0x22, 0x1c, 0x39, 0x48, 0x05, + 0xf7, 0xff, 0xff, 0x50, 0x1c, 0x07, 0x1c, 0x20, + 0xf0, 0x1d, 0xff, 0x1a, 0x1c, 0x38, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xd8, + 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, + 0xff, 0x41, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xd8, 0xb5, 0x90, 0x1c, 0x07, + 0xd0, 0x0e, 0xf0, 0x1d, 0xff, 0x01, 0x23, 0x11, + 0x05, 0x1b, 0x1c, 0x04, 0x43, 0x18, 0xf0, 0x1d, + 0xfe, 0xff, 0x1c, 0x39, 0x48, 0x04, 0xf7, 0xff, + 0xff, 0x61, 0x1c, 0x20, 0xf0, 0x1d, 0xfe, 0xf8, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xd8, 0xb5, 0x00, 0x4a, 0x04, + 0xc2, 0x03, 0x1c, 0x0a, 0x1c, 0x01, 0x48, 0x03, + 0xf7, 0xff, 0xff, 0x97, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x05, 0xc0, 0x2e, 0x08, 0x05, 0xd0, + 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, + 0xff, 0x11, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xd0, 0xb5, 0x00, 0x49, 0x08, + 0x68, 0x0a, 0x42, 0x90, 0xd3, 0x02, 0x68, 0x49, + 0x42, 0x88, 0xd9, 0x03, 0xf7, 0xff, 0xff, 0xc6, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x01, 0x48, 0x03, + 0xf7, 0xff, 0xff, 0x30, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x05, 0xc0, 0x2e, 0x08, 0x05, 0xd0, + 0xb5, 0x00, 0x4a, 0x05, 0x60, 0x90, 0x60, 0xd1, + 0x1c, 0x0a, 0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, + 0xff, 0x68, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xc0, 0x2e, 0x08, 0x05, 0xe0, + 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, + 0xfe, 0xe1, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xe0, 0xb5, 0x00, 0x49, 0x08, + 0x68, 0x8a, 0x42, 0x90, 0xd3, 0x02, 0x68, 0xc9, + 0x42, 0x88, 0xd9, 0x03, 0xf7, 0xff, 0xff, 0x96, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x01, 0x48, 0x03, + 0xf7, 0xff, 0xff, 0x00, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x05, 0xc0, 0x2e, 0x08, 0x05, 0xe0, + 0xb5, 0xf0, 0x06, 0x07, 0x0e, 0x3f, 0x04, 0x09, + 0x0c, 0x09, 0xb0, 0x81, 0x91, 0x00, 0x06, 0x16, + 0x0e, 0x36, 0x00, 0xbd, 0x4c, 0x15, 0x59, 0x60, + 0x28, 0x00, 0xd1, 0x15, 0xf7, 0xfb, 0xfa, 0x06, + 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x22, 0x02, + 0x99, 0x01, 0x1c, 0x38, 0xf0, 0x0a, 0xfd, 0x5c, + 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, + 0x1c, 0x38, 0xb0, 0x01, 0xf0, 0x0a, 0xff, 0x18, + 0x20, 0x03, 0x00, 0x71, 0x4a, 0x0a, 0x52, 0x50, + 0x59, 0x60, 0x30, 0x01, 0x51, 0x60, 0x48, 0x09, + 0x23, 0x14, 0x5e, 0xc1, 0x29, 0x00, 0xd1, 0x02, + 0x49, 0x07, 0x4a, 0x08, 0x65, 0xd1, 0x8a, 0x81, + 0x31, 0x01, 0x82, 0x81, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0xca, 0x84, + 0x2e, 0x08, 0x4a, 0x20, 0x2e, 0x08, 0x07, 0x68, + 0x2e, 0x02, 0xc8, 0x94, 0xa0, 0x00, 0x0d, 0x00, + 0xb5, 0xb0, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x0c, + 0x0e, 0x24, 0x00, 0xb9, 0x48, 0x1a, 0x58, 0x42, + 0x3a, 0x01, 0x50, 0x42, 0xd1, 0x20, 0x23, 0x01, + 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x02, 0x1c, 0x38, + 0xf0, 0x0a, 0xfe, 0xe6, 0x22, 0x00, 0xb4, 0x04, + 0x25, 0x00, 0x1c, 0x38, 0x1c, 0x2b, 0x49, 0x13, + 0xf0, 0x0a, 0xfd, 0x1a, 0x00, 0x61, 0xb0, 0x01, + 0x48, 0x11, 0x52, 0x45, 0x48, 0x0f, 0x4a, 0x11, + 0x52, 0x50, 0x00, 0x79, 0x4a, 0x10, 0x52, 0x50, + 0x00, 0x62, 0x19, 0x12, 0x00, 0x92, 0x49, 0x0f, + 0x18, 0x53, 0x81, 0x1d, 0x52, 0x88, 0x80, 0x58, + 0x48, 0x0d, 0x8a, 0x81, 0x39, 0x01, 0x82, 0x81, + 0x23, 0x14, 0x5e, 0xc0, 0x28, 0x00, 0xd1, 0x03, + 0x20, 0xd7, 0x00, 0xc0, 0x49, 0x09, 0x65, 0xc8, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x02, 0xca, 0x84, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x4a, 0x20, 0x2e, 0x08, 0x49, 0xe0, + 0x2e, 0x08, 0x49, 0xa8, 0x2e, 0x08, 0x48, 0x28, + 0x2e, 0x08, 0x07, 0x68, 0xa0, 0x00, 0x0d, 0x00, + 0xb5, 0xf0, 0x04, 0x06, 0x0c, 0x36, 0x04, 0x0c, + 0x0c, 0x24, 0x1c, 0x17, 0xb0, 0x8a, 0x46, 0x69, + 0x1c, 0x30, 0x1c, 0x22, 0xf0, 0x00, 0xf8, 0xb0, + 0x23, 0x01, 0x1c, 0x05, 0x42, 0xd8, 0xd1, 0x03, + 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x4b, 0x4e, 0x42, 0x9c, 0xd1, 0x06, 0xa8, 0x00, + 0x88, 0x00, 0x1c, 0x31, 0x1c, 0x2a, 0xf7, 0xff, + 0xff, 0x57, 0xe0, 0x7f, 0x20, 0x20, 0x40, 0x20, + 0x28, 0x20, 0xd1, 0x1f, 0x06, 0x2a, 0x0e, 0x12, + 0xa8, 0x00, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, + 0x1c, 0x31, 0x1c, 0x23, 0xf7, 0xfd, 0xf8, 0x72, + 0x28, 0x00, 0xd0, 0x6f, 0x48, 0x42, 0x00, 0x69, + 0x4a, 0x42, 0x52, 0x50, 0xa9, 0x00, 0x88, 0x09, + 0x00, 0x49, 0x4a, 0x41, 0x52, 0x50, 0xa8, 0x00, + 0x88, 0x00, 0x1c, 0x29, 0xf0, 0x00, 0xf9, 0xce, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0a, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x21, 0x00, + 0xaa, 0x01, 0x88, 0x3b, 0x0a, 0x1b, 0x70, 0x13, + 0x88, 0x3b, 0x93, 0x09, 0x32, 0x01, 0x06, 0x1b, + 0xd0, 0x02, 0x1c, 0x48, 0x06, 0x00, 0x0e, 0x00, + 0x9b, 0x09, 0x70, 0x13, 0x31, 0x01, 0x32, 0x01, + 0x37, 0x02, 0x29, 0x0e, 0xdb, 0xed, 0x21, 0x00, + 0x23, 0x00, 0x70, 0x13, 0x31, 0x01, 0x32, 0x01, + 0x29, 0x04, 0xdb, 0xfa, 0x21, 0x0c, 0x40, 0x21, + 0x29, 0x0c, 0xd1, 0x03, 0x04, 0x21, 0x0c, 0x09, + 0x24, 0x01, 0x43, 0x0c, 0x28, 0x06, 0xdc, 0x0e, + 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a, + 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 0x06, 0x00, + 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc, + 0xfc, 0x4f, 0xb0, 0x01, 0xe0, 0x1e, 0x28, 0x0a, + 0xdc, 0x0e, 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, + 0x06, 0x2a, 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, + 0x06, 0x00, 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, + 0xf7, 0xfc, 0xfc, 0x58, 0xb0, 0x01, 0xe0, 0x0d, + 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a, + 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 0x06, 0x00, + 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc, + 0xfc, 0x63, 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x05, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0a, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 0xa8, 0x00, + 0x88, 0x00, 0x00, 0x6a, 0x19, 0x52, 0x00, 0x92, + 0x49, 0x0a, 0x52, 0x88, 0x18, 0x50, 0x80, 0x46, + 0x80, 0x84, 0x49, 0x05, 0x80, 0xc1, 0x21, 0x01, + 0x81, 0x01, 0x1c, 0x28, 0xb0, 0x0a, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xb9, 0x6a, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0xe0, + 0x2e, 0x08, 0x49, 0xa8, 0x2e, 0x08, 0x48, 0x28, + 0xb4, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x17, + 0x0c, 0x3f, 0xb0, 0x82, 0x48, 0x58, 0x22, 0x00, + 0x4d, 0x58, 0x95, 0x01, 0x1c, 0x06, 0x00, 0x53, + 0x9d, 0x01, 0x5a, 0xed, 0x42, 0xb5, 0xd1, 0x02, + 0x04, 0x10, 0x0c, 0x00, 0xe0, 0x02, 0x32, 0x01, + 0x2a, 0x20, 0xdb, 0xf4, 0x42, 0xb0, 0xd1, 0x04, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, + 0x47, 0x70, 0x80, 0x0e, 0x4a, 0x4e, 0x92, 0x00, + 0x4d, 0x4e, 0x4a, 0x4f, 0x4b, 0x4f, 0x42, 0x9f, + 0xd1, 0x32, 0x23, 0x00, 0x00, 0x5f, 0x5b, 0xd7, + 0x42, 0xa7, 0xd1, 0x0a, 0x00, 0x5f, 0x5b, 0xef, + 0x2f, 0x03, 0xd1, 0x01, 0x80, 0x0b, 0xe0, 0x07, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, + 0x47, 0x70, 0x33, 0x01, 0x2b, 0x1c, 0xdb, 0xed, + 0x88, 0x0f, 0x4b, 0x3f, 0x42, 0x9f, 0xd1, 0x0a, + 0x27, 0x00, 0x00, 0x7b, 0x5a, 0xd6, 0x4b, 0x3c, + 0x42, 0x9e, 0xd1, 0x01, 0x80, 0x0f, 0xe0, 0x02, + 0x37, 0x01, 0x2f, 0x1c, 0xdb, 0xf5, 0x88, 0x0f, + 0x4b, 0x37, 0x42, 0x9f, 0xd1, 0x04, 0x20, 0x00, + 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x23, 0x03, 0x00, 0x47, 0x9e, 0x00, 0x53, 0xf3, + 0x88, 0x0f, 0x00, 0x7f, 0x53, 0xeb, 0xe0, 0x54, + 0x23, 0x20, 0x40, 0x3b, 0x2b, 0x20, 0xd1, 0x1e, + 0x23, 0x00, 0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, + 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, 0x2b, 0x1c, + 0xdb, 0xf3, 0x27, 0x00, 0x00, 0x7b, 0x5a, 0xd5, + 0x42, 0xb5, 0xd1, 0x01, 0x80, 0x0f, 0xe0, 0x02, + 0x37, 0x01, 0x2f, 0x1c, 0xdb, 0xf6, 0x88, 0x0f, + 0x42, 0xb7, 0xd1, 0x36, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x23, 0x00, + 0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, 0xd1, 0x0a, + 0x00, 0x5f, 0x5b, 0xef, 0x2f, 0x02, 0xd1, 0x01, + 0x80, 0x0b, 0xe0, 0x07, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, + 0x2b, 0x1c, 0xdb, 0xed, 0x88, 0x0f, 0x4b, 0x14, + 0x42, 0x9f, 0xd1, 0x0a, 0x27, 0x00, 0x00, 0x7b, + 0x5a, 0xd6, 0x4b, 0x11, 0x42, 0x9e, 0xd1, 0x01, + 0x80, 0x0f, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1c, + 0xdb, 0xf5, 0x88, 0x0f, 0x4b, 0x0c, 0x42, 0x9f, + 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x23, 0x02, 0x00, 0x47, + 0x9e, 0x00, 0x53, 0xf3, 0x88, 0x0f, 0x00, 0x7f, + 0x53, 0xeb, 0x00, 0x43, 0x9d, 0x01, 0x52, 0xec, + 0x88, 0x09, 0x00, 0x49, 0x52, 0x54, 0x04, 0x00, + 0x14, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0xe0, + 0x2e, 0x08, 0x4a, 0x20, 0x2e, 0x08, 0x4a, 0x60, + 0x2e, 0x08, 0x49, 0xa8, 0x00, 0x00, 0xb9, 0x6a, + 0xb5, 0xf0, 0x04, 0x07, 0x0c, 0x3f, 0xb0, 0x81, + 0x4a, 0x34, 0x92, 0x00, 0x1c, 0x11, 0x42, 0x97, + 0xd0, 0x01, 0x2f, 0x20, 0xdb, 0x05, 0x20, 0x00, + 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x7c, 0x4a, 0x2e, 0x5b, 0x10, + 0x42, 0x88, 0xd1, 0x05, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x49, 0x28, 0x53, 0x11, 0x23, 0x00, 0x49, 0x29, + 0x00, 0x5e, 0x5b, 0x8e, 0x42, 0x86, 0xd1, 0x02, + 0x04, 0x1d, 0x0c, 0x2d, 0xe0, 0x02, 0x33, 0x01, + 0x2b, 0x1c, 0xdb, 0xf5, 0x23, 0x00, 0x00, 0x5e, + 0x5b, 0x96, 0x42, 0x86, 0xd1, 0x03, 0x04, 0x1a, + 0x0c, 0x12, 0x92, 0x00, 0xe0, 0x02, 0x33, 0x01, + 0x2b, 0x20, 0xdb, 0xf4, 0x9a, 0x00, 0x4e, 0x1b, + 0x42, 0xb2, 0xd1, 0x0d, 0x22, 0x00, 0x00, 0x53, + 0x5a, 0xcb, 0x42, 0x83, 0xd1, 0x05, 0x23, 0x00, + 0x00, 0x50, 0x4a, 0x19, 0x52, 0x13, 0x52, 0x0e, + 0xe0, 0x02, 0x32, 0x01, 0x2a, 0x1c, 0xdb, 0xf2, + 0x4e, 0x16, 0x5b, 0x30, 0x28, 0x02, 0xd1, 0x05, + 0x23, 0x00, 0x53, 0x33, 0x1c, 0x28, 0x1c, 0x39, + 0xf0, 0x00, 0xf8, 0x38, 0x5b, 0x30, 0x28, 0x01, + 0xd1, 0x0a, 0x1c, 0x38, 0xf7, 0xfc, 0xff, 0xe6, + 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x5b, 0x30, 0x28, 0x03, 0xd1, 0x03, 0x1c, 0x28, + 0x1c, 0x39, 0xf7, 0xff, 0xfd, 0xcd, 0x04, 0x38, + 0x14, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x49, 0xe0, 0x2e, 0x08, 0x49, 0xa8, + 0x2e, 0x08, 0x4a, 0x60, 0x2e, 0x08, 0x4a, 0x20, + 0x04, 0x01, 0x0c, 0x09, 0x20, 0x02, 0x00, 0x4b, + 0x18, 0x5b, 0x00, 0x9b, 0x4a, 0x03, 0x18, 0x99, + 0x81, 0x08, 0x48, 0x03, 0x52, 0xd0, 0x80, 0x48, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x48, 0x28, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x04, 0x0f, + 0x0c, 0x3f, 0x06, 0x39, 0x0e, 0x09, 0x06, 0x00, + 0x0e, 0x00, 0xf7, 0xfc, 0xfc, 0x1b, 0x20, 0x00, + 0x00, 0x7b, 0x19, 0xdb, 0x00, 0x9b, 0x4a, 0x04, + 0x18, 0x99, 0x81, 0x08, 0x48, 0x03, 0x52, 0xd0, + 0x80, 0x48, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x48, 0x28, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0x80, 0x04, 0x09, 0x0c, 0x09, 0x78, 0x42, + 0x02, 0x12, 0x78, 0x83, 0x43, 0x1a, 0x05, 0x12, + 0x0d, 0x12, 0x27, 0x00, 0x43, 0xff, 0x32, 0x03, + 0x42, 0x8a, 0xd0, 0x03, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x0b, 0xf9, 0xa0, + 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9c, 0x09, + 0x04, 0x00, 0x0c, 0x00, 0xb0, 0x81, 0x90, 0x00, + 0x06, 0x09, 0x0e, 0x09, 0x06, 0x12, 0x0e, 0x12, + 0xb0, 0x88, 0x4f, 0x16, 0x68, 0xb8, 0x28, 0x0c, + 0xdb, 0x06, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x09, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0x23, 0x00, 0x00, 0x45, 0x46, 0x6e, + 0x53, 0x73, 0x30, 0x01, 0x04, 0x00, 0x14, 0x00, + 0x28, 0x10, 0xdb, 0xf7, 0x02, 0x08, 0x43, 0x10, + 0xab, 0x00, 0x80, 0x18, 0x46, 0x6a, 0x21, 0x04, + 0x98, 0x08, 0xf7, 0xff, 0xfd, 0x95, 0x28, 0x00, + 0xda, 0x01, 0xb0, 0x09, 0xe7, 0xe4, 0x00, 0x81, + 0x4a, 0x05, 0x50, 0x54, 0x9b, 0x0c, 0x4a, 0x05, + 0x50, 0x53, 0x68, 0xb9, 0x31, 0x01, 0x60, 0xb9, + 0xb0, 0x09, 0xe7, 0xd9, 0x2e, 0x08, 0x07, 0x80, + 0x2e, 0x08, 0x4b, 0x18, 0x2e, 0x08, 0x4a, 0x98, + 0xb5, 0x80, 0x04, 0x07, 0x14, 0x3f, 0xd5, 0x04, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0xf4, + 0x20, 0x00, 0x00, 0xb9, 0x4a, 0x05, 0x50, 0x50, + 0x4a, 0x05, 0x50, 0x50, 0x49, 0x05, 0x68, 0x8a, + 0x3a, 0x01, 0x60, 0x8a, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x4a, 0x98, + 0x2e, 0x08, 0x4b, 0x18, 0x2e, 0x08, 0x07, 0x80, + 0xb5, 0x90, 0x27, 0x00, 0x4c, 0x08, 0x00, 0xb8, + 0x58, 0x20, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38, + 0xf7, 0xff, 0xff, 0xd6, 0x37, 0x01, 0x2f, 0x20, + 0xdb, 0xf5, 0x20, 0x00, 0x49, 0x03, 0x60, 0xc8, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x4a, 0x98, 0x2e, 0x08, 0x07, 0x80, + 0xb5, 0x00, 0xf7, 0xff, 0xff, 0xe5, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0xff, 0x04, 0x00, 0x14, 0x00, + 0xb0, 0x83, 0x90, 0x00, 0x1c, 0x0f, 0x04, 0x11, + 0x0c, 0x09, 0x24, 0x00, 0x1c, 0x38, 0x1c, 0x0d, + 0xb0, 0x81, 0xf7, 0xff, 0xff, 0x59, 0x1c, 0x01, + 0x20, 0x00, 0x29, 0x00, 0xd0, 0x04, 0xb0, 0x04, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x78, 0xf9, 0x02, 0x09, 0x79, 0x3a, 0x43, 0x11, + 0x04, 0x09, 0x0c, 0x09, 0x9b, 0x07, 0x88, 0x1a, + 0x42, 0x91, 0xd0, 0x01, 0xb0, 0x04, 0xe7, 0xef, + 0x7a, 0x39, 0x02, 0x09, 0x7a, 0x7a, 0x43, 0x11, + 0x04, 0xc9, 0x0c, 0xc9, 0x91, 0x00, 0x7a, 0xb9, + 0x02, 0x09, 0x7a, 0xfa, 0x43, 0x11, 0x05, 0x0b, + 0x0d, 0x1b, 0x1d, 0xf9, 0x31, 0x05, 0x27, 0x00, + 0x1d, 0xd8, 0x30, 0x09, 0x1a, 0x2a, 0x2b, 0x00, + 0xdd, 0x0a, 0x78, 0x08, 0x28, 0x09, 0xd1, 0x00, + 0x37, 0x01, 0x78, 0x48, 0x1c, 0x85, 0x1b, 0x5b, + 0x18, 0x40, 0x1c, 0x81, 0x2b, 0x00, 0xdc, 0xf4, + 0x2a, 0x00, 0xdd, 0x36, 0x48, 0x2c, 0x88, 0x06, + 0x96, 0x03, 0x88, 0x85, 0x95, 0x02, 0x78, 0xc8, + 0x02, 0x00, 0x79, 0x0b, 0x43, 0x18, 0x05, 0x00, + 0x0d, 0x00, 0x78, 0x0b, 0x2b, 0x01, 0xd0, 0x01, + 0x2b, 0x02, 0xd1, 0x06, 0x78, 0x4d, 0x02, 0x2d, + 0x78, 0x8e, 0x43, 0x35, 0x04, 0xed, 0x0c, 0xed, + 0x9e, 0x03, 0x2b, 0x04, 0xd0, 0x01, 0x2b, 0x03, + 0xd1, 0x09, 0x78, 0x4b, 0x02, 0x1b, 0x78, 0x8d, + 0x43, 0x2b, 0x04, 0xdb, 0x0c, 0xdb, 0x9d, 0x02, + 0x42, 0xab, 0xd1, 0x00, 0x24, 0x01, 0x1d, 0x43, + 0x1a, 0xd2, 0x31, 0x05, 0x28, 0x00, 0xdd, 0x0a, + 0x78, 0x0b, 0x2b, 0x09, 0xd1, 0x00, 0x37, 0x01, + 0x78, 0x4b, 0x1c, 0x9d, 0x1b, 0x40, 0x18, 0x59, + 0x31, 0x02, 0x28, 0x00, 0xdc, 0xf4, 0x2a, 0x00, + 0xdc, 0xcd, 0x2c, 0x00, 0xd0, 0x17, 0xf7, 0xff, + 0xff, 0x63, 0x99, 0x00, 0x48, 0x0f, 0x80, 0x01, + 0x2f, 0x00, 0xd0, 0x0d, 0x20, 0x0a, 0xb0, 0x84, + 0xab, 0x00, 0x80, 0x18, 0x20, 0x02, 0x70, 0x98, + 0x9b, 0x0b, 0x93, 0x01, 0x46, 0x69, 0x20, 0x75, + 0xf0, 0x04, 0xff, 0x76, 0xb0, 0x04, 0xe0, 0x07, + 0xf7, 0xfa, 0xf8, 0xf4, 0xe0, 0x04, 0x98, 0x01, + 0xf7, 0xff, 0xff, 0x2a, 0xf0, 0x00, 0xf8, 0x22, + 0x20, 0x00, 0xb0, 0x04, 0xe7, 0x74, 0x00, 0x00, + 0x2e, 0x08, 0x07, 0x80, 0x2e, 0x08, 0x00, 0x08, + 0xb4, 0x90, 0x04, 0x02, 0x0c, 0x12, 0x04, 0x0f, + 0x0c, 0x3f, 0x4b, 0x07, 0x68, 0xd8, 0x28, 0x80, + 0xda, 0x08, 0x2a, 0x00, 0xd0, 0x06, 0x00, 0x41, + 0x4c, 0x04, 0x52, 0x67, 0x4f, 0x04, 0x52, 0x7a, + 0x30, 0x01, 0x60, 0xd8, 0xbc, 0x90, 0x47, 0x70, + 0x2e, 0x08, 0x07, 0x80, 0x2e, 0x08, 0x4b, 0x98, + 0x2e, 0x08, 0x4c, 0x98, 0xb5, 0x90, 0x4f, 0x13, + 0x24, 0x00, 0x43, 0xe4, 0x68, 0xf8, 0x28, 0x00, + 0xd1, 0x03, 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x40, 0x49, 0x0e, 0x18, 0x41, + 0x1e, 0x8a, 0xb4, 0x04, 0x49, 0x0d, 0x18, 0x40, + 0x38, 0x40, 0x8f, 0xc0, 0x4b, 0x0c, 0x22, 0xff, + 0x21, 0x02, 0xf7, 0xff, 0xfe, 0xaf, 0xb0, 0x01, + 0x28, 0x00, 0xda, 0x03, 0x1c, 0x20, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x68, 0xf8, 0x38, 0x01, + 0x60, 0xf8, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x07, 0x80, + 0x2e, 0x08, 0x4c, 0x98, 0x2e, 0x08, 0x4b, 0x98, + 0x2e, 0x00, 0x62, 0xef, 0xb5, 0xf0, 0x04, 0x05, + 0x14, 0x2d, 0x1c, 0x0f, 0x04, 0x11, 0x0c, 0x09, + 0x1c, 0x0e, 0x4c, 0x28, 0x23, 0x02, 0x69, 0x20, + 0x42, 0xd8, 0xd0, 0x04, 0x1c, 0x38, 0xf7, 0xff, + 0xfe, 0x6b, 0x28, 0x00, 0xd0, 0x06, 0x1c, 0x28, + 0xf7, 0xff, 0xfe, 0xc2, 0x20, 0x00, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x79, 0xb8, 0x69, 0x21, + 0x42, 0x88, 0xd1, 0x09, 0x20, 0x01, 0x43, 0xc0, + 0x61, 0x20, 0x1c, 0x28, 0xf7, 0xff, 0xfe, 0xb4, + 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x23, 0x01, 0x42, 0xd9, 0xd1, 0x02, 0x61, 0x20, + 0x20, 0x00, 0x60, 0xe0, 0x37, 0x08, 0x1f, 0xf4, + 0x3c, 0x05, 0x2c, 0x00, 0xdd, 0x11, 0x78, 0x38, + 0x02, 0x00, 0x78, 0x79, 0x43, 0x08, 0x04, 0x00, + 0x0c, 0x00, 0x78, 0xb9, 0x02, 0x09, 0x78, 0xfa, + 0x43, 0x11, 0x04, 0xc9, 0x0c, 0xc9, 0xf7, 0xff, + 0xff, 0x77, 0x37, 0x04, 0x3c, 0x04, 0x2c, 0x00, + 0xdc, 0xed, 0xf7, 0xff, 0xff, 0x8b, 0xf7, 0xff, + 0xff, 0x89, 0xf7, 0xff, 0xff, 0x87, 0xf7, 0xff, + 0xff, 0x85, 0xf7, 0xff, 0xff, 0x83, 0xf7, 0xff, + 0xff, 0x81, 0xf7, 0xff, 0xff, 0x7f, 0xf7, 0xff, + 0xff, 0x7d, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x07, 0x80, + 0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, + 0x0c, 0x2d, 0x26, 0x00, 0x43, 0xf6, 0x4f, 0x0f, + 0x62, 0x3e, 0x61, 0xfe, 0x61, 0xbe, 0xf7, 0xff, + 0xfe, 0x8f, 0x2d, 0x00, 0xd0, 0x13, 0x2c, 0x00, + 0xd0, 0x11, 0x0c, 0xf0, 0x42, 0x85, 0xd0, 0x0e, + 0x42, 0x84, 0xd0, 0x0c, 0x80, 0x3c, 0x80, 0xbd, + 0x20, 0x00, 0x61, 0x3e, 0x22, 0x00, 0x61, 0x78, + 0xb4, 0x04, 0x4b, 0x05, 0x22, 0xff, 0x21, 0x00, + 0xf7, 0xff, 0xfe, 0x1c, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x07, 0x80, + 0x2e, 0x00, 0x64, 0xc9, 0x56, 0x47, 0x41, 0x38, + 0x78, 0x31, 0x36, 0x00, 0xb5, 0x00, 0xb0, 0x81, + 0x48, 0x05, 0x69, 0xc0, 0x68, 0x80, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x00, 0xf0, 0x13, 0xfa, 0x22, + 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x92, 0x7c, 0xb5, 0xf0, 0x27, 0x00, + 0xb0, 0x85, 0x97, 0x00, 0x26, 0x10, 0x96, 0x01, + 0x25, 0x05, 0x01, 0xed, 0x95, 0x02, 0x20, 0xff, + 0x30, 0xd1, 0x90, 0x03, 0x97, 0x04, 0x22, 0x00, + 0x21, 0x00, 0xb4, 0x06, 0x4c, 0x0d, 0x69, 0xe0, + 0x68, 0x81, 0x1c, 0x08, 0xaa, 0x02, 0x1c, 0x3b, + 0xf0, 0x13, 0xfc, 0x8a, 0xb0, 0x02, 0x97, 0x00, + 0x20, 0xff, 0x30, 0xd1, 0x90, 0x01, 0x95, 0x02, + 0x96, 0x03, 0x97, 0x04, 0x69, 0xe0, 0x68, 0x80, + 0x46, 0x69, 0xf0, 0x13, 0xfb, 0xbb, 0xf7, 0xff, + 0xff, 0xc9, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0x90, 0x20, 0x07, 0xb0, 0x85, 0xf0, 0x08, + 0xff, 0xaf, 0x24, 0xff, 0x34, 0xe1, 0x22, 0x05, + 0x01, 0xd2, 0x21, 0x00, 0x20, 0x07, 0x1c, 0x23, + 0xf0, 0x08, 0xff, 0xbe, 0x27, 0x00, 0x22, 0x00, + 0x21, 0x02, 0x20, 0x07, 0x1c, 0x3b, 0xf0, 0x09, + 0xfb, 0x67, 0x22, 0x01, 0x21, 0x01, 0x20, 0x07, + 0x1c, 0x3b, 0xf0, 0x09, 0xfb, 0x19, 0x22, 0x32, + 0x21, 0x32, 0x20, 0x07, 0xf0, 0x09, 0xf8, 0x74, + 0x97, 0x00, 0x97, 0x01, 0x20, 0x05, 0x01, 0xc0, + 0x90, 0x02, 0x94, 0x03, 0x97, 0x04, 0x48, 0x06, + 0x69, 0xc0, 0x68, 0x80, 0x46, 0x69, 0xf0, 0x13, + 0xfb, 0x85, 0xf7, 0xff, 0xff, 0x93, 0xb0, 0x05, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x92, 0x7c, 0xb4, 0x80, 0x01, 0x00, + 0x4b, 0x2a, 0x18, 0xc0, 0x4b, 0x2a, 0x69, 0xdb, + 0x69, 0x9f, 0x00, 0x8b, 0x18, 0x59, 0x02, 0x09, + 0x18, 0x89, 0x18, 0x79, 0x78, 0x02, 0x70, 0x0a, + 0x78, 0x42, 0x1d, 0xcb, 0x33, 0x39, 0x74, 0x1a, + 0x78, 0x82, 0x1d, 0xcb, 0x33, 0x99, 0x70, 0x1a, + 0x78, 0xc2, 0x1d, 0xcb, 0x33, 0xd9, 0x74, 0x1a, + 0x79, 0x02, 0x1d, 0xcb, 0x33, 0xff, 0x33, 0x3a, + 0x70, 0x1a, 0x79, 0x42, 0x1d, 0xcb, 0x33, 0xff, + 0x33, 0x7a, 0x74, 0x1a, 0x79, 0x82, 0x1d, 0xcb, + 0x33, 0xff, 0x33, 0xda, 0x70, 0x1a, 0x79, 0xc2, + 0x23, 0x11, 0x01, 0x5b, 0x18, 0xcb, 0x74, 0x1a, + 0x7a, 0x02, 0x23, 0x05, 0x01, 0xdb, 0x18, 0xcb, + 0x70, 0x1a, 0x7a, 0x42, 0x23, 0x0b, 0x01, 0x9b, + 0x18, 0xcb, 0x74, 0x1a, 0x7a, 0x82, 0x23, 0x19, + 0x01, 0x5b, 0x18, 0xcb, 0x70, 0x1a, 0x7a, 0xc2, + 0x23, 0x1b, 0x01, 0x5b, 0x18, 0xcb, 0x74, 0x1a, + 0x7b, 0x02, 0x23, 0x0f, 0x01, 0x9b, 0x18, 0xcb, + 0x70, 0x1a, 0x7b, 0x42, 0x23, 0x01, 0x02, 0x9b, + 0x18, 0xcb, 0x74, 0x1a, 0x7b, 0x82, 0x23, 0x23, + 0x01, 0x5b, 0x18, 0xcb, 0x70, 0x1a, 0x7b, 0xc0, + 0x23, 0x25, 0x01, 0x5b, 0x18, 0xc9, 0x74, 0x08, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x07, 0xa4, + 0x2e, 0x08, 0x92, 0x7c, 0xb5, 0xb0, 0x23, 0x00, + 0x1c, 0x07, 0x56, 0xc0, 0x1c, 0x14, 0x1c, 0x0d, + 0x28, 0x00, 0xd0, 0x0f, 0x20, 0x50, 0x1c, 0x21, + 0xf0, 0x17, 0xfd, 0x3e, 0x19, 0x41, 0x23, 0x00, + 0x56, 0xf8, 0x1c, 0x22, 0xf7, 0xff, 0xff, 0x92, + 0x23, 0x00, 0x37, 0x01, 0x56, 0xf8, 0x34, 0x01, + 0x28, 0x00, 0xd1, 0xef, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x90, 0x06, 0x00, 0x0e, 0x00, + 0x04, 0x09, 0x14, 0x09, 0x04, 0x17, 0x14, 0x3f, + 0x09, 0x03, 0xb0, 0x81, 0x4a, 0x08, 0x5c, 0xd4, + 0xab, 0x00, 0x70, 0x1c, 0x07, 0x00, 0x0f, 0x00, + 0x5c, 0x10, 0x70, 0x58, 0x20, 0x00, 0x70, 0x98, + 0x46, 0x68, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xce, + 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x17, 0xbc, 0xb5, 0x90, 0x04, 0x00, + 0x0c, 0x00, 0x04, 0x09, 0x14, 0x09, 0x04, 0x17, + 0x14, 0x3f, 0x0b, 0x03, 0xb0, 0x82, 0x4a, 0x0f, + 0x5c, 0xd4, 0xab, 0x00, 0x70, 0x1c, 0x0a, 0x03, + 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xd4, 0xab, 0x00, + 0x70, 0x5c, 0x09, 0x03, 0x07, 0x1b, 0x0f, 0x1b, + 0x5c, 0xd4, 0xab, 0x00, 0x70, 0x9c, 0x07, 0x00, + 0x0f, 0x00, 0x5c, 0x10, 0x70, 0xd8, 0x20, 0x00, + 0x71, 0x18, 0x46, 0x68, 0x1c, 0x3a, 0xf7, 0xff, + 0xff, 0xa5, 0xb0, 0x02, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xbc, + 0xb5, 0x90, 0x04, 0x0f, 0x14, 0x3f, 0x04, 0x12, + 0x14, 0x12, 0x0f, 0x03, 0xb0, 0x83, 0x49, 0x1b, + 0x5c, 0xcc, 0xab, 0x00, 0x70, 0x1c, 0x0e, 0x03, + 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x00, + 0x70, 0x5c, 0x0d, 0x03, 0x07, 0x1b, 0x0f, 0x1b, + 0x5c, 0xcc, 0xab, 0x00, 0x70, 0x9c, 0x0c, 0x03, + 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x00, + 0x70, 0xdc, 0x0b, 0x03, 0x07, 0x1b, 0x0f, 0x1b, + 0x5c, 0xcc, 0xab, 0x01, 0x70, 0x1c, 0x0a, 0x03, + 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x01, + 0x70, 0x5c, 0x09, 0x03, 0x07, 0x1b, 0x0f, 0x1b, + 0x5c, 0xcc, 0xab, 0x01, 0x70, 0x9c, 0x07, 0x00, + 0x0f, 0x00, 0x5c, 0x08, 0x70, 0xd8, 0x20, 0x00, + 0x71, 0x18, 0x46, 0x68, 0x1c, 0x39, 0xf7, 0xff, + 0xff, 0x65, 0xb0, 0x03, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xbc, + 0xb5, 0xf0, 0x1c, 0x04, 0x04, 0x10, 0x14, 0x00, + 0xb0, 0x81, 0x90, 0x00, 0x04, 0x1e, 0x14, 0x36, + 0x22, 0x3c, 0x1c, 0x20, 0x1c, 0x0f, 0xb0, 0x85, + 0xf0, 0x17, 0xfc, 0xd2, 0xa3, 0x72, 0xcb, 0x0c, + 0xf0, 0x17, 0xfc, 0xde, 0xf0, 0x17, 0xfc, 0xe0, + 0x4d, 0x71, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x18, + 0x22, 0x38, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0xc3, 0xa3, 0x6b, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0xcf, 0xf0, 0x17, 0xfc, 0xd1, 0x5c, 0x28, + 0xab, 0x02, 0x70, 0x58, 0x22, 0x34, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0xb5, 0xa3, 0x64, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0xc1, 0xf0, 0x17, + 0xfc, 0xc3, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x98, + 0x22, 0x30, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0xa7, 0xa3, 0x5d, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0xb3, 0xf0, 0x17, 0xfc, 0xb5, 0x5c, 0x28, + 0xab, 0x02, 0x70, 0xd8, 0x22, 0x2c, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x99, 0xa3, 0x56, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0xa5, 0xf0, 0x17, + 0xfc, 0xa7, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x18, + 0x22, 0x28, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0x8b, 0xa3, 0x4f, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0x97, 0xf0, 0x17, 0xfc, 0x99, 0x5c, 0x28, + 0xab, 0x03, 0x70, 0x58, 0x22, 0x24, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x7d, 0xa3, 0x48, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x89, 0xf0, 0x17, + 0xfc, 0x8b, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x98, + 0x22, 0x20, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0x6f, 0xa3, 0x41, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0x7b, 0xf0, 0x17, 0xfc, 0x7d, 0x5c, 0x28, + 0xab, 0x03, 0x70, 0xd8, 0x22, 0x1c, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x61, 0xa3, 0x3a, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x6d, 0xf0, 0x17, + 0xfc, 0x6f, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x18, + 0x22, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0x53, 0xa3, 0x33, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0x5f, 0xf0, 0x17, 0xfc, 0x61, 0x5c, 0x28, + 0xab, 0x00, 0x70, 0x58, 0x22, 0x14, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x45, 0xa3, 0x2c, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x51, 0xf0, 0x17, + 0xfc, 0x53, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x98, + 0x22, 0x10, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0x37, 0xa3, 0x25, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0x43, 0xf0, 0x17, 0xfc, 0x45, 0x5c, 0x28, + 0xab, 0x00, 0x70, 0xd8, 0x22, 0x0c, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x29, 0xa3, 0x1e, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x35, 0xf0, 0x17, + 0xfc, 0x37, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x18, + 0x22, 0x08, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0x1b, 0xa3, 0x17, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0x27, 0xf0, 0x17, 0xfc, 0x29, 0x5c, 0x28, + 0xab, 0x01, 0x70, 0x58, 0x22, 0x04, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x0d, 0xa3, 0x10, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x19, 0xf0, 0x17, + 0xfc, 0x1b, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x98, + 0xa3, 0x0b, 0xcb, 0x0c, 0x1c, 0x20, 0x1c, 0x39, + 0xf0, 0x17, 0xfc, 0x0e, 0xf0, 0x17, 0xfc, 0x10, + 0x5c, 0x28, 0xab, 0x01, 0x70, 0xd8, 0x20, 0x00, + 0x73, 0x18, 0x46, 0x68, 0x99, 0x05, 0x1c, 0x32, + 0x33, 0x0c, 0xf7, 0xff, 0xfe, 0x6f, 0xb0, 0x06, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x17, 0xbc, 0x21, 0x00, 0xb0, 0x81, + 0x91, 0x00, 0xe0, 0x02, 0x99, 0x00, 0x31, 0x01, + 0x91, 0x00, 0x99, 0x00, 0x42, 0x81, 0xdb, 0xf9, + 0xb0, 0x01, 0x47, 0x70, 0xb5, 0xf0, 0x06, 0x06, + 0x0e, 0x36, 0x25, 0x02, 0x48, 0x0d, 0x60, 0x05, + 0x27, 0x07, 0x4c, 0x0d, 0x60, 0x25, 0x20, 0x01, + 0x40, 0xb8, 0x40, 0x30, 0xd0, 0x01, 0x20, 0x03, + 0xe0, 0x00, 0x20, 0x02, 0x49, 0x09, 0x60, 0x08, + 0x20, 0x0a, 0xf7, 0xff, 0xff, 0xdf, 0x20, 0x03, + 0x60, 0x20, 0x20, 0x0c, 0xf7, 0xff, 0xff, 0xda, + 0x3f, 0x01, 0xd5, 0xeb, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x6e, 0x00, 0x14, 0x00, + 0x6e, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x12, 0x00, + 0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x0f, + 0x0e, 0x3f, 0x06, 0x00, 0x0e, 0x00, 0x23, 0x80, + 0x43, 0x18, 0xf7, 0xff, 0xff, 0xcf, 0x20, 0x14, + 0xf7, 0xff, 0xff, 0xc0, 0x1c, 0x38, 0xf7, 0xff, + 0xff, 0xc9, 0x20, 0x03, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x00, 0x49, 0x04, 0x60, 0x08, 0x49, 0x04, + 0x60, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x12, 0x00, + 0x6e, 0x00, 0x13, 0x00, 0xb5, 0x00, 0x21, 0x01, + 0x20, 0x02, 0xf7, 0xff, 0xff, 0xd9, 0x48, 0x10, + 0xf7, 0xff, 0xff, 0xa4, 0x21, 0x00, 0x20, 0x02, + 0xf7, 0xff, 0xff, 0xd2, 0x48, 0x0d, 0xf7, 0xff, + 0xff, 0x9d, 0x21, 0x44, 0x20, 0x00, 0xf7, 0xff, + 0xff, 0xcb, 0x21, 0x81, 0x20, 0x01, 0xf7, 0xff, + 0xff, 0xc7, 0x21, 0xf0, 0x20, 0x02, 0xf7, 0xff, + 0xff, 0xc3, 0x21, 0x45, 0x20, 0x03, 0xf7, 0xff, + 0xff, 0xbf, 0x21, 0x45, 0x20, 0x04, 0xf7, 0xff, + 0xff, 0xbb, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0xc3, 0x50, + 0xb5, 0x80, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x08, + 0x0e, 0x00, 0x28, 0x45, 0xdd, 0x00, 0x20, 0x45, + 0x1d, 0xc1, 0x31, 0x79, 0x20, 0x03, 0xf7, 0xff, + 0xff, 0xa7, 0x2f, 0x45, 0xdd, 0x00, 0x27, 0x45, + 0x20, 0x04, 0x1d, 0xf9, 0x31, 0x79, 0xf7, 0xff, + 0xff, 0x9f, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x00, 0xf0, 0x1c, 0xfe, 0xcd, 0x23, 0x01, + 0x03, 0x5b, 0x43, 0x18, 0xf0, 0x1c, 0xfe, 0xcc, + 0xf0, 0x1c, 0xfe, 0xc6, 0x23, 0x01, 0x03, 0x9b, + 0x43, 0x18, 0xf0, 0x1c, 0xfe, 0xc5, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x00, 0xf0, 0x1c, 0xfe, 0xbc, + 0x4b, 0x05, 0x40, 0x18, 0xf0, 0x1c, 0xfe, 0xbc, + 0xf0, 0x1c, 0xfe, 0xb6, 0x4b, 0x03, 0x40, 0x18, + 0xf0, 0x1c, 0xfe, 0xb6, 0xbc, 0x08, 0x47, 0x18, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xb5, 0x80, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0xd8, + 0x07, 0xf8, 0x0f, 0x40, 0x49, 0x0a, 0x58, 0x08, + 0x0c, 0x39, 0xd3, 0x05, 0x23, 0x01, 0x02, 0x5b, + 0x68, 0x01, 0x43, 0x19, 0x60, 0x01, 0xe0, 0x03, + 0x68, 0x01, 0x4b, 0x06, 0x40, 0x19, 0x60, 0x01, + 0xf0, 0x13, 0xff, 0x5e, 0xf7, 0xff, 0xff, 0xd5, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0x44, 0xff, 0xff, 0xfd, 0xff, + 0xb5, 0x00, 0x4a, 0x09, 0x1f, 0x11, 0x20, 0x0e, + 0xf0, 0x13, 0xff, 0x08, 0x28, 0x00, 0xd1, 0x09, + 0x48, 0x06, 0xf0, 0x13, 0xff, 0x49, 0x49, 0x06, + 0x20, 0x0e, 0xf0, 0x1c, 0xfe, 0x85, 0xf7, 0xff, + 0xff, 0xbc, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x17, 0xe0, 0x2e, 0x08, 0x1a, 0x38, + 0x2e, 0x00, 0x6c, 0xab, 0xb5, 0x00, 0xf7, 0xff, + 0xff, 0x9f, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x1c, + 0xfe, 0x73, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, + 0xa0, 0x0d, 0x22, 0x00, 0x21, 0x0b, 0xf7, 0xff, + 0xfd, 0x61, 0x4f, 0x0d, 0x22, 0x0a, 0x21, 0x0b, + 0x68, 0x38, 0xf7, 0xff, 0xfd, 0xbd, 0x68, 0x38, + 0x30, 0x01, 0x60, 0x38, 0x48, 0x09, 0x7c, 0x01, + 0x29, 0x01, 0xd1, 0x05, 0x69, 0x41, 0x29, 0xff, + 0xd0, 0x02, 0x20, 0x01, 0xf0, 0x00, 0xf8, 0x0c, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x49, 0x52, 0x20, 0x49, 0x52, 0x51, 0x3a, 0x00, + 0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x17, 0xcc, + 0xb5, 0x90, 0x06, 0x0c, 0x0e, 0x24, 0x1c, 0x07, + 0xf7, 0xff, 0xff, 0x6e, 0x48, 0x11, 0x68, 0x01, + 0x00, 0x49, 0x08, 0x49, 0x07, 0xfa, 0x43, 0x11, + 0x0a, 0x09, 0x02, 0x09, 0x43, 0x21, 0x60, 0x01, + 0x68, 0xc2, 0x2a, 0x00, 0xd1, 0x11, 0x68, 0x82, + 0x1c, 0x53, 0x68, 0x82, 0x60, 0x83, 0x00, 0x92, + 0x4b, 0x09, 0x50, 0x99, 0x68, 0x81, 0x29, 0x64, + 0xd1, 0x01, 0x21, 0x00, 0x60, 0x81, 0x68, 0x81, + 0x68, 0x42, 0x42, 0x91, 0xd1, 0x01, 0x21, 0x01, + 0x60, 0xc1, 0xf7, 0xff, 0xff, 0x5e, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x17, 0xcc, + 0x2e, 0x08, 0x4d, 0x98, 0xb5, 0x90, 0x1c, 0x07, + 0xf7, 0xff, 0xff, 0x42, 0x48, 0x10, 0x68, 0xc1, + 0x24, 0x00, 0x29, 0x00, 0xd1, 0x03, 0x68, 0x41, + 0x68, 0x82, 0x42, 0x91, 0xd0, 0x12, 0x68, 0x41, + 0x1c, 0x4a, 0x68, 0x41, 0x60, 0x42, 0x00, 0x89, + 0x4a, 0x0a, 0x58, 0x51, 0x60, 0x39, 0x68, 0x41, + 0x29, 0x64, 0xd1, 0x00, 0x60, 0x44, 0x60, 0xc4, + 0xf7, 0xff, 0xff, 0x3b, 0x20, 0x01, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x35, + 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x17, 0xcc, 0x2e, 0x08, 0x4d, 0x98, + 0xb5, 0x80, 0xb0, 0x81, 0x4f, 0x0e, 0x8e, 0xb8, + 0x28, 0x00, 0xd1, 0x04, 0x46, 0x68, 0xf7, 0xff, + 0xff, 0xcd, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x00, + 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x98, 0x00, 0x49, 0x07, 0x60, 0x08, + 0x20, 0x08, 0x85, 0x38, 0x20, 0x04, 0x85, 0x78, + 0x20, 0x0f, 0x02, 0x40, 0x86, 0xb8, 0x20, 0x01, + 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1e, 0x00, + 0xb5, 0x00, 0x49, 0x0b, 0xca, 0x08, 0xc1, 0x08, + 0xca, 0x08, 0xc1, 0x08, 0xca, 0x0c, 0xc1, 0x0c, + 0x78, 0x01, 0x48, 0x08, 0x70, 0x01, 0x78, 0x00, + 0x28, 0x01, 0xd1, 0x04, 0xf0, 0x00, 0xf8, 0x41, + 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x4f, 0x28, 0x2e, 0x08, 0x1a, 0x50, + 0xb5, 0x90, 0x27, 0x00, 0x48, 0x13, 0x70, 0x07, + 0x20, 0x02, 0xf0, 0x04, 0xfb, 0x57, 0x28, 0x00, + 0xd1, 0x03, 0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x00, 0x21, 0x01, 0x4a, 0x0e, + 0x00, 0x43, 0x18, 0x1b, 0x00, 0x9b, 0x18, 0x9c, + 0x70, 0xa1, 0x52, 0xd7, 0x30, 0x01, 0x28, 0x02, + 0xdb, 0xf6, 0x22, 0x00, 0x1c, 0x08, 0x4c, 0x09, + 0x00, 0x53, 0x18, 0x9b, 0x00, 0xdb, 0x19, 0x19, + 0x70, 0x88, 0x52, 0xe7, 0x70, 0xcf, 0x32, 0x01, + 0x2a, 0x08, 0xdb, 0xf5, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x50, + 0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x60, + 0xb5, 0x00, 0xf0, 0x04, 0xf9, 0xe7, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x80, 0x20, 0x00, 0x49, 0x17, + 0x78, 0x09, 0x29, 0x01, 0xd1, 0x26, 0x49, 0x16, + 0x78, 0x4a, 0x2a, 0x14, 0xd0, 0x18, 0xdc, 0x09, + 0x2a, 0x11, 0xd0, 0x12, 0x2a, 0x12, 0xd0, 0x16, + 0x2a, 0x13, 0xd1, 0x16, 0x68, 0x8f, 0xf0, 0x00, + 0xf8, 0x77, 0xe0, 0x12, 0x2a, 0x15, 0xd0, 0x05, + 0x2a, 0x23, 0xd1, 0x0e, 0x68, 0x8f, 0xf0, 0x00, + 0xf8, 0xaf, 0xe0, 0x0a, 0xf0, 0x00, 0xf8, 0x8a, + 0xe0, 0x07, 0xf0, 0x00, 0xf8, 0x13, 0xe0, 0x04, + 0xf0, 0x00, 0xf8, 0x4a, 0xe0, 0x01, 0xf0, 0x00, + 0xf8, 0x2d, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, + 0xf0, 0x04, 0xfa, 0xe6, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x50, + 0x2e, 0x08, 0x4f, 0x28, 0xb5, 0x90, 0xb0, 0x81, + 0x4c, 0x0d, 0x79, 0xa0, 0x28, 0x01, 0xd1, 0x12, + 0xf0, 0x00, 0xf9, 0x1c, 0x1c, 0x07, 0xd5, 0x01, + 0x20, 0x00, 0xe0, 0x0d, 0x88, 0xa4, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x11, 0x1c, 0x38, 0xf0, 0x00, + 0xfa, 0x0d, 0x28, 0x00, 0xd1, 0x03, 0x1c, 0x38, + 0x1c, 0x21, 0xf0, 0x00, 0xf9, 0x47, 0x20, 0x01, + 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x4f, 0x28, 0xb5, 0x90, 0xb0, 0x81, + 0x4c, 0x0a, 0x88, 0xa0, 0xf0, 0x00, 0xf8, 0x96, + 0x1c, 0x07, 0xd4, 0x0a, 0x88, 0xa4, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x12, 0x1c, 0x38, 0xf0, 0x00, + 0xf9, 0xf1, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, + 0xf9, 0x2d, 0x20, 0x01, 0xb0, 0x01, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x28, + 0xb5, 0xb0, 0xb0, 0x81, 0x4c, 0x0b, 0x88, 0xa0, + 0xf0, 0x00, 0xf8, 0x7c, 0x1c, 0x07, 0xd4, 0x0c, + 0x88, 0xa5, 0x79, 0xa2, 0x46, 0x6b, 0x21, 0x14, + 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0xd7, 0x28, 0x00, + 0xd0, 0x03, 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x00, + 0xf9, 0x11, 0x20, 0x01, 0xb0, 0x01, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x28, + 0xb5, 0x90, 0xb0, 0x81, 0x4c, 0x0c, 0x88, 0xa0, + 0xf0, 0x00, 0xf8, 0x60, 0x1c, 0x07, 0xd4, 0x0c, + 0x68, 0xa0, 0x78, 0x01, 0x88, 0xa0, 0xf0, 0x00, + 0xf8, 0x71, 0x1c, 0x02, 0xd4, 0x07, 0x46, 0x6b, + 0x21, 0x13, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0xb6, + 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x00, + 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x4f, 0x28, 0xb5, 0x90, 0xb0, 0x81, + 0x4c, 0x0d, 0x88, 0xa0, 0xf0, 0x00, 0xf8, 0x42, + 0x1c, 0x07, 0xd4, 0x0f, 0x00, 0x78, 0x19, 0xc0, + 0x00, 0x80, 0x49, 0x0a, 0x18, 0x40, 0x7a, 0x01, + 0x88, 0xa0, 0xf0, 0x00, 0xf8, 0x4f, 0x1c, 0x02, + 0xd4, 0x04, 0x46, 0x6b, 0x21, 0x15, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x94, 0x20, 0x01, 0xb0, 0x01, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x4f, 0x28, 0x2e, 0x08, 0x4f, 0x48, + 0xb5, 0x90, 0xb0, 0x81, 0x4f, 0x10, 0x88, 0xb8, + 0xf0, 0x00, 0xf8, 0x20, 0x1c, 0x04, 0xd4, 0x14, + 0x79, 0xb9, 0x88, 0xb8, 0xf0, 0x00, 0xf8, 0x32, + 0x1c, 0x02, 0xd5, 0x08, 0x79, 0xba, 0x88, 0xb9, + 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x49, 0x1c, 0x02, + 0xd5, 0x01, 0x20, 0x00, 0xe0, 0x08, 0x46, 0x6b, + 0x21, 0x23, 0x1c, 0x20, 0xf0, 0x00, 0xf9, 0x6e, + 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x00, + 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x4f, 0x28, 0xb4, 0x80, 0x04, 0x02, + 0x0c, 0x12, 0x20, 0x00, 0x49, 0x08, 0x00, 0x43, + 0x18, 0x1b, 0x00, 0x9b, 0x18, 0x5f, 0x78, 0xbf, + 0x2f, 0x01, 0xd0, 0x02, 0x5a, 0xcb, 0x42, 0x93, + 0xd0, 0x04, 0x30, 0x01, 0x28, 0x02, 0xdb, 0xf2, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0x47, 0x70, + 0x2e, 0x08, 0x4f, 0x48, 0xb4, 0xb0, 0x04, 0x02, + 0x0c, 0x12, 0x06, 0x0f, 0x0e, 0x3f, 0x20, 0x00, + 0x49, 0x0a, 0x00, 0x44, 0x18, 0x24, 0x00, 0xe4, + 0x18, 0x63, 0x78, 0x9d, 0x2d, 0x01, 0xd0, 0x05, + 0x5b, 0x0c, 0x42, 0x94, 0xd1, 0x02, 0x78, 0xdb, + 0x42, 0xbb, 0xd0, 0x04, 0x30, 0x01, 0x28, 0x08, + 0xdb, 0xef, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xb0, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x4f, 0x60, + 0xb5, 0xb0, 0x04, 0x09, 0x0c, 0x09, 0x06, 0x12, + 0x0e, 0x12, 0x24, 0x00, 0x1c, 0x07, 0x48, 0x13, + 0x00, 0x63, 0x19, 0x1b, 0x00, 0xdb, 0x18, 0x1b, + 0x78, 0x9b, 0x2b, 0x01, 0xd1, 0x16, 0x00, 0x63, + 0x19, 0x1b, 0x00, 0xdb, 0x18, 0x1d, 0x70, 0xea, + 0x52, 0xc1, 0x20, 0x03, 0x70, 0xa8, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x9a, 0x00, 0x78, 0x19, 0xc0, + 0x00, 0x80, 0x49, 0x09, 0x18, 0x40, 0x88, 0xc1, + 0x31, 0x01, 0x80, 0xc1, 0x1c, 0x20, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x34, 0x01, 0x2c, 0x08, + 0xdb, 0xde, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x60, + 0x2e, 0x08, 0x4f, 0x48, 0xb4, 0x90, 0x20, 0x00, + 0x4c, 0x19, 0x4f, 0x1a, 0x88, 0xba, 0x49, 0x1a, + 0x00, 0x43, 0x18, 0x1b, 0x00, 0x9b, 0x18, 0x5b, + 0x78, 0x9b, 0x2b, 0x01, 0xd1, 0x17, 0x00, 0x43, + 0x18, 0x1b, 0x00, 0x9b, 0x52, 0xca, 0x22, 0x02, + 0x18, 0x59, 0x70, 0x8a, 0x22, 0x00, 0x80, 0xca, + 0x72, 0x4a, 0x89, 0x3a, 0x2a, 0x10, 0xdb, 0x03, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x9a, 0xdd, 0x03, + 0x20, 0x02, 0x43, 0xc0, 0xbc, 0x90, 0x47, 0x70, + 0x80, 0x8a, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x43, + 0x18, 0x1b, 0x00, 0xdb, 0x5a, 0xe3, 0x42, 0x93, + 0xd1, 0x03, 0x20, 0x01, 0x43, 0xc0, 0xbc, 0x90, + 0x47, 0x70, 0x30, 0x01, 0x28, 0x02, 0xdb, 0xd3, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0x47, 0x70, + 0x2e, 0x08, 0x4f, 0x60, 0x2e, 0x08, 0x4f, 0x28, + 0x2e, 0x08, 0x4f, 0x48, 0xb5, 0xf0, 0x04, 0x0e, + 0x0c, 0x36, 0x1c, 0x07, 0xd5, 0x06, 0x2f, 0x02, + 0xdb, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x00, 0x7b, + 0x19, 0xdb, 0x00, 0x9b, 0x49, 0x0e, 0x18, 0x5a, + 0x70, 0x90, 0x22, 0x00, 0x52, 0xca, 0x24, 0x00, + 0x4d, 0x0c, 0x00, 0x60, 0x19, 0x00, 0x00, 0xc0, + 0x5a, 0x29, 0x42, 0xb1, 0xd1, 0x08, 0x22, 0x00, + 0x19, 0x41, 0x70, 0xca, 0x52, 0x2a, 0x20, 0x01, + 0x70, 0x88, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x20, + 0x34, 0x01, 0x2c, 0x08, 0xdb, 0xed, 0x1c, 0x38, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x60, + 0xb5, 0x00, 0x49, 0x03, 0x78, 0x08, 0xf0, 0x04, + 0xf8, 0x6b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x4f, 0x28, 0xb5, 0x00, 0x49, 0x03, + 0x78, 0x08, 0xf0, 0x04, 0xf8, 0x61, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x4f, 0x38, + 0xb5, 0xf0, 0x01, 0x46, 0x18, 0x36, 0x00, 0xb6, + 0x1c, 0x07, 0xb0, 0x84, 0x48, 0x0c, 0x90, 0x03, + 0x18, 0x34, 0x68, 0xa0, 0x28, 0x00, 0xd0, 0x0a, + 0x46, 0x69, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x3e, + 0x1c, 0x05, 0xd0, 0x02, 0x98, 0x01, 0xf0, 0x04, + 0xf9, 0x23, 0x2d, 0x00, 0xd1, 0xf4, 0x20, 0x00, + 0x99, 0x03, 0x51, 0x88, 0x60, 0x60, 0x60, 0xa0, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x50, 0x20, 0xb4, 0xb0, 0x01, 0x43, + 0x18, 0x18, 0x00, 0x80, 0x4a, 0x12, 0x18, 0x82, + 0x20, 0x00, 0x68, 0x93, 0x2b, 0x0a, 0xda, 0x1d, + 0x33, 0x01, 0x60, 0x93, 0x78, 0x8c, 0x68, 0x55, + 0x00, 0x6b, 0x19, 0x5b, 0x00, 0x9b, 0x18, 0xd3, + 0x73, 0x9c, 0x68, 0x4c, 0x68, 0x55, 0x00, 0x6b, + 0x19, 0x5b, 0x00, 0x9b, 0x18, 0xd3, 0x61, 0x1c, + 0x89, 0x0f, 0x68, 0x54, 0x00, 0x63, 0x19, 0x1b, + 0x00, 0x9b, 0x18, 0xd1, 0x82, 0x8f, 0x68, 0x51, + 0x31, 0x01, 0x60, 0x51, 0x29, 0x0a, 0xdb, 0x00, + 0x60, 0x50, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, + 0x2e, 0x08, 0x50, 0x20, 0xb4, 0xb0, 0x01, 0x47, + 0x18, 0x3f, 0x00, 0xbf, 0x4a, 0x12, 0x18, 0xbc, + 0x20, 0x00, 0x68, 0xa3, 0x2b, 0x00, 0xdd, 0x1d, + 0x3b, 0x01, 0x60, 0xa3, 0x59, 0xd5, 0x00, 0x6b, + 0x19, 0x5b, 0x00, 0x9b, 0x18, 0xe3, 0x7b, 0x9b, + 0x70, 0x8b, 0x59, 0xd5, 0x00, 0x6b, 0x19, 0x5b, + 0x00, 0x9b, 0x18, 0xe3, 0x69, 0x1b, 0x60, 0x4b, + 0x59, 0xd5, 0x00, 0x6b, 0x19, 0x5b, 0x00, 0x9b, + 0x18, 0xe3, 0x8a, 0x9b, 0x81, 0x0b, 0x59, 0xd1, + 0x31, 0x01, 0x51, 0xd1, 0x29, 0x0a, 0xdb, 0x00, + 0x51, 0xd0, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, + 0x2e, 0x08, 0x50, 0x20, 0xb5, 0x90, 0x06, 0x09, + 0x0e, 0x09, 0x1c, 0x1f, 0x00, 0x43, 0x18, 0x1b, + 0x00, 0x9b, 0x4c, 0x0f, 0x19, 0x1b, 0x78, 0x9b, + 0x2b, 0x02, 0xd0, 0x0f, 0x2b, 0x03, 0xd0, 0x07, + 0x2b, 0x04, 0xd1, 0x11, 0x1c, 0x3b, 0xf0, 0x00, + 0xf9, 0x27, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x3b, 0xf0, 0x00, 0xf8, 0x37, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x3a, 0xf0, 0x00, + 0xf8, 0x09, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x4f, 0x48, 0xb5, 0x90, 0x06, 0x09, + 0x0e, 0x09, 0x23, 0x01, 0x60, 0x13, 0x29, 0x11, + 0xd1, 0x17, 0x22, 0x23, 0x49, 0x0d, 0x70, 0x0a, + 0x22, 0x21, 0x70, 0x4a, 0x22, 0x04, 0x80, 0x4a, + 0x00, 0x44, 0x18, 0x24, 0x00, 0xa4, 0x4f, 0x0a, + 0x5b, 0x38, 0x80, 0x88, 0xf7, 0xff, 0xff, 0x34, + 0x28, 0x00, 0xd0, 0x06, 0x20, 0x03, 0x19, 0xe1, + 0x70, 0x88, 0x20, 0x01, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x4f, 0x28, + 0x2e, 0x08, 0x4f, 0x48, 0xb5, 0xff, 0x06, 0x09, + 0x0e, 0x09, 0x27, 0x00, 0x20, 0x00, 0xb0, 0x84, + 0x60, 0x18, 0x1c, 0x1e, 0x98, 0x04, 0x00, 0x43, + 0x18, 0x18, 0x00, 0x80, 0x90, 0x03, 0x4a, 0x6a, + 0x92, 0x02, 0x18, 0x84, 0x25, 0x02, 0x48, 0x69, + 0x29, 0x12, 0xd0, 0x71, 0x9a, 0x06, 0x00, 0x53, + 0x18, 0x9a, 0x00, 0xd2, 0x4b, 0x66, 0x18, 0xd2, + 0x92, 0x01, 0x29, 0x13, 0xd0, 0x17, 0x29, 0x14, + 0xd0, 0x67, 0x29, 0x23, 0xd1, 0x66, 0x89, 0x82, + 0x99, 0x06, 0xb4, 0x04, 0x68, 0x83, 0x9d, 0x02, + 0x78, 0xea, 0x98, 0x05, 0xf0, 0x00, 0xf9, 0x52, + 0xb0, 0x01, 0x1c, 0x07, 0xd0, 0x5b, 0x89, 0xa8, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0x01, 0x60, 0x30, + 0x21, 0x04, 0x70, 0xa1, 0xe0, 0x97, 0x68, 0x81, + 0x78, 0x4a, 0x23, 0x80, 0x40, 0x1a, 0x88, 0xc0, + 0x1e, 0x83, 0x04, 0x1d, 0x0c, 0x2d, 0x31, 0x02, + 0x91, 0x00, 0x2a, 0x80, 0xd1, 0x28, 0x88, 0xa1, + 0x42, 0x81, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x87, + 0x9c, 0x01, 0x8a, 0xa1, 0x29, 0x00, 0xd1, 0x0c, + 0x1c, 0x28, 0xf0, 0x03, 0xff, 0xfb, 0x61, 0x20, + 0x28, 0x00, 0xd0, 0xf3, 0x82, 0xa5, 0x69, 0x20, + 0x99, 0x00, 0x1c, 0x2a, 0xf0, 0x16, 0xff, 0x12, + 0xe0, 0x75, 0x19, 0x48, 0x04, 0x02, 0x0c, 0x12, + 0x69, 0x20, 0xf0, 0x03, 0xff, 0xf0, 0x28, 0x00, + 0xd0, 0xe4, 0x61, 0x20, 0x8a, 0xa1, 0x18, 0x40, + 0x99, 0x00, 0x1c, 0x2a, 0xf0, 0x16, 0xff, 0x02, + 0x8a, 0xa0, 0x19, 0x40, 0x82, 0xa0, 0xe0, 0x62, + 0x9e, 0x01, 0x8a, 0xb1, 0x4c, 0x3d, 0x29, 0x00, + 0xd1, 0x1a, 0x1c, 0x28, 0xf0, 0x03, 0xff, 0xd6, + 0x60, 0xa0, 0x28, 0x00, 0xd0, 0xce, 0x21, 0x23, + 0x70, 0x21, 0x70, 0x61, 0x21, 0x0c, 0x80, 0x61, + 0x99, 0x03, 0x9a, 0x02, 0x5a, 0x51, 0x80, 0xa1, + 0x78, 0xf1, 0x71, 0xa1, 0x81, 0xa5, 0x99, 0x00, + 0x1c, 0x2a, 0xf0, 0x16, 0xfe, 0xe3, 0xe0, 0x24, + 0xe0, 0x4b, 0xe0, 0x2e, 0xe0, 0x43, 0xe0, 0x42, + 0x19, 0x48, 0x04, 0x02, 0x0c, 0x12, 0x69, 0x30, + 0xf0, 0x03, 0xff, 0xbd, 0x28, 0x00, 0xd0, 0xb1, + 0x61, 0x30, 0x8a, 0xb1, 0x18, 0x40, 0x99, 0x00, + 0x1c, 0x2a, 0xf0, 0x16, 0xfe, 0xcf, 0x8a, 0xb0, + 0x19, 0x40, 0x82, 0xb0, 0x21, 0x23, 0x70, 0x21, + 0x70, 0x61, 0x21, 0x0c, 0x80, 0x61, 0x98, 0x03, + 0x9a, 0x02, 0x5a, 0x10, 0x80, 0xa0, 0x78, 0xf0, + 0x71, 0xa0, 0x8a, 0xb0, 0x81, 0xa0, 0x69, 0x30, + 0x60, 0xa0, 0xf7, 0xff, 0xfe, 0x7f, 0x28, 0x00, + 0xd1, 0x03, 0x68, 0xa0, 0xf0, 0x03, 0xff, 0xbc, + 0xe0, 0x19, 0x20, 0x00, 0x82, 0xb0, 0x61, 0x30, + 0xe0, 0x14, 0x9a, 0x06, 0x06, 0x11, 0x0e, 0x09, + 0x29, 0x02, 0xd1, 0x10, 0x21, 0x23, 0x70, 0x01, + 0x21, 0x22, 0x70, 0x41, 0x21, 0x04, 0x80, 0x41, + 0x99, 0x03, 0x9a, 0x02, 0x5a, 0x51, 0x80, 0x81, + 0xf7, 0xff, 0xfe, 0x5a, 0x28, 0x00, 0xd1, 0x00, + 0xe7, 0x78, 0x70, 0xa5, 0x27, 0x01, 0x1c, 0x38, + 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x23, 0x70, 0x01, 0x21, 0x22, + 0x70, 0x41, 0x21, 0x04, 0x80, 0x41, 0x99, 0x03, + 0x9a, 0x02, 0x5a, 0x51, 0x80, 0x81, 0xf7, 0xff, + 0xfe, 0x43, 0x28, 0x00, 0xd1, 0xe9, 0xe7, 0x61, + 0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x28, + 0x2e, 0x08, 0x4f, 0x60, 0x2e, 0x08, 0x4f, 0x38, + 0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x24, 0x00, + 0x20, 0x00, 0x60, 0x18, 0x1c, 0x1f, 0xb0, 0x84, + 0x29, 0x14, 0xd0, 0x04, 0xdc, 0x09, 0x29, 0x12, + 0xd0, 0x01, 0x29, 0x13, 0xd1, 0x65, 0x98, 0x04, + 0x1c, 0x3b, 0xf7, 0xff, 0xff, 0x03, 0x1c, 0x04, + 0xe0, 0x6e, 0x29, 0x15, 0xd0, 0x0a, 0x29, 0x23, + 0xd1, 0x5b, 0x49, 0x38, 0x1c, 0x10, 0xf7, 0xff, + 0xfe, 0x51, 0x1c, 0x04, 0xd0, 0x64, 0x20, 0x01, + 0x60, 0x38, 0xe0, 0x61, 0x1c, 0x17, 0x22, 0x00, + 0x98, 0x04, 0x00, 0x43, 0x18, 0x18, 0x00, 0x80, + 0x49, 0x31, 0x18, 0x43, 0x93, 0x03, 0x72, 0x5a, + 0x5a, 0x0a, 0x92, 0x00, 0x9b, 0x03, 0x88, 0xd8, + 0x28, 0x01, 0xd0, 0x03, 0x37, 0x01, 0x2f, 0x08, + 0xd1, 0x00, 0x27, 0x00, 0x26, 0x00, 0x48, 0x2b, + 0x90, 0x01, 0x1d, 0x01, 0x91, 0x02, 0x4d, 0x2a, + 0x00, 0x78, 0x19, 0xc0, 0x00, 0xc0, 0x5a, 0x29, + 0x9a, 0x00, 0x42, 0x91, 0xd1, 0x32, 0x19, 0x40, + 0x89, 0x80, 0x28, 0x00, 0xdd, 0x0e, 0x22, 0x00, + 0xb4, 0x04, 0x00, 0x78, 0x19, 0xc0, 0x00, 0xc0, + 0x19, 0x40, 0x78, 0xc2, 0x23, 0x00, 0x98, 0x05, + 0x1c, 0x39, 0xf0, 0x00, 0xf8, 0x3f, 0x1c, 0x04, + 0xb0, 0x01, 0xe0, 0x26, 0x99, 0x02, 0x1c, 0x38, + 0xf7, 0xff, 0xfe, 0x40, 0x1c, 0x04, 0xd0, 0x19, + 0x98, 0x01, 0x89, 0x82, 0xb4, 0x04, 0x98, 0x02, + 0x68, 0x84, 0x00, 0x78, 0x19, 0xc0, 0x00, 0xc0, + 0x19, 0x45, 0x78, 0xea, 0x98, 0x05, 0x1c, 0x39, + 0x1c, 0x23, 0x1c, 0x2e, 0xf0, 0x00, 0xf8, 0x26, + 0x1c, 0x04, 0x89, 0xa8, 0xb0, 0x01, 0x28, 0x00, + 0xd1, 0x0b, 0x68, 0x70, 0xf0, 0x03, 0xff, 0x10, + 0xe0, 0x07, 0xe0, 0x0d, 0x36, 0x01, 0x37, 0x01, + 0x2f, 0x08, 0xd1, 0x00, 0x27, 0x00, 0x2e, 0x08, + 0xdb, 0xbe, 0x9b, 0x03, 0x7a, 0x58, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0x03, 0x9b, 0x03, 0x70, 0x98, + 0x1c, 0x20, 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x2c, + 0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x38, + 0x2e, 0x08, 0x4f, 0x60, 0xb5, 0xff, 0x06, 0x16, + 0x0e, 0x36, 0x9f, 0x09, 0x04, 0x3c, 0x0c, 0x24, + 0x1c, 0x18, 0x00, 0x4b, 0x18, 0x59, 0x00, 0xc9, + 0xb0, 0x85, 0x4a, 0x30, 0x18, 0x8f, 0x28, 0x00, + 0xd1, 0x02, 0x89, 0xbc, 0x68, 0xbd, 0xe0, 0x03, + 0x60, 0x78, 0x60, 0xb8, 0x81, 0xbc, 0x1c, 0x05, + 0x99, 0x05, 0x00, 0x4b, 0x18, 0x5b, 0x00, 0x9b, + 0x93, 0x04, 0x1c, 0xa2, 0x49, 0x28, 0x91, 0x03, + 0x18, 0x59, 0x91, 0x02, 0x88, 0x89, 0x42, 0x8a, + 0xdd, 0x0a, 0x20, 0x80, 0x90, 0x00, 0x1e, 0x88, + 0x04, 0x04, 0x0c, 0x24, 0x19, 0x28, 0x60, 0xb8, + 0x89, 0xb8, 0x1b, 0x00, 0x81, 0xb8, 0xe0, 0x09, + 0x21, 0x00, 0x91, 0x00, 0x81, 0xb9, 0x28, 0x00, + 0xd1, 0x04, 0x68, 0x78, 0xf0, 0x03, 0xfe, 0xbc, + 0x21, 0x00, 0x60, 0x79, 0x1c, 0xa0, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x01, 0xf0, 0x03, 0xfe, 0x8e, + 0x4f, 0x18, 0x60, 0xb8, 0x1c, 0x01, 0xd1, 0x01, + 0x20, 0x00, 0xe0, 0x22, 0x20, 0x21, 0x70, 0x38, + 0x20, 0x13, 0x70, 0x78, 0x20, 0x08, 0x80, 0x78, + 0x98, 0x04, 0x9a, 0x03, 0x5a, 0x10, 0x80, 0xb8, + 0x98, 0x01, 0x80, 0xf8, 0x70, 0x0e, 0x98, 0x00, + 0x68, 0xb9, 0x70, 0x48, 0x68, 0xb8, 0x30, 0x02, + 0x1c, 0x29, 0x1c, 0x22, 0xf0, 0x16, 0xfd, 0x92, + 0xf7, 0xff, 0xfd, 0x54, 0x28, 0x00, 0xd1, 0x03, + 0x68, 0xb8, 0xf0, 0x03, 0xfe, 0x91, 0xe7, 0xdf, + 0x99, 0x02, 0x72, 0x0e, 0x20, 0x01, 0x99, 0x02, + 0x72, 0x48, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x60, + 0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x38, + 0xb5, 0xf0, 0x4d, 0x15, 0x69, 0x68, 0x28, 0x00, + 0xd1, 0x06, 0x20, 0xff, 0x30, 0x01, 0xf0, 0x03, + 0xfe, 0x51, 0x61, 0x68, 0x28, 0x00, 0xd0, 0x11, + 0x27, 0x00, 0x4c, 0x10, 0x21, 0x01, 0x01, 0x3e, + 0x19, 0x30, 0x81, 0x01, 0x21, 0x00, 0x60, 0xc1, + 0x20, 0x00, 0x1c, 0x39, 0xf0, 0x05, 0xf9, 0x90, + 0x04, 0x00, 0x0c, 0x00, 0x53, 0xa0, 0x04, 0x00, + 0x14, 0x00, 0xd5, 0x04, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x37, 0x01, + 0x2f, 0x02, 0xdb, 0xe7, 0x21, 0x00, 0x82, 0x29, + 0x20, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x54, 0x2e, 0x08, 0x54, 0x50, + 0xb5, 0xf7, 0x04, 0x01, 0x0c, 0x09, 0x04, 0x16, + 0x0c, 0x36, 0x27, 0x00, 0x48, 0x12, 0x01, 0x3a, + 0x5a, 0x82, 0x42, 0x8a, 0xd0, 0x02, 0x37, 0x01, + 0x2f, 0x02, 0xdb, 0xf8, 0x2f, 0x02, 0xda, 0x17, + 0x24, 0x00, 0x99, 0x01, 0x1c, 0x38, 0x1c, 0x32, + 0xf0, 0x00, 0xf9, 0xd6, 0x1c, 0x05, 0x28, 0x02, + 0xd1, 0x05, 0x20, 0x14, 0xf0, 0x03, 0xfe, 0x3e, + 0x34, 0x01, 0x2c, 0x0a, 0xd0, 0x08, 0x2d, 0x02, + 0xd0, 0xef, 0x2d, 0x00, 0xd1, 0x04, 0x20, 0x00, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0x43, 0xc0, 0xe7, 0xf8, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x50, 0xb5, 0xf0, 0x4f, 0x14, + 0x26, 0x00, 0x69, 0x78, 0x28, 0x00, 0xd0, 0x02, + 0xf0, 0x03, 0xfe, 0x1a, 0x61, 0x7e, 0x24, 0x00, + 0x4d, 0x10, 0x01, 0x27, 0x5b, 0xe8, 0x28, 0x00, + 0xdd, 0x02, 0xf0, 0x05, 0xf9, 0xe7, 0x53, 0xee, + 0x19, 0x78, 0x68, 0xc7, 0x2f, 0x00, 0xd0, 0x0c, + 0x68, 0x38, 0x28, 0x00, 0xd0, 0x06, 0x1c, 0x38, + 0x68, 0x3f, 0xf0, 0x03, 0xfe, 0x05, 0x68, 0x38, + 0x28, 0x00, 0xd1, 0xf8, 0x1c, 0x38, 0xf0, 0x03, + 0xfd, 0xff, 0x34, 0x01, 0x2c, 0x02, 0xdb, 0xe4, + 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x54, 0x2e, 0x08, 0x54, 0x50, + 0xb5, 0xf0, 0x1c, 0x07, 0x20, 0x03, 0x1c, 0x0d, + 0x01, 0x39, 0x1c, 0x14, 0x4a, 0x12, 0x18, 0x8e, + 0x81, 0x30, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x22, + 0x28, 0x00, 0xd1, 0x10, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x6d, 0x28, 0x00, 0xd0, 0x04, 0x28, 0x07, + 0xd1, 0x12, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0x1c, 0x29, 0x1c, 0x22, 0xf0, 0x00, + 0xf8, 0xb3, 0x28, 0x00, 0xd0, 0x04, 0x20, 0x01, + 0x81, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x50, 0xb5, 0xf0, 0x27, 0x01, + 0xb0, 0x81, 0xab, 0x00, 0x70, 0x1f, 0x01, 0x05, + 0x4c, 0x15, 0x5b, 0x60, 0x46, 0x6a, 0x21, 0x06, + 0xf0, 0x05, 0xf9, 0x56, 0x28, 0x00, 0xdd, 0x1d, + 0xa8, 0x00, 0x78, 0x40, 0x28, 0x00, 0xd0, 0x19, + 0x27, 0x00, 0x20, 0x02, 0xab, 0x00, 0x70, 0x18, + 0x26, 0x06, 0x5b, 0x60, 0x46, 0x6a, 0x21, 0x06, + 0xf0, 0x05, 0xf9, 0x46, 0x28, 0x00, 0xdb, 0x05, + 0x20, 0x14, 0xf0, 0x03, 0xfd, 0xaf, 0x37, 0x01, + 0x2f, 0x0a, 0xd1, 0x01, 0x1c, 0x30, 0xe0, 0x06, + 0xa8, 0x00, 0x78, 0x40, 0x28, 0x00, 0xd0, 0xec, + 0x20, 0x00, 0xe0, 0x00, 0x1c, 0x38, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x50, 0xb5, 0x80, 0x27, 0x01, + 0xb0, 0x81, 0xab, 0x00, 0x70, 0x1f, 0x01, 0x00, + 0x49, 0x09, 0x5a, 0x08, 0x46, 0x6a, 0x21, 0x06, + 0xf0, 0x05, 0xf9, 0x22, 0x28, 0x00, 0xdd, 0x05, + 0xa8, 0x00, 0x78, 0x40, 0x28, 0x00, 0xd0, 0x01, + 0x20, 0x00, 0xe0, 0x00, 0x1c, 0x38, 0xb0, 0x01, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x50, 0xb5, 0xf0, 0x27, 0x00, + 0x26, 0x06, 0x01, 0x05, 0xb0, 0xff, 0xb0, 0x87, + 0x4c, 0x24, 0x20, 0x00, 0xab, 0x00, 0x80, 0x18, + 0x20, 0x01, 0x02, 0x40, 0x80, 0x58, 0xa8, 0x05, + 0x90, 0x01, 0x5b, 0x60, 0x46, 0x6a, 0x21, 0x02, + 0xf0, 0x05, 0xf8, 0xfe, 0x28, 0x00, 0xda, 0x01, + 0x1c, 0x30, 0xe0, 0x2f, 0xa9, 0x02, 0x88, 0x09, + 0xa8, 0x05, 0xaa, 0x03, 0xab, 0x04, 0xf0, 0x00, + 0xfa, 0x73, 0x28, 0x00, 0xda, 0x2b, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0x20, 0xc8, 0xf0, 0x03, + 0xfd, 0x59, 0x2f, 0x0a, 0xdb, 0xdd, 0x2f, 0x0a, + 0xd0, 0xea, 0xa8, 0x03, 0x88, 0x00, 0xab, 0x00, + 0x80, 0x18, 0x27, 0x01, 0x80, 0x5f, 0xa8, 0x04, + 0x90, 0x01, 0x5b, 0x60, 0x46, 0x6a, 0x21, 0x03, + 0xf0, 0x05, 0xf8, 0xda, 0x28, 0x00, 0xdb, 0xdb, + 0xa8, 0x02, 0x88, 0x00, 0x28, 0x01, 0xd1, 0xd7, + 0xab, 0x85, 0x70, 0x5f, 0x27, 0x00, 0x70, 0x1f, + 0x5b, 0x60, 0x21, 0x07, 0xaa, 0x85, 0xf0, 0x05, + 0xf8, 0xcb, 0x1c, 0x38, 0xb0, 0x7f, 0xb0, 0x07, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x27, 0x00, + 0xe7, 0xd9, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x50, + 0xb5, 0xf7, 0x1c, 0x07, 0x20, 0x00, 0xb0, 0x84, + 0x4c, 0x5b, 0x70, 0x20, 0xab, 0x00, 0x70, 0x58, + 0x70, 0x18, 0x01, 0x38, 0x49, 0x59, 0x5a, 0x08, + 0x46, 0x6a, 0x21, 0x07, 0xf0, 0x05, 0xf8, 0xb0, + 0x28, 0x00, 0xdb, 0x2f, 0x1d, 0x22, 0x92, 0x03, + 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0x04, + 0x28, 0x01, 0xd0, 0x27, 0x78, 0x20, 0x23, 0x08, + 0x43, 0x18, 0x70, 0x20, 0x78, 0x22, 0x21, 0x01, + 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0xd3, 0x28, 0x01, + 0xd0, 0x1c, 0x78, 0x20, 0x23, 0xf7, 0x40, 0x18, + 0x70, 0x20, 0x78, 0x22, 0x21, 0x01, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0xc8, 0x28, 0x01, 0xd0, 0x11, + 0x21, 0x01, 0x9a, 0x03, 0x1c, 0x38, 0xf0, 0x00, + 0xf9, 0xe7, 0x28, 0x01, 0xd0, 0x0a, 0x78, 0x20, + 0x23, 0x04, 0x43, 0x18, 0x70, 0x20, 0x78, 0x22, + 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0xb6, + 0x28, 0x01, 0xd1, 0x01, 0x20, 0x05, 0xe0, 0x71, + 0x25, 0x00, 0x23, 0x01, 0x1c, 0x38, 0xa9, 0x02, + 0xaa, 0x01, 0xf0, 0x00, 0xf9, 0x33, 0x1c, 0x06, + 0x28, 0x01, 0xd0, 0xf3, 0x20, 0x14, 0xf0, 0x03, + 0xfc, 0xdd, 0x35, 0x01, 0x2d, 0x0a, 0xd0, 0xed, + 0x2e, 0x03, 0xd0, 0xee, 0x2e, 0x02, 0xd0, 0xec, + 0xa8, 0x02, 0x78, 0x00, 0x02, 0x00, 0xa9, 0x02, + 0x78, 0x49, 0x18, 0x40, 0x9a, 0x06, 0x60, 0x10, + 0x99, 0x05, 0x42, 0x88, 0xd9, 0x08, 0x99, 0x05, + 0x0a, 0x08, 0xab, 0x02, 0x70, 0x18, 0x99, 0x05, + 0x70, 0x59, 0x99, 0x05, 0x9a, 0x06, 0x60, 0x11, + 0x78, 0x20, 0x23, 0xfb, 0x40, 0x18, 0x70, 0x20, + 0x78, 0x22, 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, + 0xf9, 0x81, 0x28, 0x01, 0xd0, 0x0a, 0x78, 0x20, + 0x23, 0x02, 0x43, 0x18, 0x70, 0x20, 0x78, 0x22, + 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x76, + 0x28, 0x01, 0xd1, 0x01, 0x20, 0x01, 0xe0, 0x31, + 0x25, 0x00, 0x22, 0x02, 0x1c, 0x38, 0xa9, 0x02, + 0xf0, 0x00, 0xf8, 0x36, 0x1c, 0x06, 0x28, 0x01, + 0xd0, 0xb4, 0x20, 0x14, 0xf0, 0x03, 0xfc, 0x9e, + 0x35, 0x01, 0x2d, 0x0a, 0xd0, 0xae, 0x2e, 0x02, + 0xd0, 0xef, 0x78, 0x20, 0x23, 0xfd, 0x40, 0x18, + 0x70, 0x20, 0x78, 0x22, 0x21, 0x01, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x58, 0x28, 0x01, 0xd0, 0xe1, + 0x25, 0x00, 0x21, 0x01, 0x9a, 0x03, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x76, 0x28, 0x01, 0xd0, 0x99, + 0x79, 0x20, 0x23, 0xc3, 0x40, 0x18, 0x71, 0x20, + 0x20, 0x14, 0xf0, 0x03, 0xfc, 0x7f, 0x35, 0x01, + 0x2d, 0x0a, 0xd0, 0x8f, 0x79, 0x20, 0x09, 0xc0, + 0xd3, 0xeb, 0x20, 0x00, 0xb0, 0x04, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0x54, 0x2e, 0x08, 0x54, 0x50, + 0xb5, 0xf7, 0x04, 0x15, 0x0c, 0x2d, 0x1c, 0x07, + 0x01, 0x00, 0xb0, 0x82, 0x90, 0x01, 0x49, 0x3d, + 0x91, 0x00, 0x18, 0x40, 0x89, 0x00, 0x28, 0x01, + 0xd0, 0x07, 0x4a, 0x3b, 0x21, 0x01, 0x1c, 0x38, + 0x1c, 0x16, 0xf0, 0x00, 0xf9, 0x49, 0x28, 0x01, + 0xd1, 0x01, 0x20, 0x01, 0xe0, 0x64, 0x4c, 0x37, + 0x79, 0x20, 0x23, 0xc3, 0x40, 0x18, 0x71, 0x20, + 0x79, 0x20, 0x0a, 0x00, 0xd3, 0x02, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x66, 0x21, 0x01, 0x1c, 0x38, + 0x1c, 0x32, 0xf0, 0x00, 0xf9, 0x35, 0x28, 0x01, + 0xd0, 0xeb, 0x79, 0x20, 0x23, 0xc3, 0x40, 0x18, + 0x71, 0x20, 0x79, 0x20, 0x09, 0xc0, 0xd2, 0x01, + 0x20, 0x02, 0xe0, 0x49, 0x78, 0x20, 0x23, 0x01, + 0x43, 0x18, 0x70, 0x20, 0x78, 0x22, 0x21, 0x01, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xfb, 0x28, 0x01, + 0xd0, 0xd7, 0x06, 0x2a, 0x0e, 0x12, 0x21, 0x02, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xf3, 0x28, 0x01, + 0xd0, 0xcf, 0x0a, 0x2a, 0x21, 0x03, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0xec, 0x28, 0x01, 0xd0, 0xc8, + 0x98, 0x01, 0x99, 0x00, 0x5a, 0x08, 0x9a, 0x03, + 0x1c, 0x29, 0xf0, 0x04, 0xff, 0x55, 0x42, 0xa8, + 0xd1, 0xbf, 0x21, 0x01, 0x1c, 0x38, 0x1c, 0x32, + 0xf0, 0x00, 0xf9, 0x02, 0x28, 0x01, 0xd0, 0xb8, + 0x79, 0x20, 0x23, 0xc3, 0x40, 0x18, 0x71, 0x20, + 0x79, 0x20, 0x08, 0x80, 0xd3, 0x0c, 0x78, 0x20, + 0x23, 0xfe, 0x40, 0x18, 0x70, 0x20, 0x78, 0x22, + 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xca, + 0x28, 0x01, 0xd0, 0xa6, 0x20, 0x04, 0xe0, 0x0b, + 0x78, 0x20, 0x23, 0xfe, 0x40, 0x18, 0x70, 0x20, + 0x78, 0x22, 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0xbd, 0x28, 0x01, 0xd0, 0x99, 0x20, 0x00, + 0xb0, 0x02, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x50, + 0x2e, 0x08, 0x1a, 0x58, 0x2e, 0x08, 0x1a, 0x54, + 0xb5, 0xf0, 0xb0, 0x81, 0x46, 0x6a, 0x1c, 0x07, + 0x4e, 0x16, 0x25, 0x00, 0x69, 0x71, 0x1c, 0x2b, + 0xf0, 0x00, 0xf8, 0x2c, 0x28, 0x00, 0xd1, 0x21, + 0xa8, 0x00, 0x88, 0x00, 0x30, 0x07, 0x04, 0x00, + 0x0c, 0x00, 0xf0, 0x03, 0xfb, 0xa3, 0x1c, 0x04, + 0xd0, 0x18, 0xa8, 0x00, 0x60, 0x25, 0x88, 0x00, + 0x80, 0xa0, 0xaa, 0x00, 0x88, 0x12, 0x69, 0x71, + 0x1d, 0xa0, 0xf0, 0x16, 0xfa, 0xb7, 0x01, 0x38, + 0x49, 0x09, 0x18, 0x40, 0x68, 0xc1, 0x29, 0x00, + 0xd1, 0x01, 0x60, 0xc4, 0xe0, 0x06, 0x68, 0x08, + 0x28, 0x00, 0xd0, 0x03, 0x68, 0x09, 0x68, 0x08, + 0x28, 0x00, 0xd1, 0xfb, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x54, + 0x2e, 0x08, 0x54, 0x50, 0xb5, 0xf0, 0x1c, 0x07, + 0x01, 0x00, 0xb0, 0x83, 0x90, 0x02, 0x1c, 0x14, + 0x1c, 0x0d, 0x49, 0x32, 0x91, 0x01, 0x18, 0x46, + 0x89, 0x30, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x01, + 0xe0, 0x58, 0x2b, 0x00, 0xd0, 0x12, 0x68, 0xf0, + 0x28, 0x00, 0xd0, 0x0f, 0x88, 0x82, 0x1d, 0x81, + 0x1c, 0x28, 0xf0, 0x16, 0xfa, 0x87, 0x68, 0xf0, + 0x88, 0x80, 0x80, 0x20, 0x68, 0xf0, 0x1c, 0x01, + 0x68, 0x00, 0x60, 0xf0, 0x1c, 0x08, 0xf0, 0x03, + 0xfb, 0x83, 0xe0, 0x42, 0x4a, 0x24, 0x92, 0x00, + 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x74, + 0x28, 0x01, 0xd0, 0xe0, 0x4e, 0x21, 0x79, 0x30, + 0x23, 0xc3, 0x40, 0x18, 0x71, 0x30, 0x79, 0x30, + 0x0a, 0x00, 0xd2, 0x01, 0x20, 0x03, 0xe0, 0x31, + 0x4a, 0x1d, 0x21, 0x02, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x63, 0x28, 0x01, 0xd0, 0xcf, 0x4a, 0x1b, + 0x21, 0x03, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x5c, + 0x28, 0x01, 0xd0, 0xc8, 0x7b, 0x30, 0x02, 0x00, + 0x7a, 0x31, 0x18, 0x40, 0x80, 0x20, 0x88, 0x20, + 0x4b, 0x15, 0x42, 0x98, 0xd0, 0xbf, 0x23, 0xff, + 0x33, 0x01, 0x42, 0x98, 0xdc, 0xbb, 0x1c, 0x38, + 0xf7, 0xff, 0xfd, 0xc0, 0x28, 0x01, 0xd0, 0xb6, + 0x98, 0x02, 0x99, 0x01, 0x5a, 0x08, 0x88, 0x21, + 0x1c, 0x2a, 0xf0, 0x04, 0xfe, 0xb3, 0x88, 0x21, + 0x42, 0x88, 0xd1, 0xac, 0x21, 0x01, 0x9a, 0x00, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x39, 0x28, 0x01, + 0xd0, 0xa5, 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x50, + 0x2e, 0x08, 0x1a, 0x58, 0x2e, 0x08, 0x1a, 0x54, + 0x2e, 0x08, 0x1a, 0x5c, 0x2e, 0x08, 0x1a, 0x60, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0xb0, 0xb0, 0x81, + 0xab, 0x00, 0x70, 0x1a, 0x1c, 0x0c, 0x1c, 0x07, + 0xb0, 0x82, 0xf7, 0xff, 0xfd, 0x93, 0x25, 0x01, + 0x28, 0x01, 0xd1, 0x01, 0x1c, 0x28, 0xe0, 0x11, + 0xab, 0x00, 0x80, 0x1c, 0xa8, 0x02, 0x90, 0x01, + 0x01, 0x3c, 0x4f, 0x08, 0x5b, 0x38, 0x46, 0x6a, + 0x21, 0x05, 0xf0, 0x04, 0xfe, 0xb1, 0x28, 0x00, + 0xda, 0x03, 0x19, 0xe1, 0x81, 0x0d, 0x1c, 0x28, + 0xe0, 0x00, 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x50, + 0xb5, 0xf0, 0x1c, 0x14, 0x1c, 0x0d, 0x1c, 0x07, + 0xb0, 0x82, 0xf7, 0xff, 0xfd, 0x6f, 0x26, 0x01, + 0x28, 0x01, 0xd1, 0x01, 0x1c, 0x30, 0xe0, 0x10, + 0xab, 0x00, 0x80, 0x1d, 0x94, 0x01, 0x01, 0x3c, + 0x4f, 0x08, 0x5b, 0x38, 0x46, 0x6a, 0x21, 0x04, + 0xf0, 0x04, 0xfe, 0x8e, 0x28, 0x00, 0xda, 0x03, + 0x19, 0xe1, 0x81, 0x0e, 0x1c, 0x30, 0xe0, 0x00, + 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x50, + 0xb5, 0xb0, 0xb0, 0x86, 0x90, 0x05, 0x91, 0x04, + 0x20, 0x00, 0x90, 0x01, 0x1c, 0x14, 0x46, 0x6a, + 0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, + 0xb4, 0x04, 0x1c, 0x1f, 0x21, 0x1d, 0x20, 0x00, + 0xaa, 0x09, 0xab, 0x08, 0xf0, 0x00, 0xf8, 0x82, + 0x25, 0x00, 0x43, 0xed, 0xb0, 0x04, 0x28, 0x00, + 0xdb, 0x3b, 0x46, 0x6a, 0xa8, 0x02, 0xa9, 0x01, + 0xb4, 0x07, 0xaa, 0x06, 0xb4, 0x04, 0x21, 0x1c, + 0x20, 0x00, 0xaa, 0x09, 0xab, 0x08, 0xf0, 0x00, + 0xf8, 0x71, 0xb0, 0x04, 0x28, 0x00, 0xdb, 0x2c, + 0x46, 0x6a, 0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, + 0xaa, 0x06, 0xb4, 0x04, 0x21, 0x15, 0x20, 0x00, + 0xaa, 0x09, 0xab, 0x08, 0xf0, 0x00, 0xf8, 0x62, + 0xb0, 0x04, 0x28, 0x00, 0xdb, 0x1d, 0x46, 0x6a, + 0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, + 0xb4, 0x04, 0x21, 0x20, 0x20, 0x00, 0xaa, 0x09, + 0xab, 0x08, 0xf0, 0x00, 0xf8, 0x53, 0xb0, 0x04, + 0x28, 0x00, 0xdb, 0x0e, 0x46, 0x6a, 0xa8, 0x02, + 0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, 0xb4, 0x04, + 0x21, 0x1a, 0x20, 0x00, 0xaa, 0x09, 0xab, 0x08, + 0xf0, 0x00, 0xf8, 0x44, 0xb0, 0x04, 0x28, 0x00, + 0xda, 0x01, 0x1c, 0x28, 0xe0, 0x3a, 0x98, 0x02, + 0x80, 0x20, 0x20, 0x01, 0x90, 0x03, 0x43, 0xc4, + 0x46, 0x6a, 0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, + 0xaa, 0x06, 0xb4, 0x04, 0x21, 0x1b, 0x20, 0x00, + 0xaa, 0x09, 0xab, 0x08, 0xf0, 0x00, 0xf8, 0x2e, + 0xb0, 0x04, 0x28, 0x00, 0xd0, 0xf0, 0x42, 0xa0, + 0xd0, 0xee, 0x28, 0x00, 0xdb, 0xe5, 0x46, 0x6a, + 0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, + 0xb4, 0x04, 0x21, 0x14, 0x20, 0x00, 0xaa, 0x09, + 0xab, 0x08, 0xf0, 0x00, 0xf8, 0x1b, 0xb0, 0x04, + 0x28, 0x00, 0xdb, 0xd6, 0x46, 0x6a, 0xa8, 0x02, + 0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, 0xb4, 0x04, + 0x21, 0xff, 0x20, 0x00, 0xaa, 0x09, 0xab, 0x08, + 0xf0, 0x00, 0xf8, 0x0c, 0xb0, 0x04, 0x28, 0x00, + 0xdb, 0xc7, 0x98, 0x01, 0x28, 0x0f, 0xd1, 0xc4, + 0x70, 0x38, 0x20, 0x01, 0xb0, 0x06, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x06, 0x08, + 0x0e, 0x00, 0xb0, 0x83, 0x90, 0x00, 0x25, 0x00, + 0x24, 0x00, 0x26, 0x00, 0x1c, 0x17, 0x22, 0x00, + 0x21, 0x00, 0xb0, 0x87, 0x91, 0x04, 0x98, 0x07, + 0x28, 0xff, 0xd1, 0x0b, 0x68, 0x38, 0x78, 0x00, + 0x28, 0xff, 0xd1, 0x07, 0x9b, 0x0d, 0x68, 0x18, + 0x28, 0x01, 0xd1, 0x03, 0x20, 0x00, 0x9b, 0x0d, + 0x60, 0x18, 0xe1, 0x87, 0x68, 0x38, 0x78, 0x01, + 0x78, 0x43, 0x93, 0x05, 0x30, 0x02, 0x32, 0x02, + 0x60, 0x38, 0x92, 0x06, 0x9a, 0x07, 0x42, 0x8a, + 0xd1, 0x5b, 0x21, 0x01, 0x91, 0x04, 0x9a, 0x07, + 0x2a, 0x1b, 0xd0, 0x57, 0xdc, 0x0b, 0x2a, 0x14, + 0xd0, 0x5a, 0x2a, 0x15, 0xd0, 0x11, 0x2a, 0x1a, + 0xd1, 0x4f, 0x78, 0x02, 0x07, 0x91, 0x0f, 0x89, + 0x29, 0x01, 0xdd, 0x14, 0xe0, 0x10, 0x2a, 0xc0, + 0xd0, 0x73, 0x2a, 0xc1, 0xd1, 0x45, 0xa1, 0xb6, + 0xf0, 0x16, 0xf9, 0x4c, 0x28, 0x00, 0xd1, 0x07, + 0xe1, 0x47, 0x78, 0x01, 0x29, 0x05, 0xd1, 0x03, + 0x78, 0x40, 0x28, 0x00, 0xd1, 0x00, 0xe1, 0x40, + 0x20, 0x00, 0x43, 0xc0, 0xe1, 0x56, 0x23, 0x3c, + 0x40, 0x1a, 0x78, 0x40, 0x9b, 0x16, 0x60, 0x18, + 0x29, 0x00, 0xd1, 0x02, 0x68, 0x38, 0x78, 0x80, + 0xe0, 0x04, 0x68, 0x38, 0x78, 0x83, 0x78, 0xc0, + 0x02, 0x00, 0x18, 0x18, 0x9b, 0x14, 0x60, 0x18, + 0x98, 0x14, 0x68, 0x00, 0x4b, 0xa8, 0x42, 0x98, + 0xdc, 0xe6, 0x68, 0x38, 0x18, 0x43, 0x78, 0xdb, + 0x08, 0x5b, 0xd3, 0xe1, 0x18, 0x89, 0x31, 0x04, + 0x18, 0x40, 0x90, 0x02, 0x9b, 0x0d, 0x68, 0x18, + 0x9a, 0x06, 0x1a, 0x80, 0x9a, 0x05, 0x1a, 0x51, + 0x1a, 0x40, 0x90, 0x03, 0xaa, 0x14, 0xca, 0x07, + 0xb4, 0x07, 0x9a, 0x16, 0xb4, 0x04, 0x21, 0xc0, + 0x98, 0x0b, 0xaa, 0x06, 0xab, 0x07, 0xf7, 0xff, + 0xff, 0x81, 0xb0, 0x04, 0x28, 0x00, 0xdb, 0xc7, + 0xe1, 0x07, 0xe1, 0x06, 0x78, 0x00, 0x09, 0x81, + 0x07, 0x89, 0xd1, 0x02, 0x21, 0x01, 0xe0, 0x01, + 0xe0, 0xc1, 0x21, 0x00, 0x9a, 0x13, 0x68, 0x12, + 0x40, 0x11, 0xd1, 0xb9, 0x23, 0xc0, 0x43, 0xdb, + 0x40, 0x18, 0x90, 0x00, 0x28, 0x0f, 0xd1, 0x01, + 0x99, 0x15, 0x60, 0x08, 0x20, 0x00, 0x99, 0x13, + 0x60, 0x08, 0x68, 0x39, 0x78, 0x08, 0x0a, 0x00, + 0xd3, 0x73, 0x78, 0x48, 0x28, 0x04, 0xd1, 0x71, + 0x78, 0x8a, 0x92, 0x09, 0x20, 0x0b, 0x40, 0x10, + 0xd0, 0x6d, 0x78, 0xcb, 0x20, 0x00, 0x22, 0x00, + 0x08, 0x5e, 0xd3, 0x00, 0x30, 0x01, 0x10, 0x5b, + 0xe0, 0x00, 0xe0, 0xa1, 0x06, 0x1b, 0x0e, 0x1b, + 0x32, 0x01, 0x2a, 0x08, 0xdb, 0xf4, 0x22, 0x04, + 0x1c, 0xc3, 0x2b, 0x04, 0xdb, 0x07, 0x5c, 0x8e, + 0x0a, 0x33, 0xd3, 0x00, 0x30, 0x01, 0x32, 0x01, + 0x1c, 0xc3, 0x42, 0x93, 0xda, 0xf7, 0x9a, 0x09, + 0x30, 0x01, 0x08, 0xd2, 0xd3, 0x25, 0x18, 0x0b, + 0x78, 0xda, 0x92, 0x08, 0x07, 0x92, 0x0f, 0x92, + 0x1c, 0x1e, 0x2a, 0x03, 0xd0, 0x09, 0x22, 0x00, + 0x79, 0x35, 0x0a, 0x2b, 0xd3, 0x04, 0x32, 0x01, + 0x18, 0xb3, 0x79, 0x1d, 0x0a, 0x2b, 0xd2, 0xfa, + 0x1c, 0x55, 0x23, 0x1c, 0x9a, 0x08, 0x40, 0x1a, + 0x2a, 0x1c, 0xd0, 0x0b, 0x22, 0x00, 0x19, 0x73, + 0x79, 0x1c, 0x1c, 0x1e, 0x0a, 0x23, 0xd3, 0x04, + 0x32, 0x01, 0x18, 0xb3, 0x79, 0x1c, 0x0a, 0x23, + 0xd2, 0xfa, 0x1c, 0x54, 0x19, 0x40, 0x19, 0x00, + 0x30, 0x01, 0x9a, 0x09, 0x09, 0x12, 0xd3, 0x0e, + 0x18, 0x0a, 0x78, 0xd6, 0x0a, 0x33, 0xd3, 0x09, + 0x79, 0x12, 0x23, 0xc0, 0x40, 0x13, 0x09, 0x9d, + 0x23, 0x30, 0x40, 0x1a, 0x09, 0x14, 0x19, 0x40, + 0x19, 0x00, 0x30, 0x01, 0x30, 0x01, 0x9a, 0x09, + 0x09, 0x52, 0xd3, 0x05, 0x18, 0x0a, 0x78, 0xd2, + 0x09, 0x52, 0xd3, 0x00, 0x30, 0x02, 0x30, 0x01, + 0x9a, 0x09, 0x09, 0x52, 0x07, 0x92, 0xd0, 0x11, + 0x18, 0x0a, 0x78, 0xd2, 0x23, 0x18, 0x40, 0x13, + 0x08, 0xdd, 0x23, 0x60, 0x40, 0x13, 0x09, 0x5c, + 0xe0, 0x02, 0xe0, 0x2c, 0xe0, 0x2b, 0xe0, 0x2a, + 0x0a, 0x12, 0xd3, 0x00, 0x00, 0x64, 0x19, 0x40, + 0x19, 0x00, 0x30, 0x01, 0x30, 0x03, 0x18, 0x09, + 0x91, 0x02, 0x9b, 0x0d, 0x68, 0x19, 0x9a, 0x06, + 0x1a, 0x89, 0x1a, 0x08, 0x90, 0x03, 0xaa, 0x14, + 0xca, 0x07, 0xb4, 0x07, 0x9a, 0x16, 0xb4, 0x04, + 0x21, 0xc0, 0x98, 0x0b, 0xaa, 0x06, 0xab, 0x07, + 0xf7, 0xff, 0xfe, 0xd0, 0xb0, 0x04, 0x28, 0x00, + 0xdb, 0x0d, 0xaa, 0x14, 0xca, 0x07, 0xb4, 0x07, + 0x9a, 0x16, 0xb4, 0x04, 0x21, 0xc1, 0x98, 0x0b, + 0xaa, 0x06, 0xab, 0x07, 0xf7, 0xff, 0xfe, 0xc2, + 0xb0, 0x04, 0x28, 0x00, 0xda, 0x02, 0x26, 0x01, + 0x43, 0xf6, 0xe0, 0x46, 0x98, 0x00, 0x9a, 0x16, + 0x68, 0x11, 0x42, 0x88, 0xd1, 0x01, 0x26, 0x01, + 0xe0, 0x3f, 0x26, 0x00, 0xe0, 0x3d, 0x9a, 0x05, + 0x2a, 0x00, 0xd0, 0x00, 0xe6, 0xf8, 0xe0, 0x38, + 0x99, 0x0a, 0x29, 0x1b, 0xd1, 0x05, 0xa1, 0x2f, + 0xf0, 0x16, 0xf8, 0x34, 0x28, 0x00, 0xd1, 0xf5, + 0xe0, 0x2f, 0x9a, 0x05, 0x2a, 0x0e, 0xd1, 0xf1, + 0x78, 0x01, 0x29, 0x41, 0xd1, 0xee, 0x78, 0x40, + 0x28, 0x02, 0xd1, 0xeb, 0xa0, 0x2a, 0xf0, 0x16, + 0xf8, 0x51, 0x90, 0x01, 0x68, 0x38, 0x9a, 0x01, + 0x30, 0x02, 0xa1, 0x27, 0xf0, 0x16, 0xf8, 0x6c, + 0x28, 0x00, 0xd1, 0xdf, 0x68, 0x38, 0x9a, 0x01, + 0x18, 0x80, 0x78, 0x80, 0xf0, 0x00, 0xf8, 0x4a, + 0x28, 0x00, 0xd0, 0xd7, 0x68, 0x38, 0x9a, 0x01, + 0x18, 0x80, 0x78, 0xc1, 0x29, 0x2e, 0xd1, 0xd1, + 0x79, 0x00, 0xf0, 0x00, 0xf8, 0x3f, 0x28, 0x00, + 0xd0, 0xcc, 0x68, 0x38, 0x9a, 0x01, 0x18, 0x80, + 0x79, 0x40, 0xf0, 0x00, 0xf8, 0x37, 0x28, 0x00, + 0xd0, 0xc4, 0x9a, 0x06, 0x9b, 0x05, 0x18, 0xd2, + 0x9b, 0x0d, 0x68, 0x18, 0x42, 0x82, 0xda, 0xbd, + 0x68, 0x38, 0x9b, 0x05, 0x18, 0xc0, 0x60, 0x38, + 0x9b, 0x0d, 0x68, 0x18, 0x1a, 0x80, 0x60, 0x18, + 0x99, 0x04, 0x29, 0x00, 0xd1, 0x00, 0xe6, 0x6e, + 0x98, 0x07, 0x28, 0x1b, 0xd1, 0x01, 0x1c, 0x30, + 0xe0, 0x00, 0x20, 0x01, 0xb0, 0x0a, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x4d, + 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xfe, 0x44, 0x56, 0x42, 0x5f, + 0x48, 0x4f, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x56, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x0e, 0x09, + 0x22, 0xf0, 0x40, 0x0a, 0x20, 0x00, 0x2a, 0x30, + 0xd1, 0x04, 0x07, 0x09, 0x0f, 0x09, 0x29, 0x09, + 0xdc, 0x00, 0x20, 0x01, 0x47, 0x70, 0xb5, 0xf3, + 0x26, 0x00, 0x1c, 0x07, 0xb0, 0x85, 0x48, 0x4f, + 0x90, 0x04, 0x23, 0x10, 0x5e, 0xc0, 0x22, 0x08, + 0x92, 0x01, 0x01, 0x01, 0x91, 0x03, 0x4a, 0x4c, + 0x92, 0x02, 0x18, 0x8d, 0x89, 0x29, 0x4c, 0x4b, + 0x29, 0x02, 0xd1, 0x47, 0x46, 0x6a, 0x23, 0x01, + 0x1d, 0xf9, 0x31, 0x01, 0xf7, 0xff, 0xfc, 0xc2, + 0x1c, 0x01, 0xd0, 0x16, 0x20, 0x04, 0x22, 0x03, + 0x29, 0x01, 0xd0, 0x2b, 0x29, 0x04, 0xd1, 0x6e, + 0x70, 0x22, 0x80, 0x60, 0x99, 0x03, 0x9a, 0x02, + 0x5a, 0x50, 0x80, 0xa0, 0x21, 0x02, 0x71, 0xa1, + 0x22, 0x08, 0x99, 0x06, 0x80, 0x0a, 0x1c, 0x38, + 0x1c, 0x21, 0xf0, 0x15, 0xff, 0x4b, 0x26, 0x03, + 0xe0, 0x5d, 0x21, 0x02, 0x70, 0x21, 0xa8, 0x00, + 0x88, 0x00, 0x30, 0x07, 0x04, 0x00, 0x0c, 0x00, + 0x80, 0x60, 0x99, 0x03, 0x9a, 0x02, 0x5a, 0x51, + 0x80, 0xa1, 0xa9, 0x00, 0x88, 0x09, 0x80, 0xe1, + 0x30, 0x04, 0x99, 0x06, 0x80, 0x08, 0x9a, 0x01, + 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x15, 0xff, 0x32, + 0x26, 0x02, 0xe0, 0x44, 0x81, 0x2a, 0x70, 0x20, + 0x80, 0x60, 0x99, 0x03, 0x9a, 0x02, 0x5a, 0x50, + 0x80, 0xa0, 0x22, 0x08, 0x99, 0x06, 0x80, 0x0a, + 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x15, 0xff, 0x22, + 0x26, 0x04, 0xe0, 0x34, 0x21, 0xff, 0x31, 0x01, + 0x1d, 0x2a, 0xf7, 0xff, 0xfa, 0x2d, 0x1c, 0x01, + 0x20, 0x0c, 0x29, 0x00, 0xd0, 0x16, 0x29, 0x07, + 0xd1, 0x29, 0x26, 0x01, 0x70, 0x26, 0x21, 0x08, + 0x80, 0x61, 0x99, 0x03, 0x9a, 0x02, 0x5a, 0x51, + 0x80, 0xa1, 0x21, 0x02, 0x71, 0xa1, 0x68, 0x69, + 0x81, 0x21, 0x99, 0x06, 0x80, 0x08, 0x1c, 0x02, + 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x15, 0xff, 0x02, + 0x81, 0x2e, 0xe0, 0x13, 0x23, 0x01, 0x70, 0x23, + 0x21, 0x08, 0x80, 0x61, 0x99, 0x03, 0x9a, 0x02, + 0x5a, 0x51, 0x80, 0xa1, 0x71, 0xa3, 0x68, 0x69, + 0x81, 0x21, 0x99, 0x06, 0x80, 0x08, 0x1c, 0x02, + 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x15, 0xfe, 0xee, + 0x21, 0x02, 0x81, 0x29, 0x26, 0x01, 0x98, 0x04, + 0x8a, 0x00, 0x30, 0x01, 0x99, 0x04, 0x82, 0x08, + 0x23, 0x10, 0x98, 0x04, 0x5e, 0xc0, 0x28, 0x02, + 0xd1, 0x02, 0x20, 0x00, 0x99, 0x04, 0x82, 0x08, + 0x1c, 0x30, 0xb0, 0x05, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x54, + 0x2e, 0x08, 0x54, 0x50, 0x2e, 0x08, 0x54, 0x40, + 0xb5, 0x80, 0x27, 0x00, 0x78, 0x00, 0x49, 0x0d, + 0x72, 0x08, 0x7a, 0x0b, 0x48, 0x0c, 0x2b, 0x01, + 0xd1, 0x06, 0xca, 0x08, 0xc0, 0x08, 0xca, 0x08, + 0xc0, 0x08, 0xca, 0x0c, 0xc0, 0x0c, 0xe0, 0x07, + 0x68, 0xc9, 0x60, 0x01, 0x1c, 0x08, 0x49, 0x07, + 0xf7, 0xff, 0xff, 0x41, 0x1c, 0x07, 0xd0, 0x01, + 0xf0, 0x00, 0xf8, 0x50, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x6c, + 0x2e, 0x08, 0x54, 0x70, 0x2e, 0x08, 0x1a, 0x7c, + 0xb5, 0xb0, 0x24, 0x00, 0x4f, 0x17, 0x72, 0x3c, + 0x20, 0x01, 0xf0, 0x02, 0xff, 0xc3, 0x28, 0x00, + 0xd1, 0x03, 0x43, 0xc0, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0xf7, 0xff, 0xf9, 0x25, 0x28, 0x00, + 0xdc, 0x04, 0x20, 0x01, 0x43, 0xc0, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x25, 0x01, + 0x49, 0x0d, 0x00, 0x82, 0x18, 0x53, 0x70, 0x9d, + 0x52, 0x8c, 0x30, 0x01, 0x28, 0x02, 0xdb, 0xf8, + 0x68, 0xf8, 0x28, 0x00, 0xd1, 0x0a, 0x20, 0xff, + 0x30, 0x0d, 0xf0, 0x02, 0xff, 0x67, 0x60, 0xf8, + 0x28, 0x00, 0xd1, 0x03, 0x38, 0x03, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x28, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x6c, + 0x2e, 0x08, 0x1a, 0x6c, 0xb5, 0x80, 0x4f, 0x06, + 0x68, 0xf8, 0xf0, 0x02, 0xff, 0x79, 0x20, 0x00, + 0x60, 0xf8, 0xf7, 0xff, 0xf9, 0x53, 0xf0, 0x02, + 0xfe, 0x45, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x6c, 0xb5, 0x80, 0x21, 0x00, + 0x48, 0x18, 0x7a, 0x02, 0x48, 0x18, 0x2a, 0x01, + 0xd1, 0x0e, 0x78, 0x42, 0x2a, 0x13, 0xd1, 0x03, + 0x68, 0x87, 0xf0, 0x00, 0xf8, 0x2b, 0x1c, 0x01, + 0x29, 0x00, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x02, + 0xff, 0x5b, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x68, 0x00, 0x78, 0x00, 0x28, 0x01, 0xd0, 0x14, + 0x28, 0x02, 0xd0, 0x08, 0x28, 0x03, 0xd0, 0x0b, + 0x28, 0x04, 0xd1, 0xf2, 0xf0, 0x00, 0xf8, 0x8c, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x00, + 0xf8, 0x6b, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0xf0, 0x00, 0xf8, 0x4c, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0xf0, 0x00, 0xf8, 0x23, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x6c, + 0x2e, 0x08, 0x54, 0x70, 0xb5, 0x80, 0xb0, 0x83, + 0x4f, 0x0b, 0x88, 0xb8, 0xf0, 0x00, 0xf8, 0xae, + 0x28, 0x00, 0xdb, 0x0a, 0x88, 0xf9, 0xab, 0x02, + 0x80, 0x19, 0x68, 0xb9, 0x91, 0x01, 0x46, 0x6b, + 0x21, 0x13, 0xaa, 0x01, 0xf0, 0x00, 0xf8, 0xd6, + 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x00, + 0xb0, 0x03, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x70, 0xb5, 0xf0, 0xb0, 0x83, + 0x4e, 0x0f, 0x68, 0x30, 0x88, 0x84, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x6e, 0x25, 0x01, 0x1c, 0x07, + 0xd4, 0x11, 0x68, 0x30, 0x79, 0x81, 0xab, 0x01, + 0x70, 0x19, 0x89, 0x00, 0x80, 0x58, 0x46, 0x6b, + 0x21, 0x01, 0x1c, 0x38, 0xaa, 0x01, 0xf0, 0x00, + 0xf8, 0xb5, 0x28, 0x00, 0xd1, 0x03, 0x1c, 0x38, + 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x91, 0x1c, 0x28, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x70, 0xb5, 0x90, 0xb0, 0x83, + 0x4c, 0x0a, 0x68, 0x20, 0x88, 0x80, 0xf0, 0x00, + 0xf8, 0x4b, 0x27, 0x01, 0x28, 0x00, 0xdb, 0x08, + 0x68, 0x21, 0x79, 0x89, 0xab, 0x01, 0x70, 0x19, + 0x46, 0x6b, 0x21, 0x03, 0xaa, 0x01, 0xf0, 0x00, + 0xf8, 0x95, 0x1c, 0x38, 0xb0, 0x03, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x70, + 0xb5, 0x90, 0xb0, 0x83, 0x4c, 0x0b, 0x68, 0x20, + 0x88, 0x80, 0xf0, 0x00, 0xf8, 0x53, 0x27, 0x01, + 0x28, 0x00, 0xdb, 0x0a, 0x68, 0x21, 0x88, 0xca, + 0xab, 0x02, 0x80, 0x1a, 0x31, 0x08, 0x91, 0x01, + 0x46, 0x6b, 0x21, 0x02, 0xaa, 0x01, 0xf0, 0x00, + 0xf8, 0x79, 0x1c, 0x38, 0xb0, 0x03, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x70, + 0xb5, 0xb0, 0xb0, 0x81, 0x48, 0x0b, 0x68, 0x00, + 0x88, 0x84, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x36, + 0x25, 0x01, 0x1c, 0x07, 0xd4, 0x09, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x04, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x61, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, + 0xf8, 0x3f, 0x1c, 0x28, 0xb0, 0x01, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x70, + 0xb4, 0x80, 0x04, 0x03, 0x0c, 0x1b, 0x20, 0x00, + 0x49, 0x0d, 0x00, 0x82, 0x18, 0x57, 0x78, 0xbf, + 0x2f, 0x01, 0xd1, 0x06, 0x00, 0x87, 0x53, 0xcb, + 0x23, 0x02, 0x18, 0x51, 0x70, 0x8b, 0xbc, 0x80, + 0x47, 0x70, 0x5a, 0x8a, 0x42, 0x9a, 0xd1, 0x03, + 0x20, 0x01, 0x43, 0xc0, 0xbc, 0x80, 0x47, 0x70, + 0x30, 0x01, 0x28, 0x02, 0xdb, 0xe9, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0x6c, 0xb4, 0x80, 0x04, 0x02, + 0x0c, 0x12, 0x20, 0x00, 0x49, 0x07, 0x00, 0x83, + 0x18, 0x5f, 0x78, 0xbf, 0x2f, 0x01, 0xd0, 0x02, + 0x5a, 0xcb, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, + 0x28, 0x02, 0xdb, 0xf4, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0x6c, + 0xb4, 0x80, 0x28, 0x00, 0xda, 0x05, 0x28, 0x02, + 0xdb, 0x03, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, + 0x47, 0x70, 0x23, 0x01, 0x00, 0x82, 0x49, 0x03, + 0x18, 0x57, 0x70, 0xbb, 0x23, 0x00, 0x52, 0x8b, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0x6c, + 0xb5, 0x00, 0x49, 0x03, 0x78, 0x08, 0xf0, 0x02, + 0xfd, 0x77, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x70, 0xb5, 0x90, 0x06, 0x09, + 0x0e, 0x09, 0x00, 0x87, 0x4c, 0x0a, 0x19, 0x3f, + 0x78, 0xbf, 0x2f, 0x02, 0xd0, 0x06, 0x2f, 0x03, + 0xd1, 0x09, 0xf0, 0x00, 0xf8, 0x39, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x00, 0xf8, 0x0a, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0x6c, 0xb5, 0x90, 0x06, 0x09, + 0x0e, 0x09, 0x27, 0x01, 0x60, 0x1f, 0x29, 0x01, + 0xd1, 0x19, 0x23, 0x12, 0x49, 0x0e, 0x70, 0x0b, + 0x23, 0x11, 0x70, 0x4b, 0x23, 0x08, 0x80, 0x4b, + 0x00, 0x84, 0x4f, 0x0c, 0x5b, 0x38, 0x80, 0x88, + 0x78, 0x10, 0x71, 0x88, 0x88, 0x50, 0x81, 0x08, + 0xf7, 0xff, 0xff, 0xc2, 0x28, 0x00, 0xd0, 0x06, + 0x20, 0x03, 0x19, 0xe1, 0x70, 0x88, 0x20, 0x01, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x70, 0x2e, 0x08, 0x1a, 0x6c, + 0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x17, + 0x22, 0x01, 0xb0, 0x81, 0x9b, 0x04, 0x25, 0x01, + 0x00, 0x86, 0x60, 0x1a, 0x48, 0x38, 0x90, 0x00, + 0x4c, 0x38, 0x29, 0x02, 0xd0, 0x23, 0x29, 0x03, + 0xd0, 0x41, 0x29, 0x04, 0xd0, 0x4f, 0x29, 0x13, + 0xd1, 0x5e, 0x88, 0xba, 0x98, 0x00, 0x5b, 0x80, + 0x68, 0x39, 0xf7, 0xfe, 0xff, 0x9d, 0x1c, 0x05, + 0xd1, 0x11, 0x20, 0x12, 0x70, 0x20, 0x20, 0x15, + 0x70, 0x60, 0x20, 0x04, 0x80, 0x60, 0x98, 0x00, + 0x5b, 0x80, 0x80, 0xa0, 0xf7, 0xff, 0xff, 0x88, + 0x28, 0x00, 0xd0, 0x4b, 0x20, 0x00, 0x9b, 0x04, + 0x25, 0x01, 0x60, 0x18, 0xe0, 0x46, 0x20, 0x00, + 0x9b, 0x04, 0x60, 0x18, 0xe0, 0x41, 0x88, 0xb8, + 0xf0, 0x02, 0xfd, 0xac, 0x60, 0xa0, 0x1c, 0x01, + 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x3b, 0x20, 0x12, + 0x70, 0x20, 0x20, 0x13, 0x70, 0x60, 0x20, 0x08, + 0x80, 0x60, 0x98, 0x00, 0x5b, 0x80, 0x80, 0xa0, + 0x88, 0xb8, 0x80, 0xe0, 0x88, 0xba, 0x1c, 0x08, + 0x68, 0x39, 0xf0, 0x15, 0xfc, 0xb7, 0xf7, 0xff, + 0xff, 0x63, 0x28, 0x00, 0xd1, 0x26, 0x68, 0xa0, + 0xf0, 0x02, 0xfd, 0xb6, 0xe0, 0x21, 0x20, 0x12, + 0x70, 0x20, 0x20, 0x14, 0x70, 0x60, 0x20, 0x04, + 0x80, 0x60, 0x98, 0x00, 0x5b, 0x80, 0x80, 0xa0, + 0x78, 0x38, 0x80, 0xa0, 0xf7, 0xff, 0xff, 0x50, + 0x28, 0x00, 0xd1, 0x13, 0xe0, 0x11, 0x20, 0x12, + 0x70, 0x20, 0x70, 0x60, 0x20, 0x04, 0x80, 0x60, + 0x98, 0x00, 0x5b, 0x80, 0x80, 0xa0, 0xf7, 0xff, + 0xff, 0x43, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x02, + 0x99, 0x00, 0x18, 0x71, 0x70, 0x88, 0xe0, 0x01, + 0xe7, 0xff, 0x25, 0x00, 0x1c, 0x28, 0xb0, 0x01, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x6c, 0x2e, 0x08, 0x54, 0x70, + 0xb5, 0xf0, 0x1c, 0x17, 0x06, 0x02, 0x0e, 0x12, + 0x04, 0x0c, 0x0c, 0x24, 0x1c, 0x59, 0x1c, 0x48, + 0x1c, 0x1d, 0x1c, 0x43, 0xb0, 0x81, 0x93, 0x00, + 0x1f, 0xd6, 0x3e, 0x89, 0x2e, 0x07, 0xd2, 0x51, + 0xa3, 0x01, 0x5d, 0x9b, 0x00, 0x5b, 0x44, 0x9f, + 0x03, 0x4d, 0x14, 0x3e, 0x4d, 0x27, 0x31, 0x00, + 0x70, 0x2a, 0x1c, 0x0d, 0x21, 0x02, 0x70, 0x29, + 0x1c, 0x01, 0x1c, 0x05, 0x1c, 0x20, 0xf0, 0x00, + 0xf8, 0xab, 0x88, 0xba, 0x68, 0x39, 0x1c, 0xa8, + 0xf0, 0x15, 0xfc, 0x5c, 0x88, 0xb8, 0x30, 0x04, + 0xe0, 0x3a, 0x70, 0x2a, 0x1c, 0x0d, 0x21, 0x07, + 0x70, 0x29, 0x1c, 0x05, 0x79, 0x38, 0x70, 0x28, + 0x9d, 0x00, 0x22, 0x04, 0x1c, 0x28, 0x1c, 0x39, + 0xf0, 0x15, 0xfc, 0x4c, 0x1c, 0x20, 0x1d, 0x29, + 0xf0, 0x00, 0xf8, 0x92, 0x20, 0x09, 0xe0, 0x27, + 0x70, 0x2a, 0x1c, 0x0d, 0x21, 0x02, 0x70, 0x29, + 0x1c, 0x01, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x88, + 0x20, 0x04, 0xe0, 0x1d, 0x70, 0x2a, 0x1c, 0x0d, + 0x21, 0x03, 0x70, 0x29, 0x1c, 0x05, 0x78, 0xb8, + 0x70, 0x28, 0x99, 0x00, 0x1c, 0x20, 0xf0, 0x00, + 0xf8, 0x7b, 0x20, 0x05, 0xe0, 0x10, 0x70, 0x2a, + 0x1c, 0x0d, 0x21, 0x06, 0x70, 0x29, 0x22, 0x04, + 0x1c, 0x39, 0x1c, 0x05, 0xf0, 0x15, 0xfc, 0x26, + 0x1c, 0x20, 0x1d, 0x29, 0xf0, 0x00, 0xf8, 0x6c, + 0x20, 0x08, 0xe0, 0x01, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf0, 0x1c, 0x0f, 0x78, 0x01, 0x9d, 0x05, + 0x70, 0x11, 0x78, 0x41, 0x78, 0x12, 0x1c, 0x86, + 0x30, 0x03, 0x3a, 0x90, 0x1c, 0x1c, 0x2a, 0x07, + 0xd2, 0x51, 0xa3, 0x02, 0x5c, 0x9b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x11, 0x4d, 0x4d, + 0x1b, 0x2e, 0x39, 0x00, 0x29, 0x02, 0xd1, 0x3d, + 0x1c, 0x30, 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x4e, + 0x1c, 0xb0, 0x60, 0x28, 0x1f, 0x38, 0x80, 0xa8, + 0x88, 0x20, 0x80, 0xe8, 0xe0, 0x37, 0x29, 0x04, + 0xd1, 0x30, 0x22, 0x04, 0x1c, 0x68, 0x1c, 0x31, + 0xf0, 0x15, 0xfb, 0xf0, 0x2f, 0x06, 0xd0, 0x2e, + 0xe0, 0x28, 0x29, 0x07, 0xd1, 0x26, 0x78, 0x31, + 0x71, 0x29, 0x1c, 0x01, 0x1c, 0x06, 0x22, 0x04, + 0x1c, 0x28, 0xf0, 0x15, 0xfb, 0xe3, 0x1d, 0x30, + 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x2f, 0x88, 0x20, + 0x80, 0xe8, 0x2f, 0x09, 0xd0, 0x1b, 0xe0, 0x15, + 0x29, 0x02, 0xd1, 0x13, 0x1c, 0x30, 0x1c, 0x21, + 0xf0, 0x00, 0xf8, 0x24, 0x88, 0x20, 0x80, 0x28, + 0x2f, 0x04, 0xd0, 0x10, 0xe0, 0x0a, 0x29, 0x03, + 0xd1, 0x08, 0x78, 0x31, 0x70, 0xa9, 0x1c, 0x21, + 0xf0, 0x00, 0xf8, 0x18, 0x88, 0x20, 0x80, 0x28, + 0x2f, 0x05, 0xd0, 0x04, 0x20, 0x01, 0x43, 0xc0, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x06, 0x00, 0x0e, 0x00, 0x0a, 0x02, 0x70, 0x0a, + 0x70, 0x48, 0x47, 0x70, 0x78, 0x02, 0x02, 0x12, + 0x78, 0x40, 0x18, 0x10, 0x80, 0x08, 0x47, 0x70, + 0xb5, 0x00, 0x78, 0x01, 0x48, 0x0b, 0x71, 0x01, + 0x79, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x02, + 0xd1, 0x0b, 0x48, 0x09, 0xca, 0x08, 0xc0, 0x08, + 0xca, 0x08, 0xc0, 0x08, 0xca, 0x0c, 0xc0, 0x0c, + 0xf0, 0x00, 0xf8, 0x37, 0x20, 0x00, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x80, + 0x2e, 0x08, 0x54, 0x80, 0xb5, 0x80, 0x20, 0x04, + 0xf0, 0x02, 0xfc, 0xa4, 0x22, 0x00, 0x28, 0x00, + 0xda, 0x03, 0x1c, 0x10, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x48, 0x0a, 0x71, 0x02, 0x21, 0x00, + 0x20, 0x01, 0x4b, 0x09, 0x01, 0x0f, 0x55, 0xd8, + 0x31, 0x01, 0x29, 0x20, 0xdb, 0xfa, 0x21, 0x00, + 0x4b, 0x06, 0x00, 0x4f, 0x53, 0xda, 0x31, 0x01, + 0x29, 0x10, 0xdb, 0xfa, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x80, + 0x2e, 0x08, 0x54, 0xa0, 0x2e, 0x08, 0x56, 0xa0, + 0xb5, 0x00, 0xf0, 0x02, 0xfb, 0x3b, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x80, 0x20, 0x00, 0x49, 0x1e, + 0x79, 0x0a, 0x49, 0x1e, 0x2a, 0x01, 0xd1, 0x26, + 0x78, 0x4a, 0x2a, 0x43, 0xd0, 0x1d, 0xdc, 0x09, + 0x2a, 0x31, 0xd0, 0x14, 0x2a, 0x33, 0xd0, 0x15, + 0x2a, 0x34, 0xd1, 0x25, 0x68, 0x8f, 0xf0, 0x00, + 0xf8, 0x2f, 0xe0, 0x21, 0x2a, 0x45, 0xd0, 0x06, + 0x2a, 0x46, 0xd0, 0x11, 0x2a, 0x48, 0xd1, 0x1b, + 0xf0, 0x00, 0xf8, 0xcc, 0xe0, 0x18, 0x68, 0x8f, + 0xf0, 0x00, 0xf8, 0x6a, 0xe0, 0x14, 0xf0, 0x00, + 0xf8, 0x8b, 0xe0, 0x11, 0xf0, 0x00, 0xf8, 0x92, + 0xe0, 0x0e, 0xf0, 0x00, 0xf8, 0xc9, 0xe0, 0x0b, + 0xf0, 0x00, 0xf8, 0xf0, 0xe0, 0x08, 0x88, 0x08, + 0x28, 0x70, 0xdb, 0x04, 0x28, 0x80, 0xda, 0x02, + 0xf0, 0x00, 0xf9, 0x0c, 0xe0, 0x00, 0x20, 0x01, + 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x02, + 0xfc, 0x2b, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x80, 0x2e, 0x08, 0x54, 0x80, + 0xb5, 0x90, 0xb0, 0x85, 0xaa, 0x01, 0xb4, 0x04, + 0x4f, 0x1f, 0x89, 0xb9, 0x68, 0xb8, 0xaa, 0x05, + 0xab, 0x04, 0xf7, 0xff, 0xfe, 0xf9, 0x24, 0x00, + 0xb0, 0x01, 0x28, 0x00, 0xda, 0x01, 0x1c, 0x20, + 0xe0, 0x2d, 0xa8, 0x04, 0x78, 0x00, 0x28, 0x91, + 0xd0, 0x06, 0xa8, 0x03, 0x88, 0x00, 0xf0, 0x00, + 0xf9, 0x4f, 0x1c, 0x07, 0xd4, 0xf3, 0xe0, 0x10, + 0x79, 0x38, 0xab, 0x01, 0x70, 0x18, 0xa8, 0x01, + 0x78, 0x00, 0xf0, 0x00, 0xf8, 0xff, 0x28, 0x00, + 0xda, 0x06, 0x20, 0xf1, 0xab, 0x02, 0x70, 0x58, + 0xa8, 0x01, 0xf0, 0x00, 0xfe, 0x77, 0xe0, 0x12, + 0x1c, 0x07, 0x46, 0x6b, 0xa9, 0x04, 0x78, 0x09, + 0x1c, 0x38, 0xaa, 0x01, 0xf0, 0x00, 0xf9, 0xe2, + 0x28, 0x00, 0xd0, 0xd8, 0x01, 0x38, 0x49, 0x07, + 0x5c, 0x08, 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x0c, 0x98, 0x00, 0xb0, 0x05, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0x90, 0xb0, 0x81, 0x4c, 0x0e, 0x88, 0xa0, + 0xf0, 0x00, 0xf9, 0x1a, 0x1c, 0x07, 0xd4, 0x07, + 0x78, 0x61, 0x46, 0x6b, 0x22, 0x00, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0xc0, 0x28, 0x00, 0xd1, 0x01, + 0x20, 0x00, 0x90, 0x00, 0x01, 0x38, 0x49, 0x07, + 0x5c, 0x08, 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0xe8, 0x98, 0x00, 0xb0, 0x01, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0x00, 0x48, 0x03, 0x79, 0x00, 0xf0, 0x00, + 0xfd, 0xef, 0x20, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x80, 0xb5, 0xf0, 0xb0, 0x83, + 0x4e, 0x14, 0x79, 0x30, 0xab, 0x00, 0x70, 0x18, + 0x27, 0x00, 0x4c, 0x13, 0x01, 0x3d, 0x5d, 0x60, + 0x28, 0x01, 0xd0, 0x13, 0x19, 0x29, 0x78, 0x4a, + 0x79, 0x30, 0x42, 0x82, 0xd0, 0x02, 0x79, 0x09, + 0x42, 0x81, 0xd1, 0x0b, 0x78, 0x71, 0x46, 0x6a, + 0x1c, 0x38, 0xab, 0x02, 0xf0, 0x00, 0xf9, 0x86, + 0x5d, 0x60, 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0xb4, 0x37, 0x01, 0x2f, 0x20, + 0xdb, 0xe4, 0xa8, 0x00, 0x78, 0x00, 0xf0, 0x00, + 0xfd, 0xd9, 0x98, 0x02, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, + 0x2e, 0x08, 0x54, 0xa0, 0xb5, 0x00, 0x48, 0x03, + 0x79, 0x00, 0xf0, 0x00, 0xfd, 0xe1, 0x20, 0x01, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, + 0xb5, 0x90, 0xb0, 0x83, 0x4c, 0x11, 0x88, 0xa0, + 0xf0, 0x00, 0xf8, 0xb2, 0x1c, 0x07, 0xd5, 0x01, + 0x20, 0x01, 0xe0, 0x0c, 0x79, 0xa0, 0xab, 0x01, + 0x70, 0x18, 0x79, 0xe0, 0x70, 0x58, 0x78, 0x61, + 0x46, 0x6a, 0x1c, 0x38, 0x33, 0x04, 0xf0, 0x00, + 0xf9, 0x51, 0x28, 0x00, 0xd1, 0x00, 0x90, 0x02, + 0x01, 0x38, 0x49, 0x07, 0x5c, 0x08, 0x28, 0x02, + 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x7a, + 0x98, 0x02, 0xb0, 0x03, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x80, + 0x2e, 0x08, 0x54, 0xa0, 0xb5, 0x90, 0xb0, 0x81, + 0x4c, 0x0e, 0x88, 0xa0, 0xf0, 0x00, 0xf8, 0x88, + 0x1c, 0x07, 0xd5, 0x01, 0x20, 0x01, 0xe0, 0x07, + 0x78, 0x61, 0x46, 0x6b, 0x22, 0x00, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x2c, 0x28, 0x00, 0xd1, 0x00, + 0x90, 0x00, 0x01, 0x38, 0x49, 0x06, 0x5c, 0x08, + 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x55, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, + 0x2e, 0x08, 0x54, 0xa0, 0xb5, 0x80, 0xb0, 0x81, + 0x48, 0x0e, 0x88, 0x00, 0xf0, 0x00, 0xf8, 0x9e, + 0x1c, 0x07, 0xd5, 0x01, 0x20, 0x01, 0xe0, 0x11, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xd3, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x70, 0x1c, 0x38, 0xf0, 0x00, + 0xf9, 0x05, 0x01, 0x38, 0x49, 0x06, 0x5c, 0x08, + 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x31, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, + 0x2e, 0x08, 0x54, 0xa0, 0xb4, 0xb0, 0x06, 0x02, + 0x0e, 0x12, 0x49, 0x10, 0x23, 0x00, 0x5e, 0xcc, + 0x43, 0xdf, 0x2c, 0x20, 0xda, 0x17, 0x20, 0x00, + 0x4b, 0x0d, 0x01, 0x05, 0x5d, 0x5d, 0x2d, 0x01, + 0xd1, 0x0e, 0x25, 0x02, 0x01, 0x07, 0x55, 0xdd, + 0x18, 0xfb, 0x70, 0x5a, 0x1c, 0x42, 0x80, 0x5a, + 0x22, 0x00, 0x71, 0x1a, 0x80, 0xda, 0x81, 0x1a, + 0x1c, 0x62, 0x80, 0x0a, 0xbc, 0xb0, 0x47, 0x70, + 0x30, 0x01, 0x28, 0x20, 0xdb, 0xe9, 0x1c, 0x38, + 0xbc, 0xb0, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0x80, + 0x2e, 0x08, 0x54, 0xa0, 0xb5, 0x80, 0x1c, 0x07, + 0xd5, 0x06, 0x2f, 0x20, 0xdb, 0x04, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x87, 0x21, 0x01, + 0x01, 0x38, 0x4a, 0x05, 0x54, 0x11, 0x48, 0x05, + 0x88, 0x01, 0x39, 0x01, 0x80, 0x01, 0x1c, 0x38, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0xa0, 0x2e, 0x08, 0x1a, 0x80, + 0xb4, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, + 0x49, 0x09, 0x01, 0x03, 0x5c, 0xcf, 0x2f, 0x01, + 0xd0, 0x06, 0x18, 0x5b, 0x88, 0x5f, 0x42, 0x97, + 0xd0, 0x07, 0x88, 0xdb, 0x42, 0x93, 0xd0, 0x04, + 0x30, 0x01, 0x28, 0x20, 0xdb, 0xf1, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0xa0, 0xb4, 0x90, 0x04, 0x02, + 0x0c, 0x12, 0x06, 0x0b, 0x0e, 0x1b, 0x20, 0x00, + 0x49, 0x0b, 0x01, 0x07, 0x5d, 0xcc, 0x2c, 0x01, + 0xd0, 0x0b, 0x18, 0x7f, 0x88, 0x7f, 0x42, 0x97, + 0xd1, 0x07, 0x01, 0x02, 0x18, 0x51, 0x71, 0x0b, + 0x1d, 0xc2, 0x32, 0x1a, 0x80, 0xca, 0xbc, 0x90, + 0x47, 0x70, 0x30, 0x01, 0x28, 0x20, 0xdb, 0xec, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0x47, 0x70, + 0x2e, 0x08, 0x54, 0xa0, 0xb4, 0x80, 0x04, 0x02, + 0x0c, 0x12, 0x20, 0x00, 0x49, 0x07, 0x01, 0x03, + 0x5c, 0xcf, 0x2f, 0x01, 0xd0, 0x03, 0x18, 0x5b, + 0x89, 0x1b, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, + 0x28, 0x20, 0xdb, 0xf4, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0x80, 0x04, 0x01, 0x0c, 0x09, 0x22, 0x00, + 0x20, 0x00, 0x4b, 0x0f, 0x00, 0x47, 0x5b, 0xdf, + 0x2f, 0x00, 0xd1, 0x06, 0x1d, 0xc2, 0x32, 0x69, + 0x04, 0x12, 0x0c, 0x12, 0x00, 0x40, 0x52, 0x1a, + 0xe0, 0x02, 0x30, 0x01, 0x28, 0x10, 0xdd, 0xf1, + 0x2a, 0x00, 0xd0, 0x09, 0x20, 0x01, 0x04, 0x80, + 0x43, 0x10, 0xf0, 0x02, 0xf9, 0xdf, 0x04, 0x00, + 0x0c, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xa0, 0xb5, 0x90, 0x1c, 0x07, + 0x01, 0x00, 0x49, 0x0e, 0x18, 0x44, 0x89, 0x20, + 0x28, 0x00, 0xd0, 0x13, 0xf0, 0x02, 0xfa, 0x02, + 0x20, 0x00, 0x49, 0x0b, 0x01, 0x3a, 0x4b, 0x09, + 0x18, 0xd2, 0x89, 0x13, 0x22, 0x00, 0x00, 0x47, + 0x5b, 0xcf, 0x42, 0x9f, 0xd1, 0x02, 0x00, 0x40, + 0x52, 0x0a, 0xe0, 0x02, 0x30, 0x01, 0x28, 0x10, + 0xdd, 0xf5, 0x81, 0x22, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0xa0, + 0x2e, 0x08, 0x56, 0xa0, 0xb5, 0x00, 0x49, 0x03, + 0x78, 0x08, 0xf0, 0x02, 0xf9, 0x41, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x80, + 0xb5, 0x00, 0x49, 0x03, 0x78, 0x08, 0xf0, 0x02, + 0xf9, 0x37, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x90, 0xb5, 0x90, 0x06, 0x09, + 0x0e, 0x09, 0x1c, 0x1f, 0x01, 0x03, 0x4c, 0x1d, + 0x5c, 0xe3, 0x1e, 0x9c, 0x2c, 0x07, 0xd2, 0x31, + 0xa3, 0x01, 0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, + 0x09, 0x15, 0x03, 0x0f, 0x1b, 0x21, 0x27, 0x00, + 0x1c, 0x3b, 0xf0, 0x00, 0xf9, 0x23, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x3b, 0xf0, 0x00, + 0xf8, 0x27, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x3b, 0xf0, 0x00, 0xf8, 0x5d, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x3b, 0xf0, 0x00, + 0xfa, 0x51, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x3b, 0xf0, 0x00, 0xfb, 0x65, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x3b, 0xf0, 0x00, + 0xfa, 0xf1, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x3b, 0xf0, 0x00, 0xfb, 0x35, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x1f, + 0x23, 0x01, 0x60, 0x3b, 0xb0, 0x81, 0x29, 0x91, + 0xd1, 0x23, 0x21, 0x45, 0x4b, 0x16, 0x70, 0x19, + 0x21, 0x42, 0x70, 0x59, 0x21, 0x08, 0x80, 0x59, + 0x01, 0x06, 0x4d, 0x14, 0x19, 0x74, 0x78, 0x60, + 0x71, 0x18, 0x88, 0x60, 0x80, 0xd8, 0x1c, 0x51, + 0x91, 0x00, 0x22, 0x04, 0x1d, 0xd8, 0x30, 0x01, + 0xf0, 0x15, 0xf8, 0xa8, 0xf7, 0xff, 0xff, 0x8a, + 0x28, 0x00, 0xd1, 0x01, 0x60, 0x38, 0xe0, 0x0f, + 0x22, 0x04, 0x99, 0x00, 0x1d, 0xe0, 0x30, 0x03, + 0xf0, 0x15, 0xf8, 0x9c, 0x20, 0x05, 0x55, 0xa8, + 0xe0, 0x03, 0x29, 0x7f, 0xdc, 0x01, 0x29, 0x45, + 0xd1, 0x01, 0x20, 0x00, 0x60, 0x38, 0x20, 0x01, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0xff, 0x1c, 0x04, 0x06, 0x08, 0x0e, 0x00, + 0x21, 0x01, 0xb0, 0x84, 0x9b, 0x07, 0x25, 0x01, + 0x60, 0x19, 0x4e, 0x55, 0x01, 0x21, 0x91, 0x03, + 0x28, 0x33, 0xd0, 0x5d, 0x28, 0x43, 0xd1, 0x5c, + 0x20, 0x09, 0xf0, 0x02, 0xf9, 0x57, 0x4f, 0x51, + 0x60, 0xb8, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x01, + 0xe0, 0x94, 0x9a, 0x06, 0x79, 0x51, 0x01, 0x20, + 0x4a, 0x4b, 0x18, 0x84, 0x1d, 0xe0, 0x30, 0x03, + 0x90, 0x02, 0x29, 0x00, 0xd0, 0x4a, 0x88, 0x60, + 0xf7, 0xff, 0xfe, 0xc8, 0x28, 0x00, 0xda, 0x20, + 0x20, 0xf1, 0xab, 0x01, 0x70, 0x18, 0x46, 0x68, + 0x22, 0x04, 0x99, 0x02, 0xf0, 0x15, 0xf8, 0x5a, + 0x20, 0x43, 0x70, 0x38, 0x20, 0x34, 0x70, 0x78, + 0x20, 0x0c, 0x80, 0x78, 0x78, 0x60, 0x71, 0x38, + 0x88, 0x61, 0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, + 0xf7, 0xff, 0xfb, 0xca, 0x81, 0xb8, 0xf7, 0xff, + 0xff, 0x2d, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x00, + 0x9b, 0x07, 0x60, 0x18, 0xe0, 0x55, 0x20, 0x02, + 0xe0, 0x1e, 0x46, 0x68, 0x22, 0x04, 0x99, 0x02, + 0xf0, 0x15, 0xf8, 0x3c, 0x20, 0x43, 0x70, 0x38, + 0x20, 0x34, 0x70, 0x78, 0x20, 0x0c, 0x80, 0x78, + 0x9a, 0x06, 0x79, 0x50, 0x71, 0x38, 0x88, 0xe1, + 0x46, 0x6a, 0x20, 0x93, 0x68, 0xbb, 0xf7, 0xff, + 0xfb, 0xab, 0x81, 0xb8, 0xf7, 0xff, 0xff, 0x0e, + 0x28, 0x00, 0xd0, 0xe0, 0x20, 0x7d, 0x00, 0xc0, + 0xf7, 0xff, 0xfe, 0xbe, 0x81, 0x20, 0x20, 0x03, + 0x99, 0x03, 0x54, 0x70, 0x25, 0x01, 0xe0, 0x40, + 0xe0, 0x34, 0xe0, 0x37, 0x9a, 0x06, 0x79, 0x10, + 0xab, 0x01, 0x70, 0x18, 0x46, 0x68, 0x22, 0x04, + 0x99, 0x02, 0xf0, 0x15, 0xf8, 0x13, 0x20, 0x43, + 0x70, 0x38, 0x20, 0x34, 0x70, 0x78, 0x20, 0x0c, + 0x80, 0x78, 0x78, 0x60, 0x71, 0x38, 0x88, 0x61, + 0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, 0xf7, 0xff, + 0xfb, 0x83, 0x81, 0xb8, 0xf7, 0xff, 0xfe, 0xe6, + 0x28, 0x00, 0xd0, 0xb8, 0x9a, 0x06, 0x79, 0x10, + 0x28, 0x00, 0xd1, 0x13, 0x21, 0x45, 0x48, 0x14, + 0x70, 0x01, 0x21, 0x44, 0x70, 0x41, 0x27, 0x04, + 0x80, 0x47, 0x78, 0x61, 0x71, 0x81, 0x88, 0x61, + 0x80, 0x81, 0xf7, 0xff, 0xfe, 0xdd, 0x28, 0x00, + 0xd1, 0x01, 0x25, 0x00, 0xe0, 0x0d, 0x99, 0x03, + 0x54, 0x77, 0xe0, 0x0a, 0x20, 0x02, 0x99, 0x03, + 0x54, 0x70, 0xe0, 0x06, 0x28, 0x7f, 0xdc, 0x01, + 0x28, 0x45, 0xd1, 0x02, 0x20, 0x00, 0x9b, 0x07, + 0x60, 0x18, 0x1c, 0x28, 0xb0, 0x04, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0xa0, 0x2e, 0x08, 0x54, 0x80, + 0x2e, 0x08, 0x54, 0x90, 0xb5, 0xff, 0x06, 0x09, + 0x0e, 0x09, 0x22, 0x01, 0xb0, 0x83, 0x9b, 0x06, + 0x01, 0x00, 0x60, 0x1a, 0x90, 0x02, 0x4e, 0x98, + 0x19, 0x84, 0x4f, 0x98, 0x4d, 0x98, 0x29, 0x46, + 0xd0, 0x5d, 0xdc, 0x0e, 0x29, 0x33, 0xd0, 0x5b, + 0x29, 0x45, 0xd1, 0x5a, 0x89, 0xb8, 0x30, 0x04, + 0x04, 0x00, 0x0c, 0x00, 0xf0, 0x02, 0xf8, 0x96, + 0x60, 0xa8, 0x28, 0x00, 0xd1, 0x33, 0x20, 0x00, + 0xe0, 0xcf, 0x29, 0x90, 0xd0, 0x52, 0x29, 0x95, + 0xd1, 0x4b, 0x88, 0xe0, 0x28, 0x00, 0xd1, 0x6c, + 0x22, 0x05, 0x21, 0x04, 0x68, 0xb8, 0xf0, 0x02, + 0xf8, 0x8a, 0x60, 0xb8, 0x28, 0x00, 0xd0, 0xee, + 0x21, 0x00, 0xab, 0x00, 0x70, 0x99, 0x22, 0x43, + 0x70, 0x3a, 0x22, 0x34, 0x70, 0x7a, 0x21, 0x0c, + 0x80, 0x79, 0x78, 0x61, 0x71, 0x39, 0x88, 0x61, + 0x46, 0x6a, 0x1c, 0x03, 0x20, 0x96, 0xf7, 0xff, + 0xfb, 0x0f, 0x81, 0xb8, 0xf7, 0xff, 0xfe, 0x72, + 0x28, 0x00, 0xd0, 0xd8, 0x20, 0x45, 0x70, 0x28, + 0x20, 0x47, 0x70, 0x68, 0x20, 0x04, 0x80, 0x68, + 0x88, 0x60, 0x80, 0xa8, 0x21, 0x00, 0x71, 0xa9, + 0xf7, 0xff, 0xfe, 0x6e, 0xe0, 0xb0, 0x68, 0xb9, + 0x91, 0x00, 0x89, 0xb9, 0xab, 0x01, 0x80, 0x19, + 0x22, 0x43, 0x70, 0x2a, 0x22, 0x34, 0x70, 0x6a, + 0x21, 0x0c, 0x80, 0x69, 0x78, 0x61, 0x71, 0x29, + 0x88, 0x61, 0x46, 0x6a, 0x1c, 0x03, 0x20, 0x90, + 0xf7, 0xff, 0xfa, 0xea, 0x81, 0xa8, 0xf7, 0xff, + 0xfe, 0x57, 0x28, 0x00, 0xd1, 0x06, 0x68, 0xa8, + 0xf0, 0x02, 0xf8, 0x6a, 0xe7, 0xaf, 0xe0, 0x61, + 0xe0, 0x8b, 0xe0, 0xc5, 0x20, 0x00, 0x9b, 0x06, + 0x60, 0x18, 0xe0, 0x61, 0x88, 0xe0, 0x28, 0x00, + 0xd1, 0x1c, 0x9a, 0x05, 0x88, 0x90, 0xf0, 0x02, + 0xf8, 0x35, 0x60, 0xa8, 0x1c, 0x01, 0xd0, 0x9e, + 0x20, 0x45, 0x70, 0x28, 0x70, 0x68, 0x22, 0x0c, + 0x80, 0x6a, 0x88, 0x60, 0x80, 0xa8, 0x9a, 0x05, + 0x88, 0x90, 0x81, 0xa8, 0x89, 0xaa, 0x1c, 0x08, + 0x99, 0x05, 0x68, 0x09, 0xf0, 0x14, 0xff, 0x42, + 0xf7, 0xff, 0xfe, 0x2e, 0x28, 0x00, 0xd1, 0xdd, + 0xe7, 0xd5, 0xe0, 0x16, 0x99, 0x05, 0x88, 0xc9, + 0x42, 0x81, 0xd1, 0x05, 0x78, 0x60, 0x71, 0x38, + 0x68, 0xb8, 0x1c, 0x81, 0x88, 0x60, 0xe0, 0x03, + 0x79, 0x21, 0x71, 0x39, 0x68, 0xb9, 0x31, 0x02, + 0xf7, 0xff, 0xfb, 0x76, 0x22, 0x43, 0x70, 0x3a, + 0xf7, 0xff, 0xfe, 0x0c, 0x28, 0x00, 0xd0, 0xc1, + 0xe0, 0x2a, 0x22, 0x43, 0x70, 0x3a, 0x22, 0x34, + 0x70, 0x7a, 0x21, 0x0c, 0x80, 0x79, 0x9a, 0x05, + 0x88, 0x11, 0x42, 0x88, 0xd1, 0x0f, 0x78, 0x60, + 0x71, 0x38, 0x68, 0xb8, 0x1c, 0x81, 0x88, 0x60, + 0xf7, 0xff, 0xfb, 0x5e, 0x88, 0xe1, 0x79, 0x20, + 0x88, 0x62, 0x80, 0xe2, 0x78, 0x62, 0x71, 0x22, + 0x80, 0x61, 0x70, 0x60, 0xe0, 0x05, 0x79, 0x21, + 0x71, 0x39, 0x68, 0xb9, 0x31, 0x02, 0xf7, 0xff, + 0xfb, 0x4f, 0xf7, 0xff, 0xfd, 0xe7, 0x28, 0x00, + 0xd0, 0x9c, 0xe0, 0x23, 0x20, 0x04, 0xf0, 0x01, + 0xff, 0xdd, 0x60, 0xb8, 0x28, 0x00, 0xd1, 0x01, + 0x20, 0x01, 0xe0, 0x16, 0x25, 0x00, 0xab, 0x00, + 0x70, 0x9d, 0x22, 0x43, 0x70, 0x3a, 0x22, 0x34, + 0x70, 0x7a, 0x21, 0x0c, 0x80, 0x79, 0x78, 0x61, + 0x71, 0x39, 0x88, 0x61, 0x46, 0x6a, 0x1c, 0x03, + 0x20, 0x95, 0xf7, 0xff, 0xfa, 0x65, 0x81, 0xb8, + 0xf7, 0xff, 0xfd, 0xc8, 0x28, 0x00, 0xd1, 0x05, + 0x1c, 0x28, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x7d, 0x00, 0xc0, + 0xf7, 0xff, 0xfd, 0x72, 0x81, 0x20, 0x20, 0x06, + 0xe0, 0x37, 0x88, 0xe0, 0x28, 0x00, 0xd0, 0x03, + 0x79, 0x20, 0x78, 0x61, 0x42, 0x88, 0xd1, 0x01, + 0x20, 0x02, 0xe0, 0x2e, 0x20, 0x04, 0xf0, 0x01, + 0xff, 0xa9, 0x60, 0xb8, 0x28, 0x00, 0xd0, 0xcb, + 0x21, 0x00, 0xab, 0x00, 0x70, 0x99, 0x79, 0x21, + 0x9a, 0x05, 0x78, 0x12, 0x42, 0x91, 0xd1, 0x02, + 0x78, 0x61, 0x88, 0x63, 0xe0, 0x00, 0x88, 0xe3, + 0x22, 0x43, 0x70, 0x3a, 0x22, 0x34, 0x70, 0x7a, + 0x22, 0x0c, 0x80, 0x7a, 0x71, 0x39, 0x46, 0x6a, + 0x1c, 0x05, 0x20, 0x95, 0x1c, 0x19, 0x1c, 0x2b, + 0xf7, 0xff, 0xfa, 0x2a, 0x81, 0xb8, 0xf7, 0xff, + 0xfd, 0x8d, 0x28, 0x00, 0xd1, 0x03, 0x21, 0x00, + 0x9b, 0x06, 0x60, 0x18, 0xe6, 0xef, 0x20, 0x7d, + 0x00, 0xc0, 0xf7, 0xff, 0xfd, 0x39, 0x81, 0x20, + 0x20, 0x08, 0x99, 0x02, 0x54, 0x70, 0xe7, 0x9f, + 0x29, 0x7f, 0xdd, 0x9d, 0xe7, 0x36, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0xa0, 0x2e, 0x08, 0x54, 0x80, + 0x2e, 0x08, 0x54, 0x90, 0xb5, 0xff, 0x06, 0x09, + 0x0e, 0x09, 0x22, 0x01, 0xb0, 0x83, 0x9b, 0x06, + 0x01, 0x05, 0x60, 0x1a, 0x4e, 0x4f, 0x19, 0xac, + 0x1d, 0xe2, 0x32, 0x03, 0x92, 0x02, 0x4f, 0x4e, + 0x29, 0x33, 0xd0, 0x61, 0x29, 0x70, 0xd0, 0x37, + 0x29, 0x94, 0xd1, 0x5e, 0xf7, 0xff, 0xfd, 0x3a, + 0x88, 0xe0, 0x99, 0x05, 0x88, 0xc9, 0x42, 0x88, + 0xd1, 0x06, 0x22, 0x04, 0x98, 0x02, 0x99, 0x05, + 0xf0, 0x14, 0xff, 0x2c, 0x28, 0x00, 0xd0, 0x01, + 0x20, 0x00, 0xe0, 0x2c, 0x99, 0x05, 0x79, 0x08, + 0xab, 0x01, 0x70, 0x18, 0x46, 0x68, 0x22, 0x04, + 0x99, 0x02, 0xf0, 0x14, 0xfe, 0x63, 0x20, 0x43, + 0x70, 0x38, 0x20, 0x34, 0x70, 0x78, 0x20, 0x0c, + 0x80, 0x78, 0x78, 0x60, 0x71, 0x38, 0x88, 0x61, + 0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, 0xf7, 0xff, + 0xf9, 0xd3, 0x81, 0xb8, 0xf7, 0xff, 0xfd, 0x36, + 0x28, 0x00, 0xd1, 0x03, 0x20, 0x00, 0x9b, 0x06, + 0x60, 0x18, 0xe7, 0xdd, 0x99, 0x05, 0x79, 0x08, + 0x28, 0x00, 0xd1, 0x53, 0x20, 0x04, 0xe0, 0x52, + 0x20, 0x09, 0xf0, 0x01, 0xff, 0x23, 0x60, 0xb8, + 0x28, 0x00, 0xd1, 0x05, 0x20, 0x01, 0xb0, 0x03, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0xf1, 0xab, 0x01, 0x70, 0x18, 0x46, 0x68, + 0x22, 0x04, 0x99, 0x02, 0xf0, 0x14, 0xfe, 0x32, + 0x20, 0x43, 0x70, 0x38, 0x20, 0x34, 0x70, 0x78, + 0x20, 0x0c, 0x80, 0x78, 0x78, 0x60, 0x71, 0x38, + 0x88, 0x61, 0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, + 0xf7, 0xff, 0xf9, 0xa2, 0x81, 0xb8, 0xf7, 0xff, + 0xfd, 0x05, 0x28, 0x00, 0xd0, 0xb0, 0xe0, 0x29, + 0xe0, 0x00, 0xe0, 0x2a, 0x78, 0x60, 0x99, 0x05, + 0x78, 0x09, 0x42, 0x88, 0xd1, 0x01, 0x20, 0x07, + 0xe0, 0x21, 0x20, 0x09, 0xf0, 0x01, 0xfe, 0xf2, + 0x60, 0xb8, 0x28, 0x00, 0xd0, 0xa0, 0x20, 0xf1, + 0xab, 0x01, 0x70, 0x18, 0x46, 0x68, 0x22, 0x04, + 0x99, 0x02, 0xf0, 0x14, 0xfe, 0x07, 0x20, 0x43, + 0x70, 0x38, 0x20, 0x34, 0x70, 0x78, 0x20, 0x0c, + 0x80, 0x78, 0x78, 0x60, 0x71, 0x38, 0x88, 0x61, + 0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, 0xf7, 0xff, + 0xf9, 0x77, 0x81, 0xb8, 0xf7, 0xff, 0xfc, 0xda, + 0x28, 0x00, 0xd0, 0xa3, 0x20, 0x02, 0x55, 0x70, + 0xe7, 0xb0, 0x29, 0x7f, 0xdc, 0x01, 0x29, 0x45, + 0xd1, 0xac, 0x20, 0x00, 0x9b, 0x06, 0x60, 0x18, + 0xe7, 0xa8, 0x00, 0x00, 0x2e, 0x08, 0x54, 0xa0, + 0x2e, 0x08, 0x54, 0x80, 0xb5, 0xf0, 0x06, 0x09, + 0x0e, 0x09, 0x1c, 0x04, 0x20, 0x01, 0x60, 0x18, + 0x1c, 0x17, 0xb0, 0x82, 0x29, 0x70, 0xd0, 0x28, + 0x29, 0x94, 0xd1, 0x2c, 0x1c, 0x20, 0xf7, 0xff, + 0xfc, 0x95, 0x79, 0x38, 0x28, 0x00, 0xd1, 0x2d, + 0x20, 0x43, 0x4f, 0x19, 0x70, 0x38, 0x20, 0x34, + 0x70, 0x78, 0x20, 0x0c, 0x80, 0x78, 0x01, 0x25, + 0x4e, 0x16, 0x19, 0xac, 0x79, 0x20, 0x71, 0x38, + 0x88, 0xe1, 0x46, 0x6a, 0x20, 0x95, 0x68, 0xbb, + 0xf7, 0xff, 0xf9, 0x3e, 0x81, 0xb8, 0xf7, 0xff, + 0xfc, 0xa1, 0x28, 0x00, 0xd1, 0x01, 0x25, 0x00, + 0xe0, 0x14, 0x20, 0x7d, 0x00, 0xc0, 0xf7, 0xff, + 0xfc, 0x4f, 0x81, 0x20, 0x20, 0x08, 0x55, 0x70, + 0xe0, 0x0b, 0x1c, 0x20, 0x1c, 0x3a, 0xf7, 0xff, + 0xff, 0x1d, 0x1c, 0x05, 0xe0, 0x06, 0x29, 0x7f, + 0xdc, 0x01, 0x29, 0x45, 0xd1, 0x01, 0x20, 0x00, + 0x60, 0x18, 0x25, 0x01, 0x1c, 0x28, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x22, 0x01, + 0x26, 0x02, 0x01, 0x05, 0x60, 0x1a, 0x1c, 0x1f, + 0x4c, 0x0c, 0x29, 0x33, 0xd0, 0x08, 0x29, 0x70, + 0xd0, 0x08, 0x29, 0x96, 0xd1, 0x08, 0xf7, 0xff, + 0xfc, 0x49, 0x20, 0x00, 0x60, 0x38, 0xe0, 0x01, + 0xf7, 0xff, 0xfc, 0x44, 0x55, 0x66, 0xe0, 0x05, + 0x29, 0x7f, 0xdc, 0x01, 0x29, 0x45, 0xd1, 0x01, + 0x20, 0x00, 0x60, 0x38, 0x20, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0xb0, 0x81, + 0x91, 0x00, 0x21, 0x01, 0xb0, 0x83, 0x9b, 0x07, + 0x60, 0x19, 0x91, 0x02, 0x01, 0x05, 0x99, 0x03, + 0x4e, 0x52, 0x19, 0xac, 0x4f, 0x52, 0x29, 0x33, + 0xd0, 0x4f, 0x29, 0x70, 0xd0, 0x06, 0x29, 0x96, + 0xd1, 0x5d, 0xf7, 0xff, 0xfc, 0x1f, 0x20, 0x00, + 0x9b, 0x07, 0x60, 0x18, 0x88, 0xe0, 0x28, 0x00, + 0xd1, 0x0f, 0x20, 0x45, 0x70, 0x38, 0x20, 0x47, + 0x70, 0x78, 0x20, 0x04, 0x80, 0x78, 0x88, 0x60, + 0x80, 0xb8, 0x20, 0x00, 0x71, 0xb8, 0xf7, 0xff, + 0xfc, 0x31, 0x28, 0x00, 0xd0, 0x75, 0x20, 0x02, + 0xe0, 0x51, 0x20, 0x05, 0xf0, 0x01, 0xfe, 0x26, + 0x4f, 0x42, 0x60, 0xb8, 0x28, 0x00, 0xd1, 0x01, + 0x20, 0x01, 0xe0, 0x76, 0x21, 0x43, 0x70, 0x39, + 0x21, 0x34, 0x70, 0x79, 0x21, 0x0c, 0x80, 0x79, + 0x99, 0x03, 0x29, 0x70, 0xd1, 0x03, 0x21, 0x00, + 0xab, 0x00, 0x70, 0x99, 0xe0, 0x08, 0x9a, 0x06, + 0x78, 0x91, 0xab, 0x00, 0x70, 0x99, 0x88, 0xe1, + 0x9a, 0x06, 0x88, 0x12, 0x42, 0x91, 0xd1, 0x04, + 0x78, 0x61, 0x71, 0x39, 0x88, 0x61, 0x1c, 0x03, + 0xe0, 0x02, 0x79, 0x22, 0x71, 0x3a, 0x1c, 0x03, + 0x46, 0x6a, 0x20, 0x96, 0xf7, 0xff, 0xf8, 0x9c, + 0x81, 0xb8, 0xf7, 0xff, 0xfc, 0x09, 0x28, 0x00, + 0xd1, 0xcd, 0x68, 0xb8, 0xf0, 0x01, 0xfe, 0x1c, + 0xe7, 0xd2, 0x88, 0xe0, 0x28, 0x00, 0xd1, 0x0f, + 0x20, 0x45, 0x70, 0x38, 0x20, 0x47, 0x70, 0x78, + 0x20, 0x04, 0x80, 0x78, 0x88, 0x60, 0x80, 0xb8, + 0x20, 0x00, 0x71, 0xb8, 0xf7, 0xff, 0xfb, 0xea, + 0x28, 0x00, 0xd1, 0xb8, 0xe0, 0x38, 0xe0, 0x2e, + 0x78, 0x60, 0x79, 0x21, 0x42, 0x88, 0xd1, 0x02, + 0x20, 0x02, 0x55, 0x70, 0xe7, 0xb8, 0x79, 0x39, + 0x42, 0x81, 0xd1, 0x02, 0x20, 0x08, 0x55, 0x70, + 0xe0, 0x2a, 0x20, 0x05, 0xf0, 0x01, 0xfd, 0xd2, + 0x60, 0xb8, 0x28, 0x00, 0xd0, 0xac, 0x21, 0x00, + 0xab, 0x00, 0x70, 0x99, 0x21, 0x43, 0x70, 0x39, + 0x21, 0x34, 0x70, 0x79, 0x21, 0x0c, 0x80, 0x79, + 0x78, 0x61, 0x71, 0x39, 0x88, 0x61, 0x46, 0x6a, + 0x1c, 0x03, 0x20, 0x96, 0xf7, 0xff, 0xf8, 0x5c, + 0x81, 0xb8, 0xf7, 0xff, 0xfb, 0xbf, 0x28, 0x00, + 0xd1, 0x8d, 0x68, 0xb8, 0xf0, 0x01, 0xfd, 0xdc, + 0xe0, 0x00, 0xe0, 0x09, 0xe7, 0x87, 0x99, 0x03, + 0x29, 0x7f, 0xdc, 0x02, 0x99, 0x03, 0x29, 0x45, + 0xd1, 0x02, 0x20, 0x00, 0x9b, 0x07, 0x60, 0x18, + 0x98, 0x02, 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0xa0, + 0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0x90, + 0xb5, 0x00, 0x06, 0x01, 0x0e, 0x09, 0x22, 0x45, + 0x48, 0x07, 0x70, 0x02, 0x22, 0x41, 0x70, 0x42, + 0x22, 0x04, 0x80, 0x42, 0x71, 0x01, 0xf7, 0xff, + 0xfb, 0x95, 0x28, 0x00, 0xd1, 0x01, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x80, 0xb5, 0x00, 0x06, 0x01, + 0x0e, 0x09, 0x22, 0x45, 0x48, 0x07, 0x70, 0x02, + 0x22, 0x49, 0x70, 0x42, 0x22, 0x04, 0x80, 0x42, + 0x71, 0x01, 0xf7, 0xff, 0xfb, 0x7f, 0x28, 0x00, + 0xd1, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, + 0xb5, 0x00, 0x06, 0x01, 0x0e, 0x09, 0x22, 0x43, + 0x48, 0x07, 0x70, 0x02, 0x22, 0x32, 0x70, 0x42, + 0x22, 0x04, 0x80, 0x42, 0x71, 0x01, 0xf7, 0xff, + 0xfb, 0x69, 0x28, 0x00, 0xd1, 0x01, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x80, 0xb5, 0x80, 0x79, 0x41, + 0xb0, 0x82, 0xab, 0x01, 0x70, 0x19, 0x1c, 0x41, + 0x46, 0x68, 0x22, 0x04, 0xf0, 0x14, 0xfc, 0x72, + 0x20, 0x43, 0x4f, 0x0b, 0x70, 0x38, 0x20, 0x34, + 0x70, 0x78, 0x20, 0x0c, 0x80, 0x78, 0x46, 0x6a, + 0x21, 0x00, 0x20, 0x92, 0x68, 0xbb, 0xf7, 0xfe, + 0xff, 0xe3, 0x81, 0xb8, 0xf7, 0xff, 0xfb, 0x46, + 0x28, 0x00, 0xd1, 0x00, 0xe0, 0x00, 0x20, 0x01, + 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x80, 0xb5, 0xf0, 0x00, 0xc6, + 0x18, 0x36, 0x01, 0x36, 0x1c, 0x07, 0xb0, 0x84, + 0x48, 0x0d, 0x90, 0x03, 0x18, 0x34, 0x68, 0xa0, + 0x28, 0x00, 0xd0, 0x0b, 0x46, 0x69, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x48, 0x1c, 0x05, 0x28, 0x34, + 0xd1, 0x02, 0x98, 0x01, 0xf0, 0x01, 0xfd, 0x48, + 0x2d, 0x00, 0xd1, 0xf3, 0x20, 0x00, 0x99, 0x03, + 0x51, 0x88, 0x60, 0x60, 0x60, 0xa0, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x57, 0xc0, 0xb4, 0xb0, 0x06, 0x0f, + 0x0e, 0x3f, 0x00, 0xc3, 0x18, 0x18, 0x01, 0x00, + 0x49, 0x15, 0x18, 0x41, 0x20, 0x00, 0x68, 0x8b, + 0x2b, 0x0a, 0xda, 0x23, 0x33, 0x01, 0x60, 0x8b, + 0x68, 0x4d, 0x19, 0x4c, 0x34, 0x80, 0x71, 0x27, + 0x2f, 0x34, 0xd1, 0x14, 0x78, 0x14, 0x68, 0x4d, + 0x00, 0x6b, 0x19, 0x5b, 0x00, 0x9b, 0x18, 0xcb, + 0x73, 0x1c, 0x68, 0x54, 0x68, 0x4d, 0x00, 0x6b, + 0x19, 0x5b, 0x00, 0x9b, 0x18, 0xcb, 0x61, 0x1c, + 0x89, 0x17, 0x68, 0x4c, 0x00, 0x63, 0x19, 0x1b, + 0x00, 0x9b, 0x18, 0xca, 0x82, 0x97, 0x68, 0x4a, + 0x32, 0x01, 0x60, 0x4a, 0x2a, 0x0a, 0xdb, 0x00, + 0x60, 0x48, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, + 0x2e, 0x08, 0x57, 0xc0, 0xb4, 0xf0, 0x00, 0xc7, + 0x18, 0x3f, 0x01, 0x3f, 0x4a, 0x16, 0x18, 0xbc, + 0x25, 0x00, 0x68, 0xa0, 0x28, 0x00, 0xdc, 0x02, + 0x1c, 0x28, 0xbc, 0xf0, 0x47, 0x70, 0x38, 0x01, + 0x60, 0xa0, 0x59, 0xd3, 0x18, 0xe0, 0x30, 0x80, + 0x79, 0x00, 0x28, 0x34, 0xd1, 0x14, 0x1c, 0x1e, + 0x00, 0x5b, 0x19, 0x9b, 0x00, 0x9b, 0x18, 0xe3, + 0x7b, 0x1b, 0x70, 0x0b, 0x59, 0xd6, 0x00, 0x73, + 0x19, 0x9b, 0x00, 0x9b, 0x18, 0xe3, 0x69, 0x1b, + 0x60, 0x4b, 0x59, 0xd6, 0x00, 0x73, 0x19, 0x9b, + 0x00, 0x9b, 0x18, 0xe3, 0x8a, 0x9b, 0x81, 0x0b, + 0x59, 0xd1, 0x31, 0x01, 0x51, 0xd1, 0x29, 0x0a, + 0xdb, 0xdb, 0x51, 0xd5, 0xbc, 0xf0, 0x47, 0x70, + 0x2e, 0x08, 0x57, 0xc0, 0xb5, 0x00, 0x78, 0x01, + 0x48, 0x0c, 0x70, 0x01, 0x78, 0x01, 0x29, 0x01, + 0xd0, 0x01, 0x29, 0x02, 0xd1, 0x0e, 0x48, 0x0a, + 0x29, 0x01, 0xd1, 0x04, 0xca, 0x0a, 0xc0, 0x0a, + 0xca, 0x0a, 0xc0, 0x0a, 0xe0, 0x01, 0x88, 0x11, + 0x80, 0x01, 0xf0, 0x00, 0xf8, 0x32, 0x20, 0x00, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x88, + 0x2e, 0x08, 0x56, 0xc0, 0xb5, 0x90, 0x27, 0x00, + 0x48, 0x0d, 0x70, 0x07, 0x80, 0x87, 0x20, 0x03, + 0xf0, 0x01, 0xfc, 0xc0, 0x28, 0x00, 0xda, 0x03, + 0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x00, 0x20, 0x01, 0x27, 0xff, 0x4a, 0x07, + 0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x18, 0x9c, + 0x70, 0xa0, 0x52, 0xd7, 0x31, 0x01, 0x29, 0x08, + 0xdb, 0xf6, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x88, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0x00, 0xf0, 0x01, 0xfb, 0x5f, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0xb0, 0x27, 0x00, 0x48, 0x1f, + 0x78, 0x00, 0x4c, 0x1f, 0x28, 0x01, 0xd1, 0x1c, + 0x78, 0x60, 0x28, 0x23, 0xd0, 0x0f, 0xdc, 0x06, + 0x28, 0x21, 0xd0, 0x10, 0x28, 0x22, 0xd1, 0x28, + 0xf0, 0x00, 0xf8, 0x62, 0xe0, 0x24, 0x28, 0x32, + 0xd0, 0x0c, 0x28, 0x34, 0xd1, 0x21, 0x68, 0xa5, + 0xf0, 0x00, 0xf8, 0xea, 0xe0, 0x1c, 0x68, 0xa5, + 0xf0, 0x00, 0xf8, 0x88, 0xe0, 0x18, 0xf0, 0x00, + 0xf8, 0x25, 0xe0, 0x15, 0xf0, 0x00, 0xf8, 0xf8, + 0xe0, 0x12, 0x28, 0x02, 0xd1, 0x11, 0x88, 0x20, + 0xf0, 0x01, 0xfc, 0x28, 0x88, 0x20, 0x28, 0x50, + 0xdd, 0x04, 0x28, 0x58, 0xdc, 0x02, 0xf0, 0x00, + 0xf9, 0x03, 0xe0, 0x05, 0x28, 0x60, 0xdd, 0x04, + 0x28, 0x68, 0xdc, 0x02, 0xf0, 0x00, 0xf9, 0x22, + 0x1c, 0x07, 0x2f, 0x00, 0xd1, 0x02, 0x1c, 0x28, + 0xf0, 0x01, 0xfc, 0x4e, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x88, + 0x2e, 0x08, 0x56, 0xc0, 0xb5, 0x90, 0x20, 0x01, + 0xb0, 0x81, 0x90, 0x00, 0xf0, 0x00, 0xf9, 0x2c, + 0x1c, 0x04, 0xd5, 0x01, 0x20, 0x01, 0xe0, 0x1a, + 0x4f, 0x0f, 0x88, 0xb8, 0x00, 0xe1, 0x1b, 0x09, + 0x00, 0x89, 0x4a, 0x0e, 0x52, 0x50, 0x78, 0x79, + 0x46, 0x6b, 0x22, 0x00, 0x1c, 0x20, 0xf0, 0x00, + 0xfb, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x20, + 0xf0, 0x00, 0xf9, 0x60, 0x20, 0x35, 0x70, 0x38, + 0x20, 0x4a, 0x70, 0x78, 0x20, 0x04, 0x80, 0x78, + 0xf0, 0x00, 0xf9, 0xee, 0x98, 0x00, 0xb0, 0x01, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0xf0, 0x20, 0x01, 0xb0, 0x81, 0x90, 0x00, + 0x4c, 0x14, 0x88, 0xa6, 0x27, 0x00, 0x4d, 0x14, + 0x00, 0xf8, 0x1b, 0xc0, 0x00, 0x80, 0x19, 0x41, + 0x78, 0x89, 0x29, 0x01, 0xd0, 0x0d, 0x5a, 0x28, + 0x42, 0xb0, 0xd1, 0x0a, 0x78, 0x61, 0x46, 0x6b, + 0x22, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0xd6, + 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38, 0xf0, 0x00, + 0xf9, 0x31, 0x37, 0x01, 0x2f, 0x08, 0xdb, 0xe7, + 0x20, 0x35, 0x70, 0x20, 0x20, 0x4b, 0x70, 0x60, + 0x20, 0x04, 0x80, 0x60, 0xf0, 0x00, 0xf9, 0xbc, + 0x98, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x56, 0xc0, + 0x2e, 0x08, 0x56, 0xe0, 0xb5, 0xf0, 0x20, 0x00, + 0xb0, 0x87, 0x90, 0x00, 0x48, 0x2a, 0x89, 0x87, + 0x68, 0x85, 0x79, 0x80, 0x90, 0x05, 0x24, 0x00, + 0xaa, 0x03, 0xb4, 0x04, 0x04, 0x39, 0x0c, 0x09, + 0x9a, 0x06, 0x1c, 0x28, 0xab, 0x07, 0xf0, 0x00, + 0xfa, 0x21, 0xb0, 0x01, 0x90, 0x01, 0x28, 0x00, + 0xdb, 0x04, 0x98, 0x05, 0xf0, 0x00, 0xf9, 0x2c, + 0x1c, 0x06, 0xd5, 0x01, 0x20, 0x00, 0xe0, 0x36, + 0x98, 0x00, 0x30, 0x01, 0x90, 0x00, 0x98, 0x01, + 0x18, 0x2d, 0x1a, 0x3f, 0x2f, 0x00, 0xdd, 0x0b, + 0x04, 0x38, 0x0c, 0x00, 0xf0, 0x01, 0xfb, 0x96, + 0x1c, 0x04, 0xd0, 0xef, 0x1c, 0x20, 0x1c, 0x29, + 0x1c, 0x3a, 0xf0, 0x14, 0xfa, 0xaf, 0x1c, 0x25, + 0xa9, 0x06, 0x78, 0x09, 0x1c, 0x30, 0xaa, 0x03, + 0xab, 0x02, 0xf0, 0x00, 0xfa, 0x83, 0x28, 0x00, + 0xd0, 0xe0, 0x98, 0x00, 0x28, 0x02, 0xda, 0x01, + 0x2f, 0x00, 0xdc, 0xc9, 0x2c, 0x00, 0xd0, 0x02, + 0x1c, 0x20, 0xf0, 0x01, 0xfb, 0xa1, 0x2f, 0x00, + 0xd0, 0x01, 0x20, 0x00, 0x90, 0x02, 0x00, 0xf0, + 0x1b, 0x80, 0x00, 0x80, 0x49, 0x07, 0x18, 0x40, + 0x78, 0x80, 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x30, + 0xf0, 0x00, 0xf8, 0xc8, 0x98, 0x02, 0xb0, 0x07, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0x80, 0xb0, 0x81, 0x4f, 0x09, 0x79, 0x38, + 0xf0, 0x00, 0xf8, 0xe2, 0x28, 0x00, 0xdb, 0x06, + 0x78, 0x79, 0x46, 0x6b, 0x22, 0x00, 0xf0, 0x00, + 0xfa, 0x51, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x00, + 0x90, 0x00, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xc0, + 0xb5, 0x80, 0xb0, 0x81, 0x4f, 0x09, 0x79, 0x38, + 0xf0, 0x00, 0xf8, 0xca, 0x28, 0x00, 0xdb, 0x06, + 0x78, 0x79, 0x46, 0x6b, 0x22, 0x00, 0xf0, 0x00, + 0xfa, 0x39, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x00, + 0x90, 0x00, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xc0, + 0xb5, 0x90, 0xb0, 0x81, 0x48, 0x0f, 0x88, 0x00, + 0xf0, 0x00, 0xf8, 0xca, 0x1c, 0x07, 0xd5, 0x01, + 0x20, 0x01, 0xe0, 0x13, 0x20, 0x00, 0x00, 0xf9, + 0x1b, 0xc9, 0x00, 0x89, 0x4a, 0x0a, 0x18, 0x8c, + 0x80, 0xa0, 0x21, 0x50, 0x46, 0x6b, 0x22, 0x00, + 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0x17, 0x78, 0xa0, + 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x71, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xc0, + 0x2e, 0x08, 0x56, 0xe0, 0xb5, 0x00, 0xb0, 0x81, + 0x48, 0x0b, 0x88, 0x00, 0xf0, 0x00, 0xf8, 0xbc, + 0x28, 0x00, 0xda, 0x01, 0x20, 0x01, 0xe0, 0x0c, + 0x21, 0x00, 0x00, 0xc2, 0x1a, 0x12, 0x00, 0x92, + 0x4b, 0x06, 0x18, 0xd2, 0x80, 0xd1, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x60, 0xf0, 0x00, 0xf9, 0xf2, + 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0xf0, 0x4c, 0x22, 0x23, 0x04, 0x5e, 0xe1, + 0x1f, 0x58, 0x29, 0x08, 0xda, 0x35, 0x27, 0x00, + 0x4d, 0x1f, 0x00, 0xf9, 0x1b, 0xc9, 0x00, 0x89, + 0x19, 0x49, 0x78, 0x89, 0x29, 0x01, 0xd1, 0x2f, + 0x22, 0x00, 0x00, 0xd3, 0x1a, 0x9b, 0x00, 0x9b, + 0x19, 0x5b, 0x78, 0x9e, 0x2e, 0x01, 0xd0, 0x02, + 0x78, 0xdb, 0x42, 0x8b, 0xd0, 0x02, 0x32, 0x01, + 0x2a, 0x08, 0xdb, 0xf2, 0x2a, 0x08, 0xda, 0x04, + 0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x09, + 0xdb, 0xea, 0x29, 0x09, 0xd0, 0x15, 0x00, 0xf8, + 0x1b, 0xc0, 0x00, 0x80, 0x19, 0x40, 0x70, 0xc1, + 0x21, 0x02, 0x70, 0x81, 0x21, 0x00, 0x80, 0x81, + 0x80, 0xc1, 0x82, 0x01, 0x60, 0xc1, 0x83, 0x01, + 0x61, 0x41, 0x76, 0x81, 0x1c, 0x38, 0xf7, 0xff, + 0xfd, 0x7d, 0x88, 0xa0, 0x30, 0x01, 0x80, 0xa0, + 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x37, 0x01, 0x2f, 0x08, 0xdb, 0xc5, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x88, + 0x2e, 0x08, 0x56, 0xe0, 0xb5, 0x90, 0x1c, 0x07, + 0xd5, 0x06, 0x2f, 0x08, 0xdb, 0x04, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x65, 0x00, 0xf8, + 0x1b, 0xc0, 0x00, 0x80, 0x49, 0x0a, 0x18, 0x44, + 0x88, 0xe0, 0x28, 0x00, 0xd0, 0x03, 0xf0, 0x01, + 0xfa, 0x79, 0x20, 0x00, 0x80, 0xe0, 0x1c, 0x38, + 0xf7, 0xff, 0xfd, 0x50, 0x20, 0x01, 0x70, 0xa0, + 0x48, 0x04, 0x88, 0x81, 0x39, 0x01, 0x80, 0x81, + 0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x1a, 0x88, + 0xb4, 0x80, 0x06, 0x02, 0x0e, 0x12, 0x20, 0x00, + 0x49, 0x08, 0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, + 0x18, 0x5b, 0x78, 0x9f, 0x2f, 0x01, 0xd0, 0x02, + 0x78, 0xdb, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, + 0x28, 0x08, 0xdb, 0xf2, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x56, 0xe0, + 0xb4, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, + 0x49, 0x08, 0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, + 0x18, 0x5b, 0x78, 0x9f, 0x2f, 0x01, 0xd0, 0x02, + 0x88, 0x9b, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, + 0x28, 0x08, 0xdb, 0xf2, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x56, 0xe0, + 0xb4, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, + 0x49, 0x08, 0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, + 0x18, 0x5b, 0x78, 0x9f, 0x2f, 0x01, 0xd0, 0x02, + 0x88, 0xdb, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, + 0x28, 0x08, 0xdb, 0xf2, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0x80, 0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, + 0x49, 0x05, 0x18, 0x47, 0x88, 0xb8, 0x28, 0x00, + 0xd0, 0x03, 0xf0, 0x01, 0xfa, 0x13, 0x20, 0x00, + 0x80, 0xb8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xe0, 0xb5, 0x80, 0x00, 0xc3, + 0x1a, 0x18, 0x00, 0x80, 0x49, 0x05, 0x18, 0x47, + 0x88, 0xf8, 0x28, 0x00, 0xd0, 0x03, 0xf0, 0x01, + 0xfa, 0x01, 0x20, 0x00, 0x80, 0xf8, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0x00, 0x49, 0x03, 0x78, 0x08, 0xf0, 0x01, + 0xf9, 0x53, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x56, 0xc0, 0xb5, 0x00, 0x49, 0x03, + 0x78, 0x08, 0xf0, 0x01, 0xf9, 0x49, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x56, 0xd0, + 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, 0x49, 0x0a, + 0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, 0x18, 0x5b, + 0x78, 0xdb, 0x42, 0x93, 0xd1, 0x06, 0x00, 0xc3, + 0x1a, 0x18, 0x00, 0x80, 0x5a, 0x08, 0x06, 0x00, + 0x0e, 0x00, 0x47, 0x70, 0x30, 0x01, 0x28, 0x08, + 0xdb, 0xee, 0x20, 0xff, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x56, 0xe0, 0xb5, 0xf0, 0x06, 0x05, + 0x0e, 0x2d, 0x06, 0x0c, 0x0e, 0x24, 0x1c, 0x17, + 0x1c, 0x59, 0x1c, 0x1a, 0x1c, 0x4e, 0xb0, 0x81, + 0x2d, 0x86, 0xd0, 0x3b, 0xdc, 0x0b, 0x1f, 0xef, + 0x3f, 0x79, 0x2f, 0x06, 0xd2, 0x3c, 0xa3, 0x02, + 0x5d, 0xdb, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x3a, 0x32, 0x32, 0x32, 0x32, 0x32, 0x2d, 0xa0, + 0xd0, 0x15, 0xdc, 0x0d, 0x20, 0x02, 0x18, 0x1b, + 0x33, 0x01, 0x2d, 0x87, 0xd0, 0x01, 0x2d, 0x88, + 0xd1, 0x2a, 0x70, 0x15, 0x70, 0x08, 0x70, 0x34, + 0x78, 0x38, 0x70, 0x18, 0x20, 0x04, 0xe0, 0x25, + 0x2d, 0xa1, 0xd0, 0x04, 0x2d, 0xa2, 0xd1, 0x1f, + 0x20, 0xa0, 0x70, 0x10, 0xe0, 0x17, 0x70, 0x15, + 0x1c, 0x0d, 0x88, 0xb9, 0x46, 0x6a, 0x1c, 0x28, + 0xf0, 0x00, 0xf8, 0x5d, 0xa8, 0x00, 0x88, 0x00, + 0x18, 0x28, 0x70, 0x04, 0x88, 0xb9, 0x1e, 0x4a, + 0x68, 0x39, 0x30, 0x01, 0xf0, 0x14, 0xf8, 0xbe, + 0x88, 0xb8, 0xa9, 0x00, 0x88, 0x09, 0x18, 0x40, + 0x30, 0x01, 0xe0, 0x07, 0x70, 0x15, 0x20, 0x01, + 0x70, 0x08, 0x70, 0x34, 0x20, 0x03, 0xe0, 0x01, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x06, 0x16, + 0x0e, 0x36, 0x9d, 0x05, 0x1c, 0x04, 0x78, 0x00, + 0x70, 0x18, 0xb0, 0x82, 0x46, 0x6a, 0x34, 0x01, + 0x1c, 0x20, 0xa9, 0x01, 0x1c, 0x1f, 0xf0, 0x00, + 0xf8, 0x57, 0x21, 0x00, 0x43, 0xc9, 0x28, 0x00, + 0xdb, 0x06, 0xa8, 0x00, 0x88, 0x00, 0x18, 0x20, + 0x78, 0x02, 0x30, 0x01, 0x42, 0xb2, 0xd0, 0x01, + 0x1c, 0x08, 0xe0, 0x20, 0x78, 0x3a, 0x2a, 0x85, + 0xd0, 0x17, 0xdc, 0x06, 0x2a, 0x80, 0xd0, 0x10, + 0x2a, 0x83, 0xd0, 0x12, 0x2a, 0x84, 0xd1, 0xf3, + 0xe0, 0x0f, 0x2a, 0x86, 0xd0, 0x0d, 0x2a, 0xa0, + 0xd0, 0x01, 0x2a, 0xa1, 0xd1, 0xec, 0x60, 0x28, + 0xa8, 0x01, 0x88, 0x00, 0x38, 0x01, 0x80, 0xa8, + 0xe0, 0x03, 0x78, 0x00, 0x23, 0x80, 0x40, 0x18, + 0x70, 0x28, 0xa8, 0x01, 0x88, 0x00, 0xa9, 0x00, + 0x88, 0x09, 0x18, 0x40, 0x30, 0x01, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x04, 0x09, + 0x0c, 0x09, 0xb0, 0x81, 0xab, 0x00, 0x80, 0x19, + 0x29, 0x7f, 0xdc, 0x05, 0xa9, 0x00, 0x88, 0x09, + 0x70, 0x01, 0x20, 0x01, 0x80, 0x10, 0xe0, 0x15, + 0xa9, 0x00, 0x88, 0x09, 0x29, 0xff, 0xdc, 0x07, + 0x21, 0x81, 0x70, 0x01, 0x21, 0x02, 0x80, 0x11, + 0xa9, 0x00, 0x88, 0x09, 0x70, 0x41, 0xe0, 0x09, + 0x21, 0x82, 0x70, 0x01, 0x21, 0x03, 0x80, 0x11, + 0xa9, 0x00, 0x78, 0x49, 0x70, 0x41, 0xa9, 0x00, + 0x78, 0x09, 0x70, 0x81, 0xb0, 0x01, 0x47, 0x70, + 0xb4, 0x90, 0x27, 0x01, 0x78, 0x04, 0x23, 0x80, + 0x40, 0x23, 0x2b, 0x80, 0xd1, 0x14, 0x06, 0x63, + 0x0e, 0x5b, 0x80, 0x13, 0x88, 0x13, 0x2b, 0x01, + 0xd1, 0x01, 0x78, 0x40, 0xe0, 0x05, 0x2b, 0x02, + 0xd1, 0x07, 0x78, 0x43, 0x02, 0x1b, 0x78, 0x80, + 0x18, 0x18, 0x80, 0x08, 0x88, 0x10, 0x30, 0x01, + 0xe0, 0x04, 0x27, 0x00, 0x43, 0xff, 0xe0, 0x02, + 0x80, 0x0c, 0x20, 0x01, 0x80, 0x10, 0x1c, 0x38, + 0xbc, 0x90, 0x47, 0x70, 0xb5, 0xf0, 0x1c, 0x07, + 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x18, 0x00, 0xfb, + 0x1b, 0xdb, 0x00, 0x9b, 0xb0, 0x82, 0x4c, 0x42, + 0x19, 0x1e, 0x78, 0xb3, 0x1e, 0x9c, 0x4b, 0x41, + 0x93, 0x01, 0x1d, 0x1d, 0x2c, 0x07, 0xd2, 0x63, + 0xa3, 0x01, 0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, + 0x60, 0x65, 0x03, 0x08, 0x40, 0x24, 0x6b, 0x00, + 0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x80, + 0xe0, 0x66, 0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, + 0xfa, 0x83, 0x1c, 0x04, 0x28, 0x01, 0xd1, 0x5a, + 0x78, 0xb0, 0x28, 0x04, 0xd1, 0x57, 0x1c, 0x38, + 0x1c, 0x29, 0xf7, 0xff, 0xfb, 0xf7, 0x1c, 0x01, + 0xd0, 0x59, 0x9b, 0x01, 0x68, 0x9d, 0x46, 0x6b, + 0x22, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x68, + 0x1c, 0x04, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x46, + 0xe0, 0x36, 0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, + 0xfc, 0x53, 0x1c, 0x04, 0x28, 0x01, 0xd1, 0x3e, + 0x78, 0xb0, 0x28, 0x04, 0xd1, 0x3b, 0x1c, 0x38, + 0x1c, 0x29, 0xf7, 0xff, 0xfb, 0xdb, 0x1c, 0x01, + 0xd0, 0x3d, 0x9b, 0x01, 0x68, 0x9d, 0x46, 0x6b, + 0x22, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x4c, + 0x1c, 0x04, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x2a, + 0xe0, 0x1a, 0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, + 0xfc, 0x03, 0x1c, 0x04, 0x28, 0x01, 0xd1, 0x22, + 0x78, 0xb0, 0x28, 0x04, 0xd1, 0x1f, 0x1c, 0x38, + 0x1c, 0x29, 0xf7, 0xff, 0xfb, 0xbf, 0x1c, 0x01, + 0xd0, 0x21, 0x9b, 0x01, 0x68, 0x9d, 0x46, 0x6b, + 0x22, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x30, + 0x1c, 0x04, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x0e, + 0x1c, 0x28, 0xf0, 0x01, 0xf8, 0xb5, 0xe0, 0x12, + 0xe0, 0x10, 0x1c, 0x02, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x17, 0xe0, 0x09, 0x1c, 0x03, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x62, 0xe0, 0x04, 0xe0, 0x06, + 0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, 0xfd, 0x14, + 0x1c, 0x04, 0xe0, 0x00, 0x24, 0x00, 0x1c, 0x20, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x56, 0xc0, + 0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x17, + 0x22, 0x01, 0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, + 0xb0, 0x81, 0x60, 0x3a, 0x90, 0x00, 0x4e, 0x1f, + 0x19, 0x85, 0x29, 0x21, 0xd0, 0x02, 0x29, 0x80, + 0xd0, 0x2f, 0xe0, 0x06, 0x20, 0x03, 0xf0, 0x01, + 0xf8, 0x5d, 0x4c, 0x1b, 0x60, 0xa0, 0x1c, 0x01, + 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x2a, 0x20, 0x32, + 0x70, 0x20, 0x20, 0x23, 0x70, 0x60, 0x20, 0x0c, + 0x80, 0x60, 0x98, 0x00, 0x5a, 0x30, 0x80, 0xa0, + 0x78, 0xe8, 0x71, 0xa0, 0x1c, 0x0b, 0x79, 0xa1, + 0x22, 0x00, 0x20, 0x82, 0xf7, 0xff, 0xfe, 0x66, + 0x81, 0xa0, 0xf7, 0xff, 0xfe, 0x35, 0x28, 0x00, + 0xd1, 0x01, 0x60, 0x38, 0xe7, 0xe5, 0x78, 0xe8, + 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x43, 0x18, 0x49, 0x09, 0xf0, 0x00, + 0xff, 0xe9, 0x80, 0xa8, 0x20, 0x03, 0x70, 0xa8, + 0xe0, 0x03, 0x7e, 0xa8, 0x28, 0x00, 0xd1, 0x00, + 0x60, 0x38, 0x20, 0x01, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xe0, + 0x2e, 0x08, 0x56, 0xc0, 0x00, 0x00, 0x27, 0x10, + 0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x22, 0x01, + 0x60, 0x1a, 0x00, 0xc2, 0x1a, 0x12, 0x00, 0x92, + 0xb0, 0x81, 0x92, 0x00, 0x1c, 0x1f, 0x4e, 0x54, + 0x19, 0x95, 0x4c, 0x54, 0x29, 0x80, 0xd0, 0x35, + 0xdc, 0x04, 0x29, 0x22, 0xd0, 0x13, 0x29, 0x50, + 0xd1, 0x0d, 0xe0, 0x0e, 0x29, 0x83, 0xd0, 0x11, + 0x29, 0x84, 0xd1, 0x08, 0xf7, 0xff, 0xfd, 0xd4, + 0x20, 0x03, 0xf0, 0x01, 0xf8, 0x03, 0x4c, 0x4c, + 0x60, 0xa0, 0x1c, 0x01, 0xd1, 0x6d, 0x20, 0x00, + 0xe0, 0x89, 0x20, 0x02, 0xe0, 0x67, 0xf7, 0xff, + 0xfd, 0xc7, 0xe7, 0xfa, 0xf7, 0xff, 0xfd, 0xc4, + 0x20, 0x34, 0x70, 0x20, 0x20, 0x31, 0x70, 0x60, + 0x20, 0x04, 0x80, 0x60, 0x78, 0xe8, 0x71, 0x20, + 0xf7, 0xff, 0xfd, 0xde, 0x28, 0x00, 0xd1, 0x01, + 0x60, 0x38, 0xe0, 0x74, 0x78, 0xe8, 0x30, 0x50, + 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, + 0x43, 0x18, 0x49, 0x3c, 0xf0, 0x00, 0xff, 0x92, + 0x80, 0xa8, 0xe0, 0x65, 0xf7, 0xff, 0xfd, 0xa8, + 0x9a, 0x03, 0x78, 0x10, 0x28, 0x80, 0xd1, 0x21, + 0x20, 0x32, 0x70, 0x20, 0x20, 0x23, 0x70, 0x60, + 0x20, 0x0c, 0x80, 0x60, 0x9a, 0x00, 0x5a, 0xb0, + 0x80, 0xa0, 0x78, 0xe9, 0x71, 0xa1, 0x22, 0x00, + 0x20, 0x81, 0x68, 0xa3, 0xf7, 0xff, 0xfd, 0xe6, + 0x81, 0xa0, 0xf7, 0xff, 0xfd, 0xb5, 0x28, 0x00, + 0xd0, 0xc1, 0x78, 0xe8, 0x30, 0x50, 0x04, 0x00, + 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, + 0x49, 0x28, 0xf0, 0x00, 0xff, 0x6b, 0x80, 0xa8, + 0x20, 0x07, 0xe0, 0x20, 0x20, 0x32, 0x70, 0x20, + 0x20, 0x23, 0x70, 0x60, 0x20, 0x0c, 0x80, 0x60, + 0x9a, 0x00, 0x5a, 0xb0, 0x80, 0xa0, 0x78, 0xe9, + 0x71, 0xa1, 0x22, 0x00, 0x20, 0xa2, 0x68, 0xa3, + 0xf7, 0xff, 0xfd, 0xc4, 0x81, 0xa0, 0xf7, 0xff, + 0xfd, 0x93, 0x28, 0x00, 0xd0, 0x0a, 0x78, 0xe8, + 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x43, 0x18, 0x49, 0x17, 0xf0, 0x00, + 0xff, 0x49, 0x80, 0xa8, 0x20, 0x05, 0x70, 0xa8, + 0xe0, 0x1c, 0xe7, 0xff, 0x20, 0x32, 0x70, 0x20, + 0x20, 0x23, 0x70, 0x60, 0x20, 0x0c, 0x80, 0x60, + 0x9a, 0x00, 0x5a, 0xb0, 0x80, 0xa0, 0x78, 0xe8, + 0x71, 0xa0, 0x1c, 0x0b, 0x22, 0x00, 0x1c, 0x01, + 0x20, 0x85, 0xf7, 0xff, 0xfd, 0x9f, 0x81, 0xa0, + 0xf7, 0xff, 0xfd, 0x78, 0x28, 0x00, 0xd1, 0x01, + 0x60, 0x38, 0xe7, 0x78, 0x20, 0x02, 0x70, 0xa8, + 0x20, 0x00, 0x60, 0x38, 0x20, 0x01, 0xb0, 0x01, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x56, 0xc0, + 0x2e, 0x08, 0x56, 0xd0, 0x00, 0x00, 0x27, 0x10, + 0xb5, 0xff, 0x1c, 0x07, 0x06, 0x08, 0x0e, 0x00, + 0x21, 0x01, 0xb0, 0x84, 0x9a, 0x07, 0x26, 0x01, + 0x60, 0x11, 0x00, 0xf9, 0x1b, 0xc9, 0x00, 0x89, + 0x91, 0x02, 0x4a, 0x78, 0x92, 0x03, 0x18, 0x8c, + 0x28, 0x22, 0xd0, 0x0d, 0x4d, 0x76, 0x28, 0x32, + 0xd0, 0x6f, 0x28, 0x34, 0xd0, 0x12, 0x28, 0x60, + 0xd1, 0x6c, 0x20, 0x03, 0xf0, 0x00, 0xff, 0x4a, + 0x60, 0xa8, 0x1c, 0x01, 0xd1, 0x67, 0xe0, 0x16, + 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0x23, 0x1c, 0x38, + 0xf0, 0x00, 0xfc, 0x16, 0x1c, 0x06, 0xd0, 0x5f, + 0x20, 0x02, 0xe0, 0xcc, 0x1c, 0x38, 0xf7, 0xff, + 0xfd, 0x19, 0x89, 0xa8, 0x30, 0x0a, 0x04, 0x00, + 0x0c, 0x00, 0xf0, 0x00, 0xff, 0x33, 0x4f, 0x67, + 0x60, 0xb8, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x00, + 0xe0, 0xbf, 0x89, 0xa9, 0x22, 0x01, 0x02, 0x92, + 0x42, 0x91, 0xdc, 0x1e, 0x31, 0x01, 0xab, 0x01, + 0x80, 0x19, 0x68, 0xa9, 0x91, 0x00, 0x21, 0x32, + 0x70, 0x39, 0x21, 0x23, 0x70, 0x79, 0x21, 0x0c, + 0x80, 0x79, 0x99, 0x02, 0x9a, 0x03, 0x5a, 0x51, + 0x80, 0xb9, 0x78, 0xe1, 0x71, 0xb9, 0x46, 0x6a, + 0x1c, 0x03, 0x20, 0xa0, 0xf7, 0xff, 0xfd, 0x32, + 0x81, 0xb8, 0x20, 0x00, 0x82, 0x20, 0x21, 0x05, + 0x60, 0xe0, 0x70, 0xa1, 0x9a, 0x07, 0x60, 0x10, + 0xe0, 0x1f, 0xab, 0x01, 0x80, 0x1a, 0x68, 0xa9, + 0x91, 0x00, 0x21, 0x32, 0x70, 0x39, 0x21, 0x23, + 0x70, 0x79, 0x21, 0x0c, 0x80, 0x79, 0x99, 0x02, + 0x9a, 0x03, 0x5a, 0x51, 0x80, 0xb9, 0x78, 0xe1, + 0x71, 0xb9, 0x46, 0x6a, 0x1c, 0x03, 0x20, 0xa1, + 0xf7, 0xff, 0xfd, 0x14, 0x81, 0xb8, 0x68, 0xa8, + 0x60, 0xa0, 0x4b, 0x47, 0x18, 0xc0, 0x60, 0xe0, + 0x89, 0xa8, 0x1a, 0xc0, 0x82, 0x20, 0x20, 0x06, + 0x70, 0xa0, 0xf7, 0xff, 0xfc, 0xe3, 0x28, 0x00, + 0xd1, 0x07, 0x68, 0xb8, 0xf0, 0x00, 0xff, 0x08, + 0xe0, 0x2f, 0xe0, 0x0e, 0xe0, 0x63, 0xe0, 0x3a, + 0xe0, 0x6e, 0x78, 0xe0, 0x30, 0x50, 0x04, 0x00, + 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, + 0x49, 0x3a, 0xf0, 0x00, 0xfe, 0x87, 0x80, 0xa0, + 0xe0, 0x62, 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0xae, + 0x20, 0x03, 0xf0, 0x00, 0xfe, 0xcb, 0x60, 0xa8, + 0x1c, 0x01, 0xd0, 0x98, 0x20, 0x32, 0x70, 0x28, + 0x20, 0x23, 0x70, 0x68, 0x20, 0x0c, 0x80, 0x68, + 0x98, 0x02, 0x9a, 0x03, 0x5a, 0x10, 0x80, 0xa8, + 0x78, 0xe0, 0x71, 0xa8, 0x1c, 0x0b, 0x22, 0x00, + 0x1c, 0x01, 0x20, 0x84, 0xf7, 0xff, 0xfc, 0xd6, + 0x81, 0xa8, 0xf7, 0xff, 0xfc, 0xa5, 0x28, 0x00, + 0xd1, 0x01, 0x26, 0x00, 0xe0, 0x40, 0x78, 0xe0, + 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x43, 0x18, 0x49, 0x23, 0xf0, 0x00, + 0xfe, 0x59, 0x80, 0xa0, 0xe0, 0x32, 0x20, 0x32, + 0x70, 0x28, 0x20, 0x23, 0x70, 0x68, 0x20, 0x0c, + 0x80, 0x68, 0x98, 0x02, 0x9a, 0x03, 0x5a, 0x10, + 0x80, 0xa8, 0x78, 0xe0, 0x71, 0xa8, 0x1c, 0x0b, + 0x22, 0x00, 0x1c, 0x01, 0x20, 0xa2, 0xf7, 0xff, + 0xfc, 0xb1, 0x81, 0xa8, 0xf7, 0xff, 0xfc, 0x80, + 0x28, 0x00, 0xd1, 0x02, 0x9a, 0x07, 0x60, 0x10, + 0xe7, 0xd7, 0x78, 0xe0, 0x30, 0x50, 0x04, 0x00, + 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, + 0x49, 0x10, 0xf0, 0x00, 0xfe, 0x33, 0x80, 0xa0, + 0x21, 0x05, 0x70, 0xa1, 0xe0, 0x0c, 0x28, 0x7f, + 0xda, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, + 0x9a, 0x07, 0x1c, 0x38, 0xf0, 0x00, 0xfb, 0x64, + 0x1c, 0x06, 0xd0, 0x01, 0x20, 0x08, 0x70, 0xa0, + 0x1c, 0x30, 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xe0, + 0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xd0, + 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x27, 0x10, + 0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x20, 0x01, + 0xb0, 0x84, 0x9a, 0x07, 0x25, 0x01, 0x60, 0x10, + 0x98, 0x04, 0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, + 0x90, 0x03, 0x4e, 0xcf, 0x19, 0x87, 0x4c, 0xcf, + 0x29, 0x60, 0xd0, 0x6d, 0xdc, 0x0e, 0x29, 0x22, + 0xd0, 0x37, 0x29, 0x32, 0xd0, 0x69, 0x29, 0x34, + 0xd0, 0x68, 0x29, 0x50, 0xd1, 0x67, 0x20, 0x03, + 0xf0, 0x00, 0xfe, 0x40, 0x60, 0xa0, 0x28, 0x00, + 0xd1, 0x62, 0xe0, 0x80, 0x29, 0x80, 0xd0, 0x32, + 0x29, 0x84, 0xd0, 0x5e, 0x29, 0x86, 0xd1, 0x5a, + 0x98, 0x04, 0xf7, 0xff, 0xfc, 0x01, 0x20, 0x86, + 0x76, 0xb8, 0xf7, 0xff, 0xfb, 0x41, 0x1c, 0x05, + 0xd5, 0x73, 0x20, 0x01, 0xab, 0x01, 0x70, 0x18, + 0x21, 0x32, 0x70, 0x21, 0x21, 0x23, 0x70, 0x61, + 0x21, 0x0c, 0x80, 0x61, 0x98, 0x03, 0x5a, 0x30, + 0x80, 0xa0, 0x78, 0xf9, 0x71, 0xa1, 0x20, 0x88, + 0x68, 0xa3, 0xaa, 0x01, 0xf7, 0xff, 0xfc, 0x3a, + 0x81, 0xa0, 0xf7, 0xff, 0xfc, 0x09, 0x28, 0x00, + 0xd1, 0x5c, 0x1c, 0x28, 0xf7, 0xff, 0xfb, 0x6e, + 0xe0, 0xdd, 0x98, 0x04, 0xf7, 0xff, 0xfb, 0xdc, + 0x98, 0x04, 0xf0, 0x00, 0xfa, 0xe1, 0x1c, 0x05, + 0xd0, 0x2a, 0x20, 0x02, 0xe1, 0x4c, 0x98, 0x04, + 0xf7, 0xff, 0xfb, 0xd2, 0x9a, 0x06, 0x78, 0x10, + 0x28, 0x80, 0xd1, 0x27, 0x21, 0x32, 0x70, 0x21, + 0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, 0x80, 0x61, + 0x98, 0x03, 0x5a, 0x30, 0x80, 0xa0, 0x78, 0xf9, + 0x71, 0xa1, 0x22, 0x00, 0x20, 0x81, 0x68, 0xa3, + 0xf7, 0xff, 0xfc, 0x10, 0x81, 0xa0, 0xf7, 0xff, + 0xfb, 0xdf, 0x28, 0x00, 0xd0, 0x73, 0x78, 0xf8, + 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x43, 0x18, 0x49, 0x9a, 0xf0, 0x00, + 0xfd, 0x95, 0x80, 0xb8, 0x20, 0x07, 0xe1, 0x23, + 0xe1, 0x23, 0xe0, 0xea, 0xe0, 0xe6, 0xe1, 0x13, + 0xe0, 0xed, 0xe0, 0x7e, 0x8a, 0x38, 0x28, 0x00, + 0xdd, 0x5e, 0x68, 0xf9, 0x29, 0x00, 0xd0, 0x5c, + 0x91, 0x01, 0x21, 0x32, 0x4c, 0x91, 0x70, 0x21, + 0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, 0x80, 0x61, + 0x99, 0x03, 0x5a, 0x71, 0x80, 0xa1, 0x78, 0xf9, + 0x71, 0xa1, 0x26, 0x01, 0x02, 0xb6, 0x42, 0xb0, + 0xdd, 0x1c, 0x48, 0x8b, 0xf0, 0x00, 0xfd, 0xbe, + 0x60, 0xa0, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x00, + 0xe0, 0x01, 0xe0, 0x8e, 0xe0, 0x7e, 0xe0, 0xfd, + 0xab, 0x02, 0x80, 0x1e, 0x78, 0xf9, 0x1c, 0x03, + 0x20, 0xa1, 0xaa, 0x01, 0xf7, 0xff, 0xfb, 0xce, + 0x81, 0xa0, 0x68, 0xf8, 0x4b, 0x81, 0x18, 0xc0, + 0x60, 0xf8, 0x8a, 0x38, 0x1a, 0xc0, 0x82, 0x38, + 0x20, 0x06, 0xe0, 0x1a, 0x30, 0x0a, 0x04, 0x00, + 0x0c, 0x00, 0xf0, 0x00, 0xfd, 0x9f, 0x60, 0xa0, + 0x28, 0x00, 0xd0, 0xe0, 0x8a, 0x39, 0x31, 0x01, + 0xab, 0x02, 0x80, 0x19, 0x78, 0xf9, 0x1c, 0x03, + 0x20, 0xa0, 0xaa, 0x01, 0xf7, 0xff, 0xfb, 0xb2, + 0x81, 0xa0, 0x24, 0x00, 0x82, 0x3c, 0x60, 0xfc, + 0x68, 0xb8, 0xf0, 0x00, 0xfd, 0xb1, 0x20, 0x05, + 0x60, 0xbc, 0x70, 0xb8, 0xf7, 0xff, 0xfb, 0x82, + 0x28, 0x00, 0xd0, 0x0c, 0x78, 0xf8, 0x30, 0x50, + 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, + 0x43, 0x18, 0x49, 0x67, 0xf0, 0x00, 0xfd, 0x2e, + 0x80, 0xb8, 0x20, 0x00, 0xe0, 0x02, 0xe0, 0xa1, + 0xe0, 0x03, 0xe0, 0x02, 0x9a, 0x07, 0x60, 0x10, + 0xe0, 0xb7, 0x7e, 0xb8, 0x28, 0x00, 0xd1, 0x11, + 0x78, 0xf8, 0x30, 0x60, 0x04, 0x00, 0x0c, 0x00, + 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, 0x21, 0x7d, + 0x00, 0xc9, 0xf0, 0x00, 0xfd, 0x17, 0x80, 0xf8, + 0x20, 0x04, 0x70, 0xb8, 0x68, 0xa0, 0xf0, 0x00, + 0xfd, 0x83, 0xe0, 0xa2, 0x20, 0x00, 0x76, 0xb8, + 0xe0, 0x9f, 0x20, 0x84, 0x76, 0xb8, 0x21, 0x32, + 0x70, 0x21, 0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, + 0x80, 0x61, 0x98, 0x03, 0x5a, 0x30, 0x80, 0xa0, + 0x78, 0xf9, 0x71, 0xa1, 0x22, 0x00, 0x20, 0x85, + 0x68, 0xa3, 0xf7, 0xff, 0xfb, 0x67, 0x81, 0xa0, + 0xf7, 0xff, 0xfb, 0x36, 0x28, 0x00, 0xd1, 0x01, + 0x25, 0x00, 0xe0, 0x03, 0x98, 0x04, 0xf0, 0x00, + 0xfa, 0x13, 0x1c, 0x05, 0x2d, 0x00, 0xd0, 0x00, + 0xe7, 0x2f, 0xe0, 0x7e, 0x78, 0xf8, 0x30, 0x50, + 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x98, 0x00, 0x43, 0x18, 0x49, 0x40, + 0xf0, 0x00, 0xfc, 0xe0, 0x80, 0xb8, 0x20, 0x01, + 0xe0, 0x70, 0x00, 0xe8, 0x1b, 0x40, 0x00, 0x80, + 0x19, 0x81, 0x78, 0xc9, 0xab, 0x01, 0x70, 0x19, + 0x99, 0x03, 0x5a, 0x71, 0x52, 0x31, 0x21, 0x32, + 0x70, 0x21, 0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, + 0x80, 0x61, 0x98, 0x03, 0x5a, 0x30, 0x80, 0xa0, + 0x78, 0xf9, 0x71, 0xa1, 0x20, 0x87, 0x68, 0xa3, + 0xaa, 0x01, 0xf7, 0xff, 0xfb, 0x2f, 0x81, 0xa0, + 0xf7, 0xff, 0xfa, 0xfe, 0x28, 0x00, 0xd1, 0x03, + 0x1c, 0x28, 0xf7, 0xff, 0xfa, 0x63, 0xe0, 0x31, + 0x21, 0x21, 0x9a, 0x07, 0x1c, 0x28, 0xf7, 0xff, + 0xfc, 0x8f, 0x1c, 0x05, 0x78, 0xf8, 0x30, 0x50, + 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, + 0x43, 0x18, 0x49, 0x25, 0xf0, 0x00, 0xfc, 0xaa, + 0x80, 0xb8, 0xe0, 0x3a, 0x98, 0x04, 0x1d, 0x22, + 0xe0, 0x01, 0x22, 0x00, 0x98, 0x04, 0xf7, 0xfe, + 0xff, 0xd9, 0x1c, 0x05, 0xe0, 0x31, 0x21, 0x32, + 0x70, 0x21, 0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, + 0x80, 0x61, 0x99, 0x03, 0x5a, 0x71, 0x80, 0xa1, + 0x78, 0xf9, 0x71, 0xa1, 0x22, 0x00, 0x1c, 0x03, + 0x20, 0x84, 0xf7, 0xff, 0xfa, 0xfb, 0x81, 0xa0, + 0xf7, 0xff, 0xfa, 0xca, 0x28, 0x00, 0xd1, 0x03, + 0x9a, 0x07, 0x60, 0x10, 0x25, 0x00, 0xe0, 0x18, + 0x78, 0xf8, 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, + 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, 0x49, 0x0e, + 0xf0, 0x00, 0xfc, 0x7c, 0x80, 0xb8, 0xe0, 0x0a, + 0x29, 0x7f, 0xda, 0x01, 0x21, 0x01, 0xe0, 0x00, + 0x21, 0x00, 0x98, 0x04, 0x9a, 0x07, 0xf0, 0x00, + 0xf9, 0xaf, 0x1c, 0x05, 0xd0, 0x01, 0x20, 0x08, + 0x70, 0xb8, 0x1c, 0x28, 0xb0, 0x04, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x56, 0xc0, + 0x00, 0x00, 0x27, 0x10, 0x2e, 0x08, 0x56, 0xd0, + 0x00, 0x00, 0x04, 0x0a, 0x00, 0x00, 0x03, 0xff, + 0xb5, 0x80, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x07, + 0x20, 0x01, 0x60, 0x18, 0x29, 0x50, 0xd0, 0x0e, + 0xdc, 0x06, 0x29, 0x22, 0xd0, 0x0b, 0x29, 0x32, + 0xd0, 0x09, 0x29, 0x34, 0xd1, 0x0d, 0xe0, 0x06, + 0x29, 0x80, 0xd0, 0x02, 0x29, 0x84, 0xd1, 0x08, + 0xe0, 0x01, 0x20, 0x00, 0x70, 0x10, 0x1c, 0x38, + 0xf7, 0xff, 0xfe, 0x2e, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x29, 0x7f, 0xda, 0x01, 0x21, 0x01, + 0xe0, 0x00, 0x21, 0x00, 0x1c, 0x38, 0x1c, 0x1a, + 0xf0, 0x00, 0xf9, 0x72, 0x28, 0x00, 0xd0, 0xf1, + 0x21, 0x08, 0x00, 0xfa, 0x1b, 0xd2, 0x00, 0x92, + 0x4b, 0x02, 0x18, 0xd2, 0x70, 0x91, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x20, 0x01, + 0xb0, 0x81, 0x1c, 0x17, 0x9a, 0x04, 0x25, 0x01, + 0x60, 0x10, 0x98, 0x01, 0x00, 0xc2, 0x1a, 0x12, + 0x00, 0x92, 0x1c, 0x16, 0x48, 0x78, 0x90, 0x00, + 0x18, 0x14, 0x29, 0x80, 0xd0, 0x59, 0xdc, 0x08, + 0x29, 0x22, 0xd0, 0x1a, 0x29, 0x32, 0xd0, 0x55, + 0x29, 0x34, 0xd0, 0x53, 0x29, 0x50, 0xd1, 0x61, + 0xe0, 0xc8, 0x29, 0x84, 0xd0, 0x4e, 0x4e, 0x71, + 0x29, 0xa0, 0xd0, 0x18, 0x29, 0xa1, 0xd1, 0x59, + 0x98, 0x01, 0xf7, 0xff, 0xfa, 0x19, 0x8b, 0x21, + 0x29, 0x00, 0xd1, 0x54, 0x88, 0xb8, 0xf0, 0x00, + 0xfc, 0x45, 0x60, 0xb0, 0x28, 0x00, 0xd1, 0x58, + 0xe0, 0x15, 0x98, 0x01, 0xf7, 0xff, 0xfa, 0x0c, + 0x98, 0x01, 0xf0, 0x00, 0xf9, 0x11, 0x1c, 0x05, + 0xd0, 0x6a, 0x20, 0x02, 0xe0, 0xbd, 0x98, 0x01, + 0xf7, 0xff, 0xfa, 0x02, 0x8b, 0x21, 0x29, 0x00, + 0xd1, 0x07, 0x88, 0xb8, 0xf0, 0x00, 0xfc, 0x2e, + 0x60, 0xb0, 0x28, 0x00, 0xd1, 0x0c, 0x20, 0x00, + 0xe0, 0xb1, 0x88, 0xb8, 0x18, 0x08, 0x04, 0x02, + 0x0c, 0x12, 0x69, 0x60, 0xf0, 0x00, 0xfc, 0x27, + 0x60, 0xb0, 0x28, 0x00, 0xd0, 0xf3, 0x61, 0x60, + 0x20, 0x34, 0x70, 0x30, 0x70, 0x70, 0x20, 0x0c, + 0x80, 0x70, 0x78, 0xe0, 0x71, 0x30, 0x88, 0xb9, + 0x8b, 0x20, 0x18, 0x09, 0x81, 0xb1, 0x68, 0xb1, + 0x18, 0x08, 0x88, 0xba, 0x68, 0x39, 0xf0, 0x13, + 0xfb, 0x2d, 0xf7, 0xff, 0xfa, 0x07, 0x28, 0x00, + 0xd1, 0x05, 0x68, 0xb0, 0xf0, 0x00, 0xfc, 0x2c, + 0xe0, 0x53, 0xe0, 0x36, 0xe0, 0x76, 0x78, 0xe0, + 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x43, 0x18, 0x49, 0x46, 0xf0, 0x00, + 0xfb, 0xad, 0x80, 0xa0, 0x20, 0x00, 0x83, 0x20, + 0x61, 0x60, 0xe0, 0x22, 0xe0, 0x6d, 0x88, 0xb8, + 0x18, 0x08, 0x04, 0x02, 0x0c, 0x12, 0x69, 0x60, + 0xf0, 0x00, 0xfb, 0xf1, 0x60, 0xb0, 0x28, 0x00, + 0xd0, 0xbd, 0x61, 0x60, 0x8b, 0x21, 0x69, 0x60, + 0x18, 0x40, 0x88, 0xba, 0x68, 0x39, 0xf0, 0x13, + 0xfb, 0x01, 0x8b, 0x20, 0x88, 0xb9, 0x18, 0x40, + 0x83, 0x20, 0x78, 0xe0, 0x30, 0x50, 0x04, 0x00, + 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, + 0x49, 0x33, 0xf0, 0x00, 0xfb, 0x87, 0x80, 0xa0, + 0x20, 0x00, 0x9a, 0x04, 0x60, 0x10, 0xe0, 0x55, + 0xe0, 0x54, 0x98, 0x01, 0xf7, 0xff, 0xf9, 0x98, + 0x78, 0x38, 0x28, 0x80, 0xd1, 0x23, 0x20, 0x32, + 0x4f, 0x2c, 0x70, 0x38, 0x20, 0x23, 0x70, 0x78, + 0x20, 0x0c, 0x80, 0x78, 0x98, 0x00, 0x5b, 0x80, + 0x80, 0xb8, 0x78, 0xe1, 0x71, 0xb9, 0x22, 0x00, + 0x20, 0x81, 0x68, 0xbb, 0xf7, 0xff, 0xf9, 0xd6, + 0x81, 0xb8, 0xf7, 0xff, 0xf9, 0xa5, 0x28, 0x00, + 0xd1, 0x01, 0x25, 0x00, 0xe0, 0x36, 0x78, 0xe0, + 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x43, 0x18, 0x49, 0x1c, 0xf0, 0x00, + 0xfb, 0x59, 0x80, 0xa0, 0xe0, 0x2a, 0x7e, 0xa0, + 0x28, 0x00, 0xd1, 0x10, 0x78, 0xe0, 0x30, 0x60, + 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, + 0x43, 0x18, 0x21, 0x7d, 0x00, 0xc9, 0xf0, 0x00, + 0xfb, 0x49, 0x80, 0xe0, 0x20, 0x00, 0x9a, 0x04, + 0x60, 0x10, 0x20, 0x04, 0xe0, 0x15, 0x20, 0x00, + 0x76, 0xa0, 0xe0, 0x13, 0x98, 0x01, 0x9b, 0x04, + 0x1c, 0x3a, 0xf7, 0xff, 0xfd, 0x29, 0x1c, 0x05, + 0xe0, 0x0c, 0x29, 0x7f, 0xda, 0x01, 0x21, 0x01, + 0xe0, 0x00, 0x21, 0x00, 0x98, 0x01, 0x9a, 0x04, + 0xf0, 0x00, 0xf8, 0x6e, 0x1c, 0x05, 0xd0, 0x01, + 0x20, 0x08, 0x70, 0xa0, 0x1c, 0x28, 0xb0, 0x01, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x56, 0xd0, + 0x00, 0x00, 0x27, 0x10, 0x2e, 0x08, 0x56, 0xc0, + 0xb5, 0xf0, 0x1c, 0x07, 0x06, 0x08, 0x0e, 0x00, + 0x21, 0x01, 0x26, 0x02, 0x00, 0xfa, 0x1b, 0xd2, + 0x00, 0x92, 0x60, 0x19, 0x1c, 0x1c, 0x49, 0x19, + 0x18, 0x55, 0x28, 0x22, 0xd0, 0x19, 0x28, 0x50, + 0xd0, 0x11, 0x28, 0x80, 0xd0, 0x21, 0x28, 0x85, + 0xd1, 0x23, 0x1c, 0x38, 0xf7, 0xff, 0xf9, 0x20, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x25, 0x28, 0x00, + 0xd0, 0x00, 0x70, 0xae, 0x21, 0x00, 0x60, 0x21, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x1a, 0x28, 0x00, 0xd0, 0xf7, + 0xe0, 0x07, 0x1c, 0x38, 0xf7, 0xff, 0xf9, 0x0c, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x11, 0x28, 0x00, + 0xd0, 0xee, 0x70, 0xae, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0x00, 0x22, 0x34, 0x49, 0x0a, 0x70, 0x0a, + 0x22, 0x33, 0x70, 0x4a, 0x22, 0x04, 0x80, 0x4a, + 0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, 0x4a, 0x07, + 0x18, 0x80, 0x78, 0xc0, 0x71, 0x08, 0xf7, 0xff, + 0xf9, 0x0b, 0x28, 0x00, 0xd1, 0x01, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0xf0, 0x1c, 0x04, 0x20, 0x01, 0x26, 0x01, + 0x60, 0x10, 0x1c, 0x17, 0x4d, 0x1b, 0x29, 0x00, + 0xd0, 0x08, 0x20, 0x03, 0xf0, 0x00, 0xfb, 0x02, + 0x60, 0xa8, 0x28, 0x00, 0xd1, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x32, 0x70, 0x28, + 0x20, 0x23, 0x70, 0x68, 0x20, 0x0c, 0x80, 0x68, + 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 0x49, 0x12, + 0x5a, 0x0a, 0x80, 0xaa, 0x18, 0x44, 0x78, 0xe1, + 0x71, 0xa9, 0x22, 0x00, 0x20, 0x84, 0x68, 0xab, + 0xf7, 0xff, 0xf9, 0x08, 0x81, 0xa8, 0xf7, 0xff, + 0xf8, 0xd7, 0x28, 0x00, 0xd1, 0x02, 0x26, 0x00, + 0x60, 0x38, 0xe0, 0x0a, 0x78, 0xe0, 0x30, 0x50, + 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, + 0x43, 0x18, 0x49, 0x06, 0xf0, 0x00, 0xfa, 0x8a, + 0x80, 0xa0, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x56, 0xc0, + 0x2e, 0x08, 0x56, 0xe0, 0x00, 0x00, 0x27, 0x10, + 0x20, 0x00, 0x47, 0x70, 0xb5, 0x90, 0x28, 0x00, + 0xd0, 0x06, 0x21, 0xff, 0x4a, 0x24, 0x73, 0x11, + 0x4b, 0x24, 0x18, 0xc1, 0xf7, 0xfa, 0xfe, 0x88, + 0x20, 0x00, 0x21, 0x00, 0x4a, 0x22, 0x01, 0x83, + 0x18, 0x1b, 0x00, 0xdb, 0x18, 0x9b, 0x33, 0xff, + 0x33, 0xff, 0x33, 0x02, 0x60, 0x19, 0x60, 0x59, + 0x30, 0x01, 0x28, 0x06, 0xdb, 0xf3, 0x20, 0x00, + 0x43, 0xc4, 0x4a, 0x1c, 0x01, 0x03, 0x50, 0xd1, + 0x18, 0x9b, 0x60, 0xdc, 0x30, 0x01, 0x28, 0x1e, + 0xdb, 0xf8, 0x27, 0x01, 0x20, 0x02, 0x49, 0x18, + 0x60, 0x08, 0xf7, 0xfd, 0xfb, 0x11, 0x28, 0x01, + 0xd0, 0x00, 0x27, 0x00, 0xf7, 0xfb, 0xff, 0x78, + 0x28, 0x00, 0xd1, 0x00, 0x27, 0x00, 0xf7, 0xfe, + 0xfe, 0x09, 0x28, 0x00, 0xd1, 0x00, 0x27, 0x00, + 0xf7, 0xfd, 0xfe, 0x24, 0x28, 0x00, 0xd1, 0x00, + 0x27, 0x00, 0xf0, 0x01, 0xf9, 0x05, 0x28, 0x00, + 0xd1, 0x00, 0x27, 0x00, 0xf0, 0x02, 0xf8, 0xb6, + 0x42, 0xa0, 0xd1, 0x00, 0x27, 0x00, 0x2f, 0x01, + 0xd1, 0x01, 0xf0, 0x00, 0xf8, 0x0f, 0x1c, 0x38, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0x90, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x5e, 0x30, 0x2e, 0x08, 0x5c, 0x50, + 0x6e, 0x00, 0x11, 0x00, 0xb5, 0x00, 0xf0, 0x18, + 0xfd, 0x33, 0x49, 0x07, 0x20, 0x19, 0xf0, 0x18, + 0xfc, 0xfb, 0xf0, 0x18, 0xfc, 0xf1, 0x4b, 0x05, + 0x40, 0x18, 0xf0, 0x18, 0xfc, 0xf1, 0xf0, 0x18, + 0xfd, 0x5d, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x00, 0xaf, 0xb5, 0xfd, 0xff, 0xff, 0xff, + 0xb5, 0x00, 0xf0, 0x18, 0xfc, 0xe1, 0x23, 0x01, + 0x06, 0x5b, 0x43, 0x18, 0xf0, 0x18, 0xfc, 0xe0, + 0x20, 0x01, 0x06, 0x40, 0xf0, 0x18, 0xfc, 0xd3, + 0x48, 0x02, 0x68, 0x81, 0x31, 0x01, 0x60, 0x81, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x90, + 0xb5, 0xf0, 0xb0, 0x84, 0xf0, 0x00, 0xfa, 0x80, + 0x4f, 0x99, 0x88, 0x39, 0x48, 0x99, 0x29, 0x06, + 0xd2, 0x64, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x03, 0x36, 0x61, 0x8e, + 0xb9, 0xe8, 0x1d, 0xc5, 0x35, 0xff, 0x35, 0xfa, + 0x68, 0x6c, 0x68, 0x2e, 0x2e, 0x00, 0xd1, 0x13, + 0xf7, 0xfa, 0xfc, 0xa0, 0x69, 0x39, 0x42, 0x88, + 0xd9, 0x24, 0xf7, 0xfa, 0xfc, 0x9b, 0x30, 0x64, + 0x61, 0x38, 0x20, 0x00, 0xab, 0x01, 0x70, 0x18, + 0x3b, 0x04, 0x70, 0x18, 0x46, 0x69, 0x22, 0x00, + 0xa8, 0x01, 0xf7, 0xfd, 0xfa, 0x69, 0xe0, 0x15, + 0x21, 0x01, 0xab, 0x01, 0x70, 0x19, 0x19, 0x01, + 0x31, 0xff, 0x31, 0xe1, 0x78, 0x09, 0x3b, 0x04, + 0x70, 0x19, 0x01, 0x21, 0x18, 0x0a, 0x46, 0x69, + 0xa8, 0x01, 0xf7, 0xfd, 0xfa, 0x59, 0x20, 0x1e, + 0x1c, 0x61, 0x3e, 0x01, 0xf0, 0x13, 0xf8, 0xd8, + 0x60, 0x69, 0x60, 0x2e, 0x21, 0x01, 0xe0, 0x54, + 0x23, 0x01, 0x02, 0x9b, 0x18, 0xc5, 0x68, 0xec, + 0x68, 0xae, 0x2e, 0x00, 0xd0, 0x20, 0x19, 0x01, + 0x23, 0x1f, 0x01, 0x5b, 0x18, 0xc9, 0x7a, 0x09, + 0xab, 0x00, 0x70, 0x19, 0xa9, 0x00, 0x78, 0x09, + 0x09, 0x09, 0x29, 0x06, 0xd0, 0x01, 0x21, 0x01, + 0xe0, 0x00, 0x21, 0x02, 0xab, 0x01, 0x70, 0x19, + 0x01, 0x21, 0x18, 0x08, 0x23, 0x41, 0x00, 0xdb, + 0x18, 0xc2, 0x46, 0x69, 0xa8, 0x01, 0xf7, 0xfb, + 0xfe, 0xa3, 0x20, 0x1e, 0x1c, 0x61, 0x3e, 0x01, + 0xf0, 0x13, 0xf8, 0xae, 0x60, 0xe9, 0x60, 0xae, + 0x21, 0x02, 0xe0, 0x2a, 0xe0, 0xc2, 0x23, 0x03, + 0x02, 0x5b, 0x18, 0xc5, 0x69, 0x6c, 0x69, 0x2e, + 0x2e, 0x00, 0xd0, 0x21, 0x21, 0x01, 0xab, 0x01, + 0x70, 0x19, 0x19, 0x01, 0x23, 0x2f, 0x01, 0x5b, + 0x18, 0xc9, 0x7c, 0x09, 0xab, 0x00, 0x70, 0x19, + 0xa9, 0x00, 0x78, 0x09, 0x09, 0x09, 0x29, 0x06, + 0xd1, 0x02, 0x21, 0x02, 0x71, 0x19, 0x33, 0x04, + 0x01, 0x21, 0x18, 0x08, 0x23, 0x41, 0x01, 0x1b, + 0x18, 0xc2, 0x46, 0x69, 0xa8, 0x01, 0xf7, 0xfe, + 0xfd, 0x09, 0x20, 0x1e, 0x1c, 0x61, 0x3e, 0x01, + 0xf0, 0x13, 0xf8, 0x82, 0x61, 0x69, 0x61, 0x2e, + 0x21, 0x03, 0x80, 0x39, 0x20, 0x00, 0xe0, 0x97, + 0x23, 0x01, 0x02, 0xdb, 0x18, 0xc5, 0x69, 0xec, + 0x69, 0xae, 0x2e, 0x00, 0xd0, 0x21, 0x21, 0x01, + 0xab, 0x01, 0x70, 0x19, 0x19, 0x01, 0x23, 0x3f, + 0x01, 0x5b, 0x18, 0xc9, 0x7e, 0x09, 0xab, 0x00, + 0x70, 0x19, 0xa9, 0x00, 0x78, 0x09, 0x09, 0x09, + 0x29, 0x06, 0xd1, 0x02, 0x21, 0x02, 0x71, 0x19, + 0x33, 0x04, 0x01, 0x21, 0x18, 0x08, 0x23, 0xc3, + 0x00, 0xdb, 0x18, 0xc2, 0x46, 0x69, 0xa8, 0x01, + 0xf7, 0xfd, 0xfc, 0xfe, 0x20, 0x1e, 0x1c, 0x61, + 0x3e, 0x01, 0xf0, 0x13, 0xf8, 0x55, 0x61, 0xe9, + 0x61, 0xae, 0x20, 0x04, 0xe0, 0x2c, 0x23, 0x05, + 0x02, 0x5b, 0x18, 0xc5, 0x6a, 0x6c, 0x6a, 0x2e, + 0x2e, 0x00, 0xd0, 0x24, 0x19, 0x01, 0x18, 0xc9, + 0x78, 0x09, 0xab, 0x00, 0x70, 0x19, 0xa9, 0x00, + 0x78, 0x09, 0x09, 0x09, 0x29, 0x06, 0xd0, 0x05, + 0x29, 0x07, 0xd0, 0x01, 0x29, 0x08, 0xd1, 0x03, + 0x21, 0x03, 0xe0, 0x02, 0x21, 0x02, 0xe0, 0x00, + 0x21, 0x01, 0xab, 0x01, 0x70, 0x19, 0x01, 0x21, + 0x18, 0x08, 0x23, 0x41, 0x01, 0x5b, 0x18, 0xc2, + 0x46, 0x69, 0xa8, 0x01, 0xf0, 0x00, 0xff, 0xb4, + 0x20, 0x1e, 0x1c, 0x61, 0x3e, 0x01, 0xf0, 0x13, + 0xf8, 0x27, 0x62, 0x69, 0x62, 0x2e, 0x20, 0x05, + 0x80, 0x38, 0xe7, 0xa3, 0xe7, 0xff, 0x23, 0x03, + 0x02, 0x9b, 0x18, 0xc6, 0x6a, 0xf4, 0x6a, 0xb5, + 0x2d, 0x00, 0xd0, 0x33, 0x19, 0x01, 0x18, 0xc9, + 0x7a, 0x09, 0xab, 0x00, 0x70, 0x19, 0xa9, 0x00, + 0x78, 0x09, 0x09, 0x09, 0x29, 0x09, 0xd0, 0x10, + 0x29, 0x0a, 0xd1, 0x1f, 0x01, 0x21, 0x18, 0x08, + 0x23, 0x05, 0x02, 0x5b, 0x18, 0xc0, 0x90, 0x02, + 0x8d, 0x01, 0x6a, 0xc0, 0xf7, 0xf5, 0xfd, 0x7c, + 0x23, 0x01, 0x42, 0xd8, 0xd0, 0x14, 0x98, 0x02, + 0xe0, 0x0d, 0x01, 0x21, 0x18, 0x08, 0x23, 0x05, + 0x02, 0x5b, 0x18, 0xc0, 0x90, 0x03, 0x8d, 0x01, + 0x6a, 0xc0, 0xf7, 0xf5, 0xfd, 0xe6, 0x23, 0x01, + 0x42, 0xd8, 0xd0, 0x05, 0x98, 0x03, 0x6a, 0xc0, + 0xf0, 0x00, 0xf9, 0x42, 0x34, 0x01, 0x3d, 0x01, + 0x20, 0x1e, 0x1c, 0x21, 0xf0, 0x12, 0xff, 0xe8, + 0x62, 0xf1, 0x62, 0xb5, 0x20, 0x00, 0x80, 0x38, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x90, 0x2e, 0x08, 0x5e, 0x30, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0xb4, 0x0f, 0xb5, 0x80, + 0xb0, 0x84, 0x99, 0x06, 0xaa, 0x07, 0x4f, 0x15, + 0x68, 0x38, 0xf0, 0x13, 0xf8, 0xf5, 0x30, 0x01, + 0x04, 0x00, 0x0c, 0x00, 0xab, 0x00, 0x80, 0x18, + 0x28, 0x80, 0xdc, 0x19, 0xa8, 0x00, 0x88, 0x00, + 0x28, 0x04, 0xdb, 0x15, 0xa8, 0x00, 0x88, 0x00, + 0x30, 0x02, 0xf0, 0x00, 0xf8, 0xeb, 0x28, 0x00, + 0xd0, 0x0e, 0x90, 0x01, 0xaa, 0x00, 0x88, 0x12, + 0x68, 0x39, 0xf0, 0x13, 0xf8, 0x03, 0x21, 0x00, + 0xaa, 0x00, 0x88, 0x12, 0x98, 0x01, 0x54, 0x81, + 0x46, 0x69, 0x20, 0xa6, 0xf0, 0x00, 0xf8, 0x24, + 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 0xb0, 0x04, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xcc, + 0xb5, 0x90, 0x04, 0x0c, 0x0c, 0x24, 0x1c, 0x07, + 0x1c, 0x20, 0xb0, 0x84, 0xf0, 0x00, 0xf8, 0xca, + 0x28, 0x00, 0xd1, 0x01, 0x43, 0xc0, 0xe0, 0x0b, + 0xab, 0x00, 0x80, 0x1c, 0x90, 0x01, 0x1c, 0x39, + 0x1c, 0x22, 0xf0, 0x12, 0xff, 0xdf, 0x46, 0x69, + 0x20, 0x96, 0xf0, 0x00, 0xf8, 0x05, 0x20, 0x00, + 0xb0, 0x04, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf0, 0x06, 0x06, 0x0e, 0x36, 0x07, 0x30, + 0x0f, 0x00, 0x01, 0x83, 0x18, 0x18, 0x00, 0xc0, + 0x1c, 0x0f, 0xb0, 0x83, 0x49, 0x2e, 0x18, 0x45, + 0x1f, 0xe8, 0x38, 0x79, 0x90, 0x02, 0x6f, 0x84, + 0x6f, 0xc0, 0x2c, 0x1e, 0xda, 0x4e, 0x09, 0x31, + 0x29, 0x06, 0xd1, 0x11, 0x88, 0x3a, 0xb0, 0x81, + 0x92, 0x00, 0x19, 0x01, 0x20, 0x1e, 0x1c, 0x2f, + 0xf0, 0x12, 0xff, 0x6a, 0x9a, 0x00, 0x01, 0x08, + 0x18, 0x38, 0x38, 0xff, 0x38, 0xff, 0x38, 0x42, + 0x87, 0x02, 0x18, 0x68, 0xb0, 0x01, 0xe0, 0x34, + 0x29, 0x07, 0xd1, 0x22, 0x19, 0x01, 0x20, 0x1e, + 0xf0, 0x12, 0xff, 0x5a, 0x91, 0x00, 0x01, 0x08, + 0x18, 0x28, 0x90, 0x01, 0x22, 0x10, 0x38, 0xff, + 0x38, 0xff, 0x38, 0x0a, 0x1c, 0x39, 0xf0, 0x12, + 0xff, 0x9d, 0x98, 0x00, 0x18, 0x28, 0x38, 0x40, + 0x76, 0x06, 0x78, 0xb8, 0xf0, 0x00, 0xf8, 0x76, + 0x99, 0x01, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, + 0x67, 0xc8, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0x1a, + 0x78, 0xba, 0x68, 0x79, 0xf0, 0x12, 0xff, 0x8a, + 0xe0, 0x11, 0x19, 0x01, 0x20, 0x1e, 0xf0, 0x12, + 0xff, 0x37, 0x91, 0x00, 0x01, 0x08, 0x18, 0x28, + 0x22, 0x10, 0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, + 0x1c, 0x39, 0xf0, 0x12, 0xff, 0x7b, 0x98, 0x00, + 0x18, 0x28, 0x38, 0x40, 0x76, 0x06, 0x1c, 0x60, + 0x99, 0x02, 0x67, 0x88, 0x20, 0xff, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x5e, 0x30, 0xb5, 0xf3, 0x04, 0x0d, + 0x0c, 0x2d, 0x98, 0x00, 0x04, 0x06, 0x0c, 0x36, + 0x27, 0x00, 0x4c, 0x17, 0x01, 0x38, 0x58, 0x20, + 0x42, 0xb0, 0xd1, 0x07, 0xf7, 0xfa, 0xfa, 0xb2, + 0x19, 0x41, 0x01, 0x38, 0x19, 0x00, 0x60, 0xc1, + 0x60, 0x85, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1e, + 0xdb, 0xf0, 0x2f, 0x1e, 0xdb, 0x1a, 0x27, 0x00, + 0x01, 0x38, 0x58, 0x20, 0x28, 0x00, 0xd1, 0x0b, + 0x01, 0x38, 0x50, 0x26, 0x99, 0x00, 0x0c, 0x09, + 0x19, 0x04, 0x60, 0x61, 0xf7, 0xfa, 0xfa, 0x9a, + 0x19, 0x40, 0x60, 0xe0, 0x60, 0xa5, 0xe0, 0x02, + 0x37, 0x01, 0x2f, 0x1e, 0xdb, 0xec, 0x2f, 0x1e, + 0xdb, 0x04, 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x30, 0xe7, 0xf9, + 0x2e, 0x08, 0x5c, 0x50, 0xb4, 0x80, 0x21, 0x00, + 0x4a, 0x07, 0x23, 0x00, 0x01, 0x0f, 0x59, 0xd7, + 0x42, 0x87, 0xd1, 0x02, 0x01, 0x08, 0x50, 0x13, + 0xe0, 0x02, 0x31, 0x01, 0x29, 0x1e, 0xdb, 0xf5, + 0x1c, 0x18, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x5c, 0x50, 0xb5, 0x00, 0xf7, 0xfa, + 0xfb, 0xd7, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, + 0x1c, 0x04, 0x1c, 0x10, 0x1c, 0x15, 0x1c, 0x0f, + 0xf7, 0xff, 0xff, 0xf4, 0x1c, 0x06, 0xd1, 0x06, + 0x1c, 0x20, 0xf7, 0xfa, 0xfb, 0xd3, 0x20, 0x00, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1b, 0xea, + 0x19, 0xf0, 0x21, 0x00, 0xf0, 0x12, 0xff, 0xfe, + 0x1c, 0x30, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x12, + 0xff, 0x01, 0x1c, 0x20, 0xf7, 0xfa, 0xfb, 0xc2, + 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x80, 0x27, 0x01, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xfa, 0xfb, 0xb8, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0x1c, 0x07, + 0xf7, 0xfa, 0xfa, 0x40, 0x19, 0xc7, 0xf7, 0xfa, + 0xfa, 0x3d, 0x42, 0xb8, 0xd3, 0xfb, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x47, 0x70, + 0xb5, 0xf0, 0xf7, 0xfa, 0xfa, 0x33, 0x4e, 0x13, + 0x69, 0x71, 0x42, 0x88, 0xd0, 0x1d, 0xf7, 0xfa, + 0xfa, 0x2d, 0x27, 0x00, 0x61, 0x70, 0x4d, 0x10, + 0x4c, 0x10, 0x01, 0x38, 0x58, 0x22, 0x2a, 0x00, + 0xd0, 0x10, 0x19, 0x00, 0x68, 0xc3, 0x69, 0x71, + 0x42, 0x8b, 0xd2, 0x0b, 0x80, 0x2a, 0x68, 0x82, + 0x18, 0x51, 0x60, 0xc1, 0x68, 0x40, 0x07, 0x00, + 0x0f, 0x00, 0x23, 0x60, 0x43, 0x18, 0x1c, 0x29, + 0xf7, 0xff, 0xfe, 0xea, 0x37, 0x01, 0x2f, 0x1e, + 0xdb, 0xe7, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x90, + 0x2e, 0x08, 0x5c, 0x40, 0x2e, 0x08, 0x5c, 0x50, + 0xb5, 0x80, 0x04, 0x00, 0x0c, 0x00, 0x21, 0x9f, + 0x4a, 0x07, 0x70, 0x11, 0x21, 0x80, 0x70, 0x51, + 0x21, 0x10, 0x70, 0x91, 0x27, 0x00, 0x70, 0xd7, + 0x21, 0x04, 0xf0, 0x01, 0xf8, 0xdd, 0x1c, 0x38, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x72, 0x60, 0xb5, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0xf0, 0x00, 0xf8, 0x03, 0x20, 0x00, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0x04, 0x00, + 0x0c, 0x00, 0x21, 0x9f, 0x4a, 0x07, 0x70, 0x11, + 0x21, 0x80, 0x70, 0x51, 0x21, 0x12, 0x70, 0x91, + 0x27, 0x00, 0x70, 0xd7, 0x21, 0x04, 0xf0, 0x01, + 0xf8, 0xbf, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, + 0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x21, 0x00, + 0x20, 0x9f, 0x4a, 0x14, 0x70, 0x10, 0x20, 0x80, + 0x70, 0x50, 0x20, 0x11, 0x70, 0x90, 0x27, 0x00, + 0x48, 0x11, 0x01, 0x3d, 0x19, 0xed, 0x00, 0xed, + 0x59, 0x46, 0x2e, 0x00, 0xd0, 0x0c, 0x00, 0x8b, + 0x18, 0x9b, 0x0e, 0x36, 0x71, 0x1e, 0x59, 0x46, + 0x0c, 0x36, 0x71, 0x5e, 0x59, 0x46, 0x0a, 0x36, + 0x71, 0x9e, 0x59, 0x45, 0x71, 0xdd, 0x31, 0x01, + 0x37, 0x01, 0x2f, 0x07, 0xdb, 0xe9, 0x00, 0x88, + 0x70, 0xd0, 0x1d, 0x01, 0x1c, 0x20, 0xf0, 0x01, + 0xf8, 0x8f, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, + 0x2e, 0x08, 0x7e, 0xa8, 0xb5, 0x80, 0x04, 0x00, + 0x0c, 0x00, 0x21, 0x9f, 0x4a, 0x07, 0x70, 0x11, + 0x21, 0x80, 0x70, 0x51, 0x21, 0x20, 0x70, 0x91, + 0x27, 0x00, 0x70, 0xd7, 0x21, 0x04, 0xf0, 0x01, + 0xf8, 0x77, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, + 0xb5, 0xf0, 0x04, 0x07, 0x0c, 0x3f, 0xb0, 0x82, + 0x1c, 0xc8, 0x1c, 0x0c, 0x46, 0x69, 0xf0, 0x00, + 0xfc, 0x8b, 0x1c, 0x01, 0x00, 0xf8, 0x4a, 0x25, + 0x18, 0x80, 0x88, 0xc2, 0x20, 0x00, 0x4f, 0x24, + 0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, 0x19, 0xdb, + 0x78, 0xdb, 0x42, 0x93, 0xd1, 0x07, 0x00, 0xc2, + 0x1a, 0x12, 0x00, 0x92, 0x5a, 0xba, 0x32, 0x01, + 0x4b, 0x1e, 0x70, 0x9a, 0xe0, 0x04, 0x30, 0x01, + 0x04, 0x00, 0x14, 0x00, 0x28, 0x08, 0xdb, 0xeb, + 0x18, 0x61, 0x91, 0x01, 0x7a, 0x09, 0x04, 0x0d, + 0x14, 0x2d, 0x00, 0xc6, 0x1a, 0x36, 0x00, 0xb6, + 0x5b, 0xb8, 0x01, 0x00, 0x4c, 0x16, 0x19, 0x00, + 0x68, 0x40, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, + 0xff, 0x07, 0x1c, 0x68, 0xf7, 0xff, 0xfe, 0xde, + 0x5b, 0xb9, 0x01, 0x09, 0x19, 0x09, 0x60, 0x48, + 0x28, 0x00, 0xd0, 0x0a, 0x99, 0x01, 0x31, 0x09, + 0x1c, 0x2a, 0xf0, 0x12, 0xfd, 0xf3, 0x21, 0x00, + 0x5b, 0xb8, 0x01, 0x00, 0x19, 0x00, 0x68, 0x40, + 0x55, 0x41, 0x20, 0x02, 0x5b, 0xb9, 0x01, 0x0a, + 0x54, 0xa0, 0x1c, 0x08, 0xf0, 0x01, 0xf9, 0xae, + 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7a, 0x60, + 0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x72, 0x60, + 0x2e, 0x08, 0x7e, 0x88, 0xb5, 0x80, 0x04, 0x00, + 0x0c, 0x00, 0x21, 0x9f, 0x4a, 0x07, 0x70, 0x11, + 0x21, 0x80, 0x70, 0x51, 0x21, 0x22, 0x70, 0x91, + 0x27, 0x00, 0x70, 0xd7, 0x21, 0x04, 0xf0, 0x01, + 0xf8, 0x03, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, + 0xb5, 0x90, 0x04, 0x04, 0x0c, 0x24, 0xb0, 0x81, + 0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, + 0xfc, 0x17, 0x18, 0x38, 0x78, 0xc0, 0x28, 0x00, + 0xd0, 0x0f, 0x23, 0x7d, 0x00, 0xdb, 0x43, 0x58, + 0x22, 0x03, 0x1c, 0x21, 0xf0, 0x01, 0xf8, 0x77, + 0x28, 0x00, 0xdd, 0x06, 0x00, 0x61, 0x4a, 0x07, + 0x18, 0x89, 0x31, 0xff, 0x31, 0xff, 0x31, 0x02, + 0x84, 0xc8, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x08, + 0x20, 0x00, 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7e, 0xa8, + 0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x21, 0x9f, + 0x4a, 0x0b, 0x70, 0x11, 0x21, 0x84, 0x70, 0x51, + 0x21, 0x41, 0x70, 0x91, 0x49, 0x09, 0x68, 0x09, + 0x0a, 0x0b, 0x70, 0xd3, 0x71, 0x11, 0x49, 0x08, + 0x68, 0x09, 0x0c, 0x0b, 0x71, 0x53, 0x0a, 0x0b, + 0x71, 0x93, 0x71, 0xd1, 0x21, 0x08, 0xf0, 0x00, + 0xff, 0xbb, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x1a, 0xd8, + 0x2e, 0x08, 0x1a, 0xd4, 0xb5, 0x80, 0x04, 0x00, + 0x0c, 0x00, 0x21, 0x9f, 0x4a, 0x07, 0x70, 0x11, + 0x21, 0x80, 0x70, 0x51, 0x21, 0x30, 0x70, 0x91, + 0x27, 0x00, 0x70, 0xd7, 0x21, 0x04, 0xf0, 0x00, + 0xff, 0xa3, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, + 0xb5, 0x90, 0x04, 0x07, 0x0c, 0x3f, 0xb0, 0x81, + 0x1c, 0xc8, 0x46, 0x69, 0xf0, 0x00, 0xfb, 0xb8, + 0x00, 0xf8, 0x49, 0x19, 0x18, 0x40, 0x88, 0xc2, + 0x20, 0x00, 0x49, 0x18, 0x00, 0xc3, 0x1a, 0x1b, + 0x00, 0x9b, 0x18, 0x5b, 0x78, 0xdb, 0x42, 0x93, + 0xd1, 0x07, 0x00, 0xc2, 0x1a, 0x12, 0x00, 0x92, + 0x5a, 0x89, 0x31, 0x01, 0x4a, 0x12, 0x70, 0x91, + 0xe0, 0x04, 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, + 0x28, 0x08, 0xdb, 0xeb, 0x01, 0x00, 0x49, 0x0f, + 0x18, 0x47, 0x68, 0xb8, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xff, 0xfe, 0x3e, 0x24, 0x00, 0x81, 0xbc, + 0xa8, 0x00, 0x88, 0x00, 0xf7, 0xff, 0xfe, 0x12, + 0x60, 0xb8, 0x28, 0x00, 0xd0, 0x03, 0xa8, 0x00, + 0x88, 0x00, 0x08, 0x40, 0x81, 0xb8, 0x1c, 0x20, + 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x7a, 0x60, 0x2e, 0x08, 0x56, 0xe0, + 0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x7e, 0x88, + 0xb5, 0x80, 0x04, 0x07, 0x0c, 0x3f, 0x04, 0x08, + 0x0c, 0x00, 0xf0, 0x02, 0xfc, 0xe9, 0x28, 0x00, + 0xd0, 0x0c, 0x68, 0x82, 0x2a, 0x00, 0xd0, 0x09, + 0x89, 0x81, 0x29, 0x00, 0xd0, 0x06, 0x1c, 0x38, + 0xf0, 0x00, 0xff, 0x46, 0x20, 0x01, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x47, 0x70, + 0xb5, 0x90, 0x04, 0x04, 0x0c, 0x24, 0xb0, 0x81, + 0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, + 0xfb, 0x57, 0x18, 0x3f, 0x78, 0xf8, 0x28, 0x00, + 0xd0, 0x0d, 0x28, 0x01, 0xd1, 0x16, 0x1c, 0x20, + 0xf0, 0x00, 0xfc, 0x16, 0x79, 0x38, 0x23, 0x7d, + 0x00, 0xdb, 0x43, 0x58, 0x22, 0x01, 0x1c, 0x21, + 0xf0, 0x00, 0xff, 0xb1, 0xe0, 0x08, 0x1c, 0x20, + 0xf0, 0x00, 0xfc, 0x0a, 0x21, 0x09, 0x48, 0x06, + 0x70, 0x01, 0x21, 0x20, 0xf7, 0xff, 0xfc, 0xec, + 0x20, 0x00, 0xe0, 0x01, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x72, 0x60, 0xb5, 0x90, 0x04, 0x04, + 0x0c, 0x24, 0xb0, 0x81, 0x1c, 0xc8, 0x1c, 0x0f, + 0x46, 0x69, 0xf0, 0x00, 0xfb, 0x29, 0x1c, 0x02, + 0x18, 0x38, 0x78, 0xc0, 0x28, 0x01, 0xd1, 0x04, + 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x00, 0xf8, 0x0a, + 0xe0, 0x03, 0x21, 0xf0, 0x1c, 0x20, 0xf0, 0x00, + 0xf8, 0x31, 0x20, 0x00, 0xb0, 0x01, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x04, 0x12, 0x14, 0x12, 0x18, 0x89, + 0x79, 0x0a, 0x2a, 0x00, 0xdd, 0x13, 0x2a, 0x03, + 0xdc, 0x11, 0x49, 0x0c, 0x70, 0x0a, 0x23, 0x9f, + 0x4a, 0x0b, 0x70, 0x13, 0x23, 0x88, 0x70, 0x53, + 0x23, 0x02, 0x70, 0x93, 0x70, 0xd3, 0x23, 0x01, + 0x71, 0x13, 0x78, 0x09, 0x71, 0x51, 0x21, 0x06, + 0xf0, 0x00, 0xfe, 0xd6, 0xe0, 0x02, 0x21, 0xf1, + 0xf0, 0x00, 0xf8, 0x0c, 0x20, 0x00, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x70, + 0x2e, 0x08, 0x72, 0x60, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0xb5, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x23, 0x9f, 0x4a, 0x07, 0x70, 0x13, + 0x23, 0x88, 0x70, 0x53, 0x23, 0x02, 0x70, 0x93, + 0x23, 0x01, 0x70, 0xd3, 0x71, 0x11, 0x21, 0x05, + 0xf0, 0x00, 0xfe, 0xb6, 0x20, 0x00, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, + 0xb5, 0xf3, 0xb0, 0x82, 0x4d, 0x1f, 0x78, 0x28, + 0x28, 0x0f, 0xd1, 0x2a, 0x99, 0x03, 0x1c, 0xc8, + 0xa9, 0x01, 0xf0, 0x00, 0xfa, 0xc9, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x00, 0x1d, 0xec, 0x34, 0xf9, + 0x88, 0xe1, 0xa8, 0x01, 0x88, 0x00, 0x18, 0x08, + 0x04, 0x06, 0x0c, 0x36, 0x68, 0xa0, 0x1c, 0x32, + 0xf7, 0xff, 0xfd, 0x41, 0x1c, 0x07, 0xd1, 0x01, + 0x43, 0xf8, 0xe0, 0x1d, 0x98, 0x00, 0x99, 0x03, + 0x18, 0x08, 0x1c, 0xc1, 0x88, 0xe0, 0x19, 0xc0, + 0xaa, 0x01, 0x88, 0x12, 0xf0, 0x12, 0xfc, 0x4e, + 0x1f, 0xb0, 0x04, 0x00, 0x0c, 0x00, 0x12, 0x01, + 0x71, 0x39, 0x71, 0x78, 0x1c, 0x38, 0xf7, 0xff, + 0xfd, 0x4b, 0x21, 0x04, 0x48, 0x08, 0x70, 0x01, + 0x27, 0x00, 0x70, 0x47, 0x70, 0x87, 0x21, 0x03, + 0xf7, 0xff, 0xfc, 0x4a, 0x70, 0x2f, 0x1c, 0x38, + 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x7c, + 0x2e, 0x08, 0x72, 0x60, 0xb5, 0xf0, 0xb0, 0x81, + 0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, + 0xfa, 0x87, 0x04, 0x05, 0x0c, 0x2d, 0x4e, 0x23, + 0x78, 0x30, 0x1d, 0xf4, 0x34, 0xf9, 0x28, 0x0f, + 0xd0, 0x23, 0xa8, 0x00, 0x88, 0x00, 0x30, 0x06, + 0xf7, 0xff, 0xfc, 0xfc, 0x60, 0xa0, 0x1c, 0x02, + 0xd0, 0x18, 0x19, 0x78, 0x1c, 0xc1, 0x1d, 0x90, + 0xaa, 0x00, 0x88, 0x12, 0xf0, 0x12, 0xfc, 0x12, + 0x20, 0x9f, 0x68, 0xa1, 0x70, 0x08, 0x20, 0x88, + 0x68, 0xa1, 0x70, 0x48, 0x20, 0x03, 0x68, 0xa1, + 0x70, 0x88, 0x20, 0x82, 0x68, 0xa1, 0x70, 0xc8, + 0x20, 0x0f, 0x70, 0x30, 0xa8, 0x00, 0x88, 0x00, + 0x30, 0x06, 0xe0, 0x18, 0x20, 0x00, 0x43, 0xc0, + 0xe0, 0x17, 0x88, 0xe1, 0xa8, 0x00, 0x88, 0x00, + 0x18, 0x0a, 0x68, 0xa0, 0xf7, 0xff, 0xfc, 0xdb, + 0x60, 0xa0, 0x28, 0x00, 0xd0, 0xf2, 0x88, 0xe1, + 0x18, 0x40, 0x19, 0x79, 0xaa, 0x00, 0x88, 0x12, + 0x31, 0x03, 0xf0, 0x12, 0xfb, 0xeb, 0x88, 0xe0, + 0xa9, 0x00, 0x88, 0x09, 0x18, 0x40, 0x80, 0xe0, + 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x7c, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0xb5, 0xf0, 0x1c, 0x0f, 0x04, 0x01, 0x0c, 0x09, + 0xb0, 0x81, 0x91, 0x00, 0xb0, 0x81, 0x46, 0x69, + 0x1c, 0xf8, 0xf0, 0x00, 0xfa, 0x2d, 0x1c, 0x02, + 0x18, 0x38, 0x78, 0xc1, 0x07, 0xc9, 0x0f, 0xc9, + 0x79, 0x04, 0x23, 0x05, 0x48, 0x16, 0x70, 0x03, + 0x70, 0x41, 0x70, 0x84, 0x21, 0x00, 0xab, 0x00, + 0x88, 0x1b, 0x3b, 0x02, 0x2b, 0x00, 0xdd, 0x09, + 0x18, 0x55, 0x19, 0xed, 0x79, 0x6d, 0x18, 0x46, + 0x70, 0xf5, 0x31, 0x01, 0x04, 0x09, 0x14, 0x09, + 0x42, 0x8b, 0xdc, 0xf5, 0x27, 0x00, 0xa9, 0x00, + 0x88, 0x09, 0x18, 0x41, 0x70, 0x4f, 0xa9, 0x00, + 0x88, 0x09, 0x31, 0x02, 0xf7, 0xff, 0xfb, 0xb8, + 0x23, 0x05, 0x48, 0x08, 0x70, 0x03, 0x21, 0x01, + 0x70, 0x41, 0x30, 0xff, 0x30, 0x01, 0x99, 0x01, + 0x80, 0x41, 0x80, 0x84, 0x80, 0xc7, 0x1c, 0x38, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x7d, 0x7c, + 0xb5, 0xb0, 0x21, 0x9f, 0x4f, 0x1e, 0x70, 0x39, + 0x21, 0x88, 0x70, 0x79, 0x21, 0x08, 0x70, 0xb9, + 0x1d, 0xc2, 0x32, 0xf9, 0x88, 0xd1, 0x18, 0x09, + 0x78, 0x4b, 0x21, 0x01, 0x24, 0x00, 0x2b, 0x0b, + 0xd1, 0x05, 0x70, 0xf9, 0x71, 0x3c, 0x88, 0x50, + 0x21, 0x05, 0x1c, 0x3a, 0xe0, 0x17, 0x23, 0x81, + 0x70, 0xfb, 0x88, 0xd3, 0x33, 0x01, 0x71, 0x3b, + 0x71, 0x79, 0x21, 0x00, 0x88, 0xd3, 0x2b, 0x00, + 0xdd, 0x09, 0x18, 0x43, 0x78, 0x9b, 0x18, 0x7d, + 0x71, 0xab, 0x31, 0x01, 0x04, 0x09, 0x14, 0x09, + 0x88, 0xd3, 0x42, 0x8b, 0xdc, 0xf5, 0x88, 0xd0, + 0x1d, 0x81, 0x88, 0x50, 0x1c, 0x3a, 0xf0, 0x00, + 0xfd, 0x9f, 0x22, 0x20, 0x21, 0x00, 0x1c, 0x38, + 0xf0, 0x12, 0xfc, 0x58, 0x20, 0x06, 0x70, 0x38, + 0x21, 0x20, 0x1c, 0x38, 0xf7, 0xff, 0xfb, 0x68, + 0x1c, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x72, 0x60, 0xb5, 0xf0, 0x1c, 0x0f, + 0x04, 0x01, 0x0c, 0x09, 0xb0, 0x83, 0x91, 0x00, + 0xb0, 0x84, 0x49, 0x2f, 0x91, 0x06, 0x78, 0x08, + 0x4e, 0x2e, 0x1c, 0xf1, 0x91, 0x05, 0x4d, 0x2e, + 0x28, 0x08, 0xd1, 0x34, 0x1c, 0xf8, 0xa9, 0x02, + 0xf0, 0x00, 0xf9, 0x9e, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x01, 0x88, 0xe9, 0xa8, 0x02, 0x88, 0x00, + 0x18, 0x08, 0x04, 0x02, 0x0c, 0x12, 0x92, 0x00, + 0x68, 0xa8, 0xf7, 0xff, 0xfc, 0x18, 0x1c, 0x04, + 0xd1, 0x02, 0x20, 0x00, 0x43, 0xc0, 0xe0, 0x3a, + 0x98, 0x01, 0x18, 0x38, 0x1c, 0xc1, 0x88, 0xe8, + 0x19, 0x00, 0xaa, 0x02, 0x88, 0x12, 0xf0, 0x12, + 0xfb, 0x25, 0x9a, 0x00, 0x1f, 0x90, 0x04, 0x00, + 0x0c, 0x00, 0x12, 0x01, 0x71, 0x21, 0x71, 0x60, + 0x98, 0x05, 0x1c, 0x21, 0xaa, 0x03, 0xf0, 0x00, + 0xf9, 0xcd, 0x1c, 0x07, 0xd5, 0x03, 0x1c, 0x20, + 0xf7, 0xff, 0xfc, 0x1a, 0xe7, 0xe1, 0x1c, 0x20, + 0xf7, 0xff, 0xfc, 0x16, 0xe0, 0x06, 0x98, 0x05, + 0x1c, 0x39, 0xaa, 0x03, 0xf0, 0x00, 0xf9, 0xbe, + 0x1c, 0x07, 0xd4, 0xd6, 0x24, 0x02, 0x70, 0x34, + 0x12, 0x38, 0x70, 0x70, 0x70, 0xb7, 0xa8, 0x03, + 0x88, 0x00, 0x1c, 0xc1, 0x1c, 0x30, 0xf7, 0xff, + 0xfb, 0x0b, 0x99, 0x06, 0x70, 0x0c, 0x20, 0x01, + 0x99, 0x06, 0x70, 0x48, 0x99, 0x04, 0x80, 0x69, + 0x80, 0xa8, 0x21, 0x00, 0x80, 0xe9, 0xb0, 0x07, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x7d, 0x7c, 0x2e, 0x08, 0x72, 0x60, + 0x2e, 0x08, 0x7e, 0x7c, 0xb5, 0xf0, 0xb0, 0x81, + 0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, + 0xf9, 0x3f, 0x04, 0x05, 0x0c, 0x2d, 0x4e, 0x23, + 0x78, 0x30, 0x1d, 0xf4, 0x34, 0xf9, 0x28, 0x08, + 0xd0, 0x23, 0xa8, 0x00, 0x88, 0x00, 0x30, 0x06, + 0xf7, 0xff, 0xfb, 0xb4, 0x60, 0xa0, 0x1c, 0x02, + 0xd0, 0x18, 0x19, 0x78, 0x1c, 0xc1, 0x1d, 0x90, + 0xaa, 0x00, 0x88, 0x12, 0xf0, 0x12, 0xfa, 0xca, + 0x20, 0x9f, 0x68, 0xa1, 0x70, 0x08, 0x20, 0x88, + 0x68, 0xa1, 0x70, 0x48, 0x20, 0x09, 0x68, 0xa1, + 0x70, 0x88, 0x20, 0x82, 0x68, 0xa1, 0x70, 0xc8, + 0x20, 0x08, 0x70, 0x30, 0xa8, 0x00, 0x88, 0x00, + 0x30, 0x06, 0xe0, 0x18, 0x20, 0x00, 0x43, 0xc0, + 0xe0, 0x17, 0x88, 0xe1, 0xa8, 0x00, 0x88, 0x00, + 0x18, 0x0a, 0x68, 0xa0, 0xf7, 0xff, 0xfb, 0x93, + 0x60, 0xa0, 0x28, 0x00, 0xd0, 0xf2, 0x88, 0xe1, + 0x18, 0x40, 0x19, 0x79, 0xaa, 0x00, 0x88, 0x12, + 0x31, 0x03, 0xf0, 0x12, 0xfa, 0xa3, 0x88, 0xe0, + 0xa9, 0x00, 0x88, 0x09, 0x18, 0x40, 0x80, 0xe0, + 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x7c, + 0xb5, 0x80, 0x04, 0x00, 0x0c, 0x00, 0x22, 0x9f, + 0x4f, 0x0d, 0x70, 0x3a, 0x22, 0x88, 0x70, 0x7a, + 0x22, 0x0b, 0x70, 0xba, 0x22, 0x01, 0x70, 0xfa, + 0x71, 0x39, 0x21, 0x05, 0x1c, 0x3a, 0xf0, 0x00, + 0xfc, 0xbf, 0x22, 0x20, 0x21, 0x00, 0x1c, 0x38, + 0xf0, 0x12, 0xfb, 0x78, 0x20, 0x06, 0x70, 0x38, + 0x21, 0x20, 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x88, + 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x72, 0x60, 0xb5, 0xf0, 0x1c, 0x0f, + 0x04, 0x01, 0x0c, 0x09, 0xb0, 0x83, 0x91, 0x00, + 0xb0, 0x84, 0x49, 0x2f, 0x91, 0x06, 0x78, 0x08, + 0x4e, 0x2e, 0x1c, 0xf1, 0x91, 0x05, 0x4d, 0x2e, + 0x28, 0x07, 0xd1, 0x34, 0x1c, 0xf8, 0xa9, 0x02, + 0xf0, 0x00, 0xf8, 0xbe, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x01, 0x88, 0xe9, 0xa8, 0x02, 0x88, 0x00, + 0x18, 0x08, 0x04, 0x02, 0x0c, 0x12, 0x92, 0x00, + 0x68, 0xa8, 0xf7, 0xff, 0xfb, 0x38, 0x1c, 0x04, + 0xd1, 0x02, 0x20, 0x00, 0x43, 0xc0, 0xe0, 0x3a, + 0x98, 0x01, 0x18, 0x38, 0x1c, 0xc1, 0x88, 0xe8, + 0x19, 0x00, 0xaa, 0x02, 0x88, 0x12, 0xf0, 0x12, + 0xfa, 0x45, 0x9a, 0x00, 0x1f, 0x90, 0x04, 0x00, + 0x0c, 0x00, 0x12, 0x01, 0x71, 0x21, 0x71, 0x60, + 0x98, 0x05, 0x1c, 0x21, 0xaa, 0x03, 0xf0, 0x00, + 0xf8, 0xed, 0x1c, 0x07, 0xd5, 0x03, 0x1c, 0x20, + 0xf7, 0xff, 0xfb, 0x3a, 0xe7, 0xe1, 0x1c, 0x20, + 0xf7, 0xff, 0xfb, 0x36, 0xe0, 0x06, 0x98, 0x05, + 0x1c, 0x39, 0xaa, 0x03, 0xf0, 0x00, 0xf8, 0xde, + 0x1c, 0x07, 0xd4, 0xd6, 0x24, 0x03, 0x70, 0x34, + 0x12, 0x38, 0x70, 0x70, 0x70, 0xb7, 0xa8, 0x03, + 0x88, 0x00, 0x19, 0x01, 0x1c, 0x30, 0xf7, 0xff, + 0xfa, 0x2b, 0x99, 0x06, 0x70, 0x0c, 0x20, 0x01, + 0x99, 0x06, 0x70, 0x48, 0x99, 0x04, 0x80, 0x69, + 0x80, 0xa8, 0x21, 0x00, 0x80, 0xe9, 0xb0, 0x07, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x7d, 0x7c, 0x2e, 0x08, 0x72, 0x60, + 0x2e, 0x08, 0x7e, 0x7c, 0xb5, 0xf0, 0xb0, 0x81, + 0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, + 0xf8, 0x5f, 0x04, 0x05, 0x0c, 0x2d, 0x4e, 0x23, + 0x78, 0x30, 0x1d, 0xf4, 0x34, 0xf9, 0x28, 0x07, + 0xd0, 0x23, 0xa8, 0x00, 0x88, 0x00, 0x30, 0x06, + 0xf7, 0xff, 0xfa, 0xd4, 0x60, 0xa0, 0x1c, 0x02, + 0xd0, 0x18, 0x19, 0x78, 0x1c, 0xc1, 0x1d, 0x90, + 0xaa, 0x00, 0x88, 0x12, 0xf0, 0x12, 0xf9, 0xea, + 0x20, 0x9f, 0x68, 0xa1, 0x70, 0x08, 0x20, 0x88, + 0x68, 0xa1, 0x70, 0x48, 0x20, 0x0c, 0x68, 0xa1, + 0x70, 0x88, 0x20, 0x82, 0x68, 0xa1, 0x70, 0xc8, + 0x20, 0x07, 0x70, 0x30, 0xa8, 0x00, 0x88, 0x00, + 0x30, 0x06, 0xe0, 0x18, 0x20, 0x00, 0x43, 0xc0, + 0xe0, 0x17, 0x88, 0xe1, 0xa8, 0x00, 0x88, 0x00, + 0x18, 0x0a, 0x68, 0xa0, 0xf7, 0xff, 0xfa, 0xb3, + 0x60, 0xa0, 0x28, 0x00, 0xd0, 0xf2, 0x88, 0xe1, + 0x18, 0x40, 0x19, 0x79, 0xaa, 0x00, 0x88, 0x12, + 0x31, 0x03, 0xf0, 0x12, 0xf9, 0xc3, 0x88, 0xe0, + 0xa9, 0x00, 0x88, 0x09, 0x18, 0x40, 0x80, 0xe0, + 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x7c, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0xb4, 0xb0, 0x24, 0x01, 0x22, 0x00, 0x78, 0x07, + 0x0a, 0x3b, 0xd3, 0x15, 0x23, 0x00, 0x06, 0x7c, + 0x0e, 0x64, 0x2c, 0x00, 0xdd, 0x0a, 0x02, 0x12, + 0x04, 0x12, 0x0c, 0x12, 0x18, 0xc5, 0x78, 0x6d, + 0x43, 0x2a, 0x04, 0x12, 0x0c, 0x12, 0x33, 0x01, + 0x42, 0x9c, 0xdc, 0xf4, 0x1c, 0x78, 0x06, 0x40, + 0x0e, 0x40, 0x04, 0x04, 0x14, 0x24, 0xe0, 0x01, + 0x06, 0x7a, 0x0e, 0x52, 0x80, 0x0a, 0x1c, 0x20, + 0xbc, 0xb0, 0x47, 0x70, 0xb5, 0xf0, 0x04, 0x16, + 0x0c, 0x36, 0x1c, 0x07, 0x78, 0x00, 0x04, 0x00, + 0x1c, 0x0c, 0x78, 0x79, 0x02, 0x09, 0x43, 0x08, + 0x78, 0xb9, 0x43, 0x08, 0xb0, 0x81, 0x4b, 0x12, + 0x42, 0x98, 0xd1, 0x09, 0x46, 0x69, 0x1c, 0xf8, + 0xf7, 0xff, 0xff, 0xca, 0x1c, 0x05, 0xa8, 0x00, + 0x88, 0x00, 0x30, 0x02, 0x42, 0xb0, 0xdd, 0x02, + 0x20, 0x00, 0x43, 0xc0, 0xe0, 0x10, 0x19, 0x78, + 0xaa, 0x00, 0x88, 0x12, 0x1c, 0xc1, 0x1c, 0x20, + 0xf0, 0x12, 0xf9, 0x5c, 0xa8, 0x00, 0x88, 0x00, + 0x18, 0x28, 0x30, 0x03, 0x04, 0x00, 0x14, 0x00, + 0x21, 0x00, 0xaa, 0x00, 0x88, 0x12, 0x54, 0xa1, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x9f, 0x88, 0x03, 0xb5, 0xf7, 0x1c, 0x07, + 0x20, 0x00, 0xb0, 0x85, 0x90, 0x02, 0x26, 0x00, + 0x99, 0x06, 0x1c, 0xc8, 0xa9, 0x04, 0xf7, 0xff, + 0xff, 0x9f, 0xa9, 0x04, 0x88, 0x09, 0x1c, 0x04, + 0x43, 0xf0, 0x02, 0xc3, 0x42, 0xd9, 0xd2, 0x58, + 0x21, 0x00, 0x91, 0x03, 0x4d, 0x2d, 0x99, 0x06, + 0x19, 0x08, 0x22, 0x01, 0x02, 0xd2, 0x30, 0x04, + 0x1c, 0x29, 0xf7, 0xff, 0xff, 0xaf, 0x90, 0x01, + 0x23, 0x01, 0x42, 0xd8, 0xd0, 0x1c, 0x1c, 0x28, + 0xf0, 0x12, 0xf9, 0x98, 0x90, 0x00, 0x1c, 0x42, + 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x12, 0xf9, 0x22, + 0x98, 0x00, 0x18, 0x38, 0x1c, 0x47, 0x98, 0x00, + 0x18, 0x30, 0x1c, 0x46, 0x98, 0x01, 0x18, 0x24, + 0x98, 0x03, 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x03, 0x28, 0x03, 0xdb, 0xdb, 0xa8, 0x04, + 0x88, 0x00, 0x42, 0x84, 0xda, 0x27, 0xe0, 0x02, + 0x20, 0x00, 0x43, 0xc0, 0xe0, 0x29, 0x99, 0x06, + 0x19, 0x08, 0x22, 0x01, 0x02, 0xd2, 0x30, 0x04, + 0x1c, 0x29, 0xf7, 0xff, 0xff, 0x83, 0x90, 0x01, + 0x23, 0x01, 0x42, 0xd8, 0xd0, 0xf0, 0x1c, 0x28, + 0xf0, 0x12, 0xf9, 0x6c, 0x90, 0x00, 0x1c, 0x42, + 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x12, 0xf8, 0xf6, + 0x98, 0x00, 0x18, 0x38, 0x1c, 0x47, 0x98, 0x00, + 0x18, 0x30, 0x1c, 0x46, 0x98, 0x01, 0x18, 0x24, + 0x98, 0x02, 0x30, 0x01, 0x90, 0x02, 0xa8, 0x04, + 0x88, 0x00, 0x42, 0x84, 0xdb, 0xdb, 0x9a, 0x07, + 0x80, 0x16, 0x98, 0x02, 0x30, 0x03, 0x04, 0x00, + 0x14, 0x00, 0xb0, 0x05, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x6a, 0x60, + 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0x54, + 0xb0, 0x84, 0xab, 0x00, 0x70, 0x18, 0x22, 0x46, + 0x70, 0x5a, 0x22, 0x04, 0x80, 0x5a, 0x80, 0x99, + 0x46, 0x69, 0xf7, 0xff, 0xf8, 0xf5, 0xb0, 0x04, + 0xbc, 0x08, 0x47, 0x18, 0x47, 0x70, 0x00, 0x00, + 0xb5, 0x00, 0x78, 0x01, 0x48, 0x0c, 0x70, 0x01, + 0x78, 0x00, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x02, + 0xd0, 0x01, 0x28, 0x03, 0xd1, 0x0b, 0x48, 0x09, + 0xca, 0x08, 0xc0, 0x08, 0xca, 0x08, 0xc0, 0x08, + 0xca, 0x0c, 0xc0, 0x0c, 0xf0, 0x00, 0xf8, 0x67, + 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0xa8, 0x2e, 0x08, 0x7b, 0x60, + 0xb5, 0x80, 0x20, 0x00, 0x27, 0x00, 0x4a, 0x1f, + 0x01, 0x03, 0x54, 0xd7, 0x18, 0x9b, 0x60, 0x5f, + 0x60, 0x9f, 0x81, 0x9f, 0x30, 0x01, 0x28, 0x02, + 0xdb, 0xf6, 0x48, 0x1b, 0x70, 0x07, 0x49, 0x1b, + 0x48, 0x1b, 0x60, 0x01, 0x49, 0x1b, 0x1d, 0xc2, + 0x32, 0x79, 0x60, 0x91, 0x49, 0x1a, 0x1d, 0xc2, + 0x32, 0xf9, 0x61, 0x11, 0x49, 0x19, 0x23, 0x05, + 0x01, 0xdb, 0x18, 0xc2, 0x23, 0x03, 0x02, 0x1b, + 0x62, 0x91, 0x18, 0xc1, 0x63, 0x0f, 0x49, 0x16, + 0x1d, 0xc2, 0x32, 0xff, 0x32, 0xfa, 0x30, 0xff, + 0x30, 0x81, 0x62, 0x11, 0x61, 0x87, 0x20, 0x05, + 0xf7, 0xff, 0xf9, 0x94, 0x28, 0x00, 0xda, 0x03, + 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0x49, 0x0e, 0x00, 0xc2, 0x52, 0x8f, + 0x30, 0x01, 0x28, 0x40, 0xdb, 0xfa, 0x48, 0x0c, + 0x70, 0x47, 0x20, 0x01, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7e, 0x88, + 0x2e, 0x08, 0x1a, 0xa8, 0x00, 0x01, 0x00, 0x41, + 0x2e, 0x08, 0x7e, 0xa8, 0x00, 0x02, 0x00, 0x41, + 0x00, 0x03, 0x00, 0x41, 0x00, 0x40, 0x00, 0x41, + 0x00, 0x24, 0x00, 0x41, 0x2e, 0x08, 0x7b, 0x70, + 0x2e, 0x08, 0x7d, 0x7c, 0xb5, 0x00, 0xf7, 0xff, + 0xf8, 0x25, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, + 0xb0, 0x83, 0x48, 0xda, 0x90, 0x02, 0x78, 0x00, + 0x21, 0x00, 0x4a, 0xd9, 0x4c, 0xd9, 0x4f, 0xda, + 0x28, 0x01, 0xd1, 0x71, 0x78, 0x78, 0x38, 0x41, + 0x4d, 0xd8, 0x4e, 0xd9, 0x4b, 0xd9, 0x93, 0x01, + 0x28, 0x0b, 0xd2, 0x6a, 0xa3, 0x01, 0x5c, 0x1b, + 0x00, 0x5b, 0x44, 0x9f, 0xc9, 0x8e, 0xc9, 0xde, + 0xdd, 0xc9, 0x67, 0xc9, 0x3b, 0x2b, 0x05, 0x00, + 0x88, 0xb8, 0x06, 0x00, 0x0e, 0x00, 0x01, 0x00, + 0x9b, 0x01, 0x54, 0x19, 0x9b, 0x01, 0x18, 0xc0, + 0x68, 0x40, 0x1c, 0x0c, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xff, 0xf9, 0x26, 0x88, 0xb8, 0x06, 0x00, + 0x0e, 0x00, 0x01, 0x00, 0x9b, 0x01, 0x18, 0xc0, + 0x60, 0x44, 0x68, 0x80, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xff, 0xf9, 0x1a, 0x88, 0xb8, 0x06, 0x00, + 0x0e, 0x00, 0x01, 0x01, 0x9b, 0x01, 0x18, 0xc9, + 0x22, 0x01, 0x60, 0x8c, 0x70, 0x32, 0x70, 0x74, + 0x18, 0x80, 0xe0, 0x09, 0x20, 0x01, 0x88, 0xb9, + 0x06, 0x09, 0x0e, 0x09, 0x01, 0x0a, 0x9b, 0x01, + 0x54, 0x98, 0x70, 0x30, 0x70, 0x70, 0x18, 0x08, + 0x70, 0xb0, 0x21, 0x20, 0x1c, 0x30, 0xf7, 0xff, + 0xf8, 0x07, 0xe0, 0x8d, 0x26, 0x00, 0x00, 0xf1, + 0x19, 0x08, 0x88, 0xc2, 0x79, 0x3b, 0x42, 0x9a, + 0xd1, 0x1e, 0x22, 0x00, 0x80, 0xc2, 0x58, 0x60, + 0xf0, 0x00, 0xfa, 0x86, 0x23, 0x01, 0x42, 0xd8, + 0xd0, 0x16, 0x01, 0x01, 0x18, 0x09, 0x00, 0xc9, + 0x19, 0x49, 0x88, 0x8a, 0x2a, 0x00, 0xd0, 0x01, + 0x3a, 0x01, 0x80, 0x8a, 0x28, 0x04, 0xd1, 0x0b, + 0x00, 0x70, 0x19, 0x40, 0x30, 0xff, 0x30, 0xff, + 0x30, 0x02, 0x90, 0x00, 0x8c, 0xc0, 0xf0, 0x00, + 0xfa, 0xcb, 0x22, 0x00, 0x98, 0x00, 0x84, 0xc2, + 0x36, 0x01, 0x2e, 0x20, 0xdb, 0xd7, 0xe0, 0x63, + 0xe0, 0x9c, 0xe0, 0x74, 0x88, 0xb8, 0x00, 0xc0, + 0x1c, 0x0e, 0x19, 0x01, 0x80, 0xce, 0x58, 0x20, + 0xf0, 0x00, 0xfa, 0x5e, 0x23, 0x01, 0x42, 0xd8, + 0xd0, 0x56, 0x01, 0x01, 0x18, 0x09, 0x00, 0xc9, + 0x19, 0x49, 0x88, 0x8a, 0x2a, 0x00, 0xd0, 0x01, + 0x3a, 0x01, 0x80, 0x8a, 0x28, 0x04, 0xd1, 0x5e, + 0x88, 0xb8, 0x00, 0x40, 0x19, 0x40, 0x30, 0xff, + 0x30, 0xff, 0x30, 0x02, 0x8c, 0xc0, 0xf0, 0x00, + 0xfa, 0xa3, 0x88, 0xb8, 0x00, 0x40, 0x19, 0x40, + 0x30, 0xff, 0x30, 0xff, 0x30, 0x02, 0x84, 0xc6, + 0xe0, 0xb6, 0x7a, 0x38, 0x06, 0x00, 0x7a, 0x79, + 0x04, 0x09, 0x43, 0x08, 0x7a, 0xb9, 0x02, 0x09, + 0x43, 0x08, 0x7a, 0xf9, 0x43, 0x08, 0x4b, 0x8a, + 0x42, 0x98, 0xd0, 0x43, 0xdc, 0x0d, 0x49, 0x89, + 0x42, 0x88, 0xd0, 0x19, 0x42, 0x90, 0xd0, 0x1b, + 0x49, 0x87, 0x42, 0x88, 0xd1, 0x3a, 0x1d, 0xe8, + 0x30, 0xf9, 0x8a, 0x82, 0x32, 0x01, 0x82, 0x82, + 0xe0, 0x28, 0x49, 0x84, 0x42, 0x88, 0xd0, 0x1f, + 0x49, 0x83, 0x42, 0x88, 0xd1, 0x2e, 0x23, 0x05, + 0x01, 0xdb, 0x18, 0xe8, 0x8d, 0x82, 0x2a, 0x00, + 0xd1, 0x13, 0x22, 0x01, 0x85, 0x82, 0xe0, 0x19, + 0x88, 0xa8, 0x30, 0x01, 0x80, 0xa8, 0xe0, 0x15, + 0x1d, 0xe8, 0x30, 0x79, 0x89, 0x81, 0x31, 0x01, + 0x81, 0x81, 0x88, 0xf9, 0x00, 0xc8, 0x50, 0x22, + 0x79, 0x3a, 0x19, 0x00, 0x80, 0xc2, 0xe0, 0x10, + 0xe0, 0x7b, 0x88, 0xf9, 0x22, 0xf3, 0xe0, 0x13, + 0x1d, 0xe8, 0x30, 0xff, 0x30, 0xfa, 0x8c, 0x82, + 0x32, 0x01, 0x84, 0x82, 0x88, 0xfa, 0x00, 0xd0, + 0x50, 0x21, 0x79, 0x39, 0x19, 0x00, 0x80, 0xc1, + 0x1c, 0x11, 0x22, 0x00, 0xe0, 0x04, 0xe0, 0xbd, + 0xe0, 0x1b, 0xe0, 0x05, 0x88, 0xf9, 0x22, 0xf0, + 0x20, 0x00, 0xf0, 0x00, 0xf9, 0xc1, 0xe0, 0x5f, + 0x88, 0xb8, 0x00, 0xc1, 0x58, 0x61, 0x4b, 0x64, + 0x42, 0x99, 0xd0, 0x0b, 0xdc, 0x58, 0x4b, 0x61, + 0x42, 0x99, 0xd0, 0x04, 0x42, 0x91, 0xd1, 0x54, + 0xf7, 0xff, 0xf8, 0xf4, 0xe0, 0xa6, 0xf7, 0xff, + 0xf8, 0x8b, 0xe0, 0xa3, 0xf7, 0xff, 0xf9, 0xc2, + 0xe0, 0xa0, 0x68, 0xb9, 0x98, 0x02, 0x60, 0x41, + 0x88, 0xb8, 0xf0, 0x00, 0xf8, 0xbd, 0x98, 0x02, + 0x68, 0x40, 0xe0, 0x8f, 0x28, 0x03, 0xd1, 0x50, + 0x68, 0x78, 0x88, 0x3b, 0x06, 0x1e, 0x0e, 0x36, + 0x1c, 0x05, 0x2e, 0x06, 0xd0, 0x3f, 0xdc, 0x08, + 0x2e, 0x06, 0xd2, 0x58, 0xa3, 0x01, 0x5d, 0x9b, + 0x00, 0x5b, 0x44, 0x9f, 0x5b, 0x55, 0x3c, 0x12, + 0x61, 0x4d, 0x2e, 0x0a, 0xd0, 0x3e, 0xdc, 0x05, + 0x2e, 0x08, 0xd0, 0x36, 0x2e, 0x09, 0xd1, 0x57, + 0x26, 0x00, 0xe0, 0x56, 0x2e, 0x0b, 0xd0, 0x66, + 0x2e, 0xe0, 0xd1, 0x51, 0x48, 0x49, 0x70, 0x01, + 0xe0, 0x69, 0x49, 0x49, 0x78, 0x4a, 0x2a, 0x01, + 0xd1, 0x4a, 0x78, 0x03, 0x1d, 0xca, 0x32, 0xf9, + 0x88, 0xd7, 0x18, 0x7f, 0x70, 0xbb, 0x88, 0xd3, + 0x33, 0x01, 0x80, 0xd3, 0x88, 0xd3, 0x88, 0x97, + 0x42, 0xbb, 0xd0, 0x02, 0x78, 0x00, 0x28, 0x0b, + 0xd1, 0x3a, 0x78, 0x08, 0x28, 0x02, 0xd0, 0x09, + 0x28, 0x03, 0xd0, 0x07, 0x28, 0x05, 0xd1, 0x33, + 0x1c, 0x08, 0xf7, 0xff, 0xfb, 0x59, 0xe0, 0x4a, + 0xe0, 0x54, 0xe0, 0x53, 0x78, 0x89, 0x88, 0x50, + 0xf7, 0xff, 0xfc, 0x52, 0xe0, 0x43, 0x78, 0xb9, + 0xf0, 0x00, 0xff, 0x52, 0xe0, 0x3f, 0x20, 0x00, + 0xe0, 0x0b, 0x78, 0xb9, 0xf0, 0x00, 0xfa, 0x2a, + 0xe0, 0x39, 0xe0, 0x3e, 0x78, 0x01, 0x02, 0x09, + 0x78, 0x40, 0x43, 0x08, 0x49, 0x2f, 0x81, 0x48, + 0x20, 0x08, 0xf0, 0x00, 0xfe, 0xeb, 0xe0, 0x2e, + 0x78, 0x01, 0x02, 0x09, 0x78, 0x40, 0x43, 0x08, + 0xf0, 0x00, 0xfa, 0x45, 0xe0, 0x27, 0xe0, 0x26, + 0x78, 0xba, 0x1c, 0x01, 0x78, 0x00, 0xf0, 0x00, + 0xfa, 0x13, 0xe0, 0x20, 0x78, 0xba, 0x1c, 0x01, + 0x78, 0x00, 0xf0, 0x00, 0xfa, 0x22, 0xe0, 0x1a, + 0xe0, 0x19, 0x00, 0xf0, 0x58, 0x21, 0x4b, 0x14, + 0x42, 0x99, 0xd1, 0x0d, 0x19, 0x00, 0x88, 0xc0, + 0xf7, 0xfd, 0xfd, 0x9a, 0x68, 0x79, 0x78, 0x09, + 0x30, 0x01, 0x42, 0x88, 0xd1, 0x04, 0x1c, 0x30, + 0xf7, 0xff, 0xf8, 0xd4, 0xe0, 0x07, 0xe0, 0x03, + 0x36, 0x01, 0x2e, 0x20, 0xdb, 0xe9, 0xe0, 0x02, + 0x20, 0xff, 0xf0, 0x00, 0xfa, 0x6b, 0x2d, 0x00, + 0xd0, 0x08, 0x1c, 0x28, 0xf7, 0xfe, 0xff, 0xa4, + 0xe0, 0x04, 0x28, 0x02, 0xd1, 0x02, 0x88, 0x38, + 0xf0, 0x00, 0xf9, 0xac, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0xa8, + 0x00, 0x02, 0x00, 0x41, 0x2e, 0x08, 0x7a, 0x60, + 0x2e, 0x08, 0x7b, 0x60, 0x2e, 0x08, 0x7e, 0xa8, + 0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x7e, 0x88, + 0x00, 0x20, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, + 0x00, 0x03, 0x00, 0x41, 0x00, 0x24, 0x00, 0x41, + 0x00, 0x40, 0x00, 0x41, 0x2e, 0x08, 0x1a, 0x94, + 0x2e, 0x08, 0x7d, 0x7c, 0x2e, 0x08, 0x8f, 0x80, + 0xb5, 0x90, 0x04, 0x04, 0x0c, 0x24, 0x78, 0x08, + 0x04, 0x00, 0x1c, 0x0f, 0x78, 0x49, 0x02, 0x09, + 0x43, 0x08, 0x78, 0xb9, 0x43, 0x08, 0x4b, 0x47, + 0x42, 0x98, 0xd0, 0x5d, 0xdc, 0x20, 0x4b, 0x46, + 0x42, 0x98, 0xd0, 0x5a, 0xdc, 0x0f, 0x4b, 0x45, + 0x42, 0x98, 0xd0, 0x41, 0x33, 0x01, 0x42, 0x98, + 0xd0, 0x37, 0x4b, 0x43, 0x42, 0x98, 0xd1, 0x5f, + 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 0xf8, 0x20, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x4b, 0x3f, + 0x42, 0x98, 0xd0, 0x3e, 0x4b, 0x3e, 0x42, 0x98, + 0xd1, 0x52, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, + 0xf8, 0x87, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x4b, 0x3a, 0x42, 0x98, 0xd0, 0x50, 0xdc, 0x0f, + 0x4b, 0x39, 0x42, 0x98, 0xd0, 0x3d, 0x33, 0x06, + 0x42, 0x98, 0xd0, 0x42, 0x4b, 0x37, 0x42, 0x98, + 0xd1, 0x3e, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, + 0xfa, 0xe1, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x4b, 0x33, 0x42, 0x98, 0xd0, 0x16, 0x33, 0x01, + 0x42, 0x98, 0xd1, 0x31, 0x1c, 0x20, 0x1c, 0x39, + 0xf7, 0xff, 0xfc, 0x20, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xfe, + 0xff, 0x85, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x20, 0xf7, 0xfe, 0xff, 0x9d, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x20, 0x1c, 0x39, + 0xf7, 0xff, 0xfb, 0xa0, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, + 0xf9, 0x09, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xe0, 0x00, 0xe0, 0x1c, 0x1c, 0x20, 0x1c, 0x39, + 0xf7, 0xff, 0xf9, 0x02, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, + 0xf9, 0x29, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xe0, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, + 0xfa, 0x1b, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 0xfb, 0x06, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x11, + 0x89, 0x40, 0xf0, 0x00, 0xf9, 0x60, 0x1c, 0x20, + 0x1c, 0x39, 0xf7, 0xff, 0xf8, 0x81, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x9f, 0x88, 0x00, + 0x00, 0x9f, 0x80, 0x31, 0x00, 0x9f, 0x80, 0x10, + 0x00, 0x9f, 0x80, 0x21, 0x00, 0x9f, 0x80, 0x33, + 0x00, 0x9f, 0x84, 0x40, 0x00, 0x9f, 0x88, 0x0a, + 0x00, 0x9f, 0x88, 0x01, 0x00, 0x9f, 0x88, 0x09, + 0x00, 0x9f, 0x88, 0x0c, 0x2e, 0x08, 0x8f, 0x80, + 0xb5, 0xf0, 0x04, 0x06, 0x0c, 0x36, 0x04, 0x0d, + 0x0c, 0x2d, 0x1c, 0x28, 0x1c, 0x17, 0xf7, 0xfe, + 0xfe, 0x9d, 0x4c, 0x0d, 0x60, 0xa0, 0x28, 0x00, + 0xd1, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x54, 0x70, 0x21, 0x21, 0x45, 0x70, 0x61, + 0x21, 0x0c, 0x80, 0x61, 0x80, 0xa6, 0x81, 0xa5, + 0x1c, 0x39, 0x1c, 0x2a, 0xf0, 0x11, 0xfd, 0xaa, + 0x78, 0x20, 0x1c, 0x21, 0xf7, 0xfe, 0xfd, 0xd0, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x7b, 0x60, 0xb5, 0x00, 0x06, 0x02, + 0x0e, 0x12, 0x20, 0x54, 0x49, 0x05, 0x70, 0x08, + 0x23, 0x48, 0x70, 0x4b, 0x23, 0x04, 0x80, 0x4b, + 0x71, 0x0a, 0xf7, 0xfe, 0xfd, 0xbd, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7b, 0x60, + 0xb5, 0x90, 0x04, 0x0b, 0x0c, 0x1b, 0x27, 0x54, + 0x49, 0x07, 0x70, 0x0f, 0x24, 0x43, 0x70, 0x4c, + 0x24, 0x04, 0x80, 0x4c, 0x71, 0xc8, 0x80, 0x8b, + 0x71, 0x8a, 0x1c, 0x38, 0xf7, 0xfe, 0xfd, 0xa8, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x7b, 0x60, 0xb5, 0x00, 0x04, 0x02, + 0x0c, 0x12, 0x20, 0x54, 0x49, 0x05, 0x70, 0x08, + 0x23, 0x46, 0x70, 0x4b, 0x23, 0x04, 0x80, 0x4b, + 0x80, 0x8a, 0xf7, 0xfe, 0xfd, 0x95, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7b, 0x60, + 0x23, 0xff, 0x04, 0x1b, 0x40, 0x18, 0x23, 0x01, + 0x05, 0x5b, 0x42, 0x98, 0xd0, 0x1e, 0xdc, 0x0b, + 0x09, 0x5b, 0x42, 0x98, 0xd0, 0x16, 0x00, 0x5b, + 0x42, 0x98, 0xd0, 0x15, 0x23, 0x03, 0x04, 0x1b, + 0x42, 0x98, 0xd1, 0x19, 0x20, 0x02, 0x47, 0x70, + 0x23, 0x09, 0x04, 0x9b, 0x42, 0x98, 0xd0, 0x0f, + 0x23, 0x01, 0x05, 0x9b, 0x42, 0x98, 0xd0, 0x0d, + 0x23, 0x03, 0x05, 0x5b, 0x42, 0x98, 0xd1, 0x0b, + 0x20, 0x06, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x01, 0x47, 0x70, 0x20, 0x03, 0x47, 0x70, + 0x20, 0x04, 0x47, 0x70, 0x20, 0x05, 0x47, 0x70, + 0x20, 0x00, 0x43, 0xc0, 0x47, 0x70, 0xb5, 0xb0, + 0x04, 0x07, 0x0c, 0x3f, 0x04, 0x0b, 0x0c, 0x1b, + 0x04, 0x14, 0x0c, 0x24, 0x22, 0x00, 0x20, 0x00, + 0x49, 0x10, 0x00, 0xc5, 0x5b, 0x4d, 0x2d, 0x00, + 0xd1, 0x08, 0x1c, 0x42, 0x04, 0x12, 0x0c, 0x12, + 0x00, 0xc0, 0x52, 0x0a, 0x18, 0x40, 0x80, 0x84, + 0x80, 0x43, 0xe0, 0x02, 0x30, 0x01, 0x28, 0x40, + 0xdd, 0xef, 0x2a, 0x00, 0xd0, 0x0a, 0x20, 0x05, + 0x04, 0x00, 0x43, 0x10, 0x1c, 0x39, 0xf7, 0xfe, + 0xfd, 0xa9, 0x04, 0x00, 0x0c, 0x00, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x7b, 0x70, + 0xb5, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, + 0x49, 0x0b, 0x00, 0xc3, 0x5a, 0xcb, 0x42, 0x93, + 0xd1, 0x09, 0x27, 0x00, 0x00, 0xc0, 0x52, 0x0f, + 0x1c, 0x10, 0xf7, 0xfe, 0xfd, 0xc7, 0x1c, 0x38, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x30, 0x01, + 0x28, 0x40, 0xdb, 0xee, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x7b, 0x70, 0xb5, 0xf0, 0x04, 0x06, + 0x0c, 0x36, 0x27, 0x00, 0x4c, 0x17, 0x00, 0xf8, + 0x5a, 0x20, 0x42, 0xb0, 0xd1, 0x1d, 0x00, 0xfd, + 0x19, 0x28, 0x88, 0x81, 0x29, 0x05, 0xd2, 0x10, + 0xa3, 0x01, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, + 0x17, 0x02, 0x09, 0x10, 0x17, 0x00, 0x21, 0x09, + 0x48, 0x0f, 0x70, 0x01, 0x21, 0x20, 0xf7, 0xfe, + 0xfc, 0xdf, 0xe0, 0x02, 0x88, 0x40, 0xf0, 0x01, + 0xfc, 0xf9, 0x5b, 0x60, 0xf7, 0xff, 0xff, 0xc0, + 0xe0, 0x06, 0x88, 0x40, 0xf7, 0xfe, 0xff, 0x2c, + 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x40, 0xdb, 0xda, + 0x2f, 0x40, 0xd1, 0x02, 0x1c, 0x30, 0xf7, 0xfe, + 0xfd, 0x89, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7b, 0x70, + 0x2e, 0x08, 0x72, 0x60, 0x20, 0x00, 0x47, 0x70, + 0xb5, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x05, + 0xd0, 0x0c, 0x28, 0x0a, 0xd0, 0x05, 0x28, 0x0b, + 0xd1, 0x08, 0x78, 0x48, 0x22, 0x10, 0x21, 0x0b, + 0xe0, 0x02, 0x78, 0x48, 0x22, 0x10, 0x21, 0x0a, + 0xf0, 0x01, 0xfc, 0x90, 0x20, 0x00, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x00, 0x06, 0x00, 0x0e, 0x00, + 0x28, 0x05, 0xd0, 0x06, 0x28, 0x0a, 0xd0, 0x07, + 0x28, 0x0b, 0xd1, 0x02, 0x78, 0x88, 0xf0, 0x01, + 0xfb, 0xaf, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, + 0x78, 0x48, 0x28, 0x01, 0xd0, 0xf9, 0x78, 0x88, + 0xf0, 0x01, 0xfb, 0xa4, 0xe7, 0xf5, 0xb5, 0xf0, + 0x4d, 0x22, 0x81, 0x68, 0x27, 0x00, 0x06, 0x38, + 0x0e, 0x00, 0xf0, 0x01, 0xfb, 0xc5, 0x28, 0x4e, + 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x01, 0xfb, 0x6c, + 0x1c, 0x78, 0x04, 0x07, 0x14, 0x3f, 0x2f, 0x14, + 0xdb, 0xf1, 0x89, 0x68, 0xf0, 0x01, 0xfc, 0xda, + 0x89, 0x68, 0xf0, 0x01, 0xfc, 0x41, 0x21, 0x0e, + 0x4f, 0x17, 0x28, 0x00, 0xd1, 0x02, 0x70, 0x39, + 0x20, 0x04, 0xe0, 0x1e, 0x20, 0x00, 0x24, 0x00, + 0x4e, 0x14, 0x00, 0xe1, 0x58, 0x71, 0x4b, 0x14, + 0x42, 0x99, 0xd1, 0x0e, 0x89, 0x69, 0x1c, 0x20, + 0xf7, 0xfe, 0xff, 0x3e, 0x28, 0x00, 0xd0, 0x07, + 0x21, 0x0e, 0x70, 0x39, 0x20, 0x00, 0x70, 0x78, + 0x21, 0x06, 0x1c, 0x38, 0xf7, 0xfe, 0xfc, 0x60, + 0x20, 0x01, 0x34, 0x01, 0x2c, 0x20, 0xdb, 0xe8, + 0x28, 0x00, 0xd1, 0x07, 0x21, 0x0e, 0x70, 0x39, + 0x20, 0x05, 0x70, 0x78, 0x21, 0x06, 0x1c, 0x38, + 0xf7, 0xfe, 0xfc, 0x52, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x80, + 0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x7a, 0x60, + 0x00, 0x03, 0x00, 0x41, 0xb5, 0xf0, 0x06, 0x00, + 0x0e, 0x00, 0x21, 0x00, 0xb0, 0x85, 0x91, 0x02, + 0x22, 0x02, 0x92, 0x01, 0x28, 0xff, 0xd0, 0x02, + 0x22, 0x01, 0x92, 0x01, 0x1c, 0x01, 0x9a, 0x01, + 0x2a, 0x00, 0xdd, 0x4d, 0x4a, 0x28, 0x92, 0x04, + 0x4f, 0x28, 0x20, 0x01, 0x70, 0x38, 0x01, 0x08, + 0x9a, 0x04, 0x5c, 0x12, 0x70, 0x7a, 0x31, 0x01, + 0x91, 0x03, 0x70, 0xb9, 0x21, 0x00, 0x91, 0x00, + 0x9a, 0x04, 0x18, 0x84, 0x89, 0xa0, 0x28, 0x00, + 0xd0, 0x16, 0x68, 0xa3, 0x2b, 0x00, 0xd0, 0x13, + 0x70, 0xf8, 0x28, 0x00, 0xdd, 0x0b, 0x00, 0x4a, + 0x5a, 0x9d, 0x0a, 0x2e, 0x19, 0xd5, 0x71, 0x2e, + 0x5a, 0x9a, 0x71, 0x6a, 0x31, 0x01, 0x06, 0x09, + 0x0e, 0x09, 0x42, 0x88, 0xdc, 0xf3, 0x00, 0x40, + 0x99, 0x00, 0x18, 0x40, 0x1c, 0x45, 0xe0, 0x02, + 0x20, 0x00, 0x70, 0xf8, 0x25, 0x01, 0x68, 0x60, + 0x28, 0x00, 0xd0, 0x0e, 0xf0, 0x11, 0xfc, 0x66, + 0x1c, 0x02, 0x19, 0x78, 0x68, 0x61, 0x30, 0x03, + 0xf0, 0x11, 0xfb, 0xf0, 0x68, 0x60, 0xf0, 0x11, + 0xfc, 0x5d, 0x19, 0x45, 0x20, 0x00, 0x19, 0x79, + 0x70, 0xc8, 0x1c, 0x38, 0x1d, 0x69, 0xf7, 0xfe, + 0xfb, 0xf3, 0x99, 0x03, 0x06, 0x09, 0x0e, 0x09, + 0x98, 0x02, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x02, 0x9a, 0x01, 0x42, 0x90, 0xdb, 0xb4, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x7e, 0x88, 0x2e, 0x08, 0x72, 0x60, + 0xb5, 0x80, 0x20, 0x00, 0x22, 0x00, 0x1c, 0x0f, + 0x49, 0x0a, 0x54, 0x0a, 0x30, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x28, 0x02, 0xdb, 0xf9, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0xc6, 0x28, 0x01, 0xd1, 0x03, + 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xb8, + 0xb5, 0xf0, 0x04, 0x0c, 0x0c, 0x24, 0x1c, 0x17, + 0xf0, 0x00, 0xf8, 0x8e, 0x4d, 0x0d, 0x69, 0x28, + 0x4b, 0x0d, 0x18, 0xc6, 0x20, 0x04, 0xf0, 0x00, + 0xf9, 0x65, 0x20, 0x00, 0x2c, 0x00, 0xdd, 0x0c, + 0x5c, 0x39, 0x80, 0x31, 0x23, 0x03, 0x07, 0x1b, + 0x69, 0x29, 0x18, 0xc9, 0x88, 0x09, 0x54, 0x39, + 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x42, 0xa0, + 0xdb, 0xf2, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xb0, + 0x30, 0x00, 0x40, 0x00, 0xb5, 0xf0, 0x1c, 0x0c, + 0x1c, 0x17, 0xb0, 0x83, 0xf0, 0x00, 0xf8, 0x68, + 0x4e, 0x13, 0x69, 0x30, 0x4b, 0x13, 0x18, 0xc5, + 0x20, 0x04, 0xf0, 0x00, 0xf9, 0x3f, 0x23, 0x03, + 0x07, 0x1b, 0x69, 0x30, 0x18, 0xc1, 0x20, 0x00, + 0x2c, 0x00, 0xdd, 0x0a, 0x88, 0x2a, 0x54, 0x3a, + 0x88, 0x0a, 0x54, 0x3a, 0x88, 0x0a, 0x54, 0x3a, + 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x42, 0xa0, + 0xdb, 0xf4, 0x46, 0x68, 0x90, 0x02, 0x20, 0x01, + 0xab, 0x01, 0x80, 0x18, 0x21, 0x04, 0xa8, 0x01, + 0xf0, 0x00, 0xf8, 0x9e, 0x1c, 0x20, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0xb0, 0x30, 0x00, 0x40, 0x00, + 0xb5, 0xb0, 0x25, 0x01, 0x1c, 0x0c, 0x1c, 0x17, + 0xf0, 0x00, 0xf8, 0x36, 0x48, 0x18, 0x2c, 0x08, + 0xd2, 0x2a, 0xa3, 0x02, 0x5d, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x26, 0x04, 0x06, 0x0c, + 0x12, 0x18, 0x1e, 0x23, 0x25, 0x00, 0xe0, 0x1f, + 0x61, 0x47, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, + 0xf8, 0x31, 0xe0, 0x14, 0x61, 0x47, 0x1c, 0x38, + 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x53, 0xe0, 0x0e, + 0x61, 0x87, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, + 0xf8, 0x6f, 0xe0, 0x08, 0x61, 0x87, 0x1c, 0x38, + 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x93, 0xe0, 0x02, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xb1, 0x1c, 0x05, + 0xe0, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0x14, + 0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0xb0, 0x20, 0x00, 0x47, 0x70, + 0x49, 0x05, 0x68, 0xca, 0x42, 0x90, 0xd0, 0x06, + 0x60, 0xc8, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0x01, + 0x20, 0x01, 0x03, 0x40, 0x61, 0x08, 0x47, 0x70, + 0x2e, 0x08, 0x1a, 0xb0, 0xb5, 0xb0, 0x1c, 0x07, + 0x88, 0x00, 0x4a, 0x10, 0x43, 0x02, 0x48, 0x10, + 0x69, 0x00, 0x43, 0x02, 0x25, 0x03, 0x07, 0x2d, + 0x43, 0x05, 0x1c, 0x08, 0x1c, 0x14, 0xf0, 0x00, + 0xf8, 0xc1, 0x20, 0x00, 0x88, 0x79, 0x29, 0x00, + 0xdd, 0x0a, 0x88, 0x21, 0x68, 0x7a, 0x54, 0x11, + 0x88, 0x29, 0x68, 0x7a, 0x54, 0x11, 0x88, 0x79, + 0x30, 0x01, 0x34, 0x02, 0x42, 0x81, 0xdc, 0xf4, + 0x30, 0x01, 0x81, 0x38, 0x20, 0x00, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x30, 0x00, 0x40, 0x00, + 0x2e, 0x08, 0x1a, 0xb0, 0xb5, 0x90, 0x1c, 0x07, + 0x88, 0x00, 0x4b, 0x0d, 0x18, 0xc0, 0x4a, 0x0d, + 0x69, 0x12, 0x18, 0x84, 0x1c, 0x08, 0xf0, 0x00, + 0xf8, 0x9d, 0x20, 0x00, 0x88, 0x79, 0x29, 0x00, + 0xdd, 0x07, 0x68, 0x79, 0x5c, 0x09, 0x80, 0x21, + 0x88, 0x79, 0x30, 0x01, 0x34, 0x02, 0x42, 0x81, + 0xdc, 0xf7, 0x20, 0x01, 0x81, 0x38, 0x20, 0x00, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x30, 0x00, 0x40, 0x00, 0x2e, 0x08, 0x1a, 0xb0, + 0xb5, 0xb0, 0x1c, 0x07, 0x88, 0x00, 0x07, 0xc2, + 0x0f, 0xd2, 0x4c, 0x0f, 0xd0, 0x04, 0x23, 0xfe, + 0x40, 0x18, 0x4b, 0x0e, 0x18, 0xc0, 0xe0, 0x01, + 0x4b, 0x0d, 0x18, 0xc0, 0x69, 0x22, 0x18, 0x85, + 0x1c, 0x08, 0xf0, 0x00, 0xf8, 0x73, 0x23, 0x03, + 0x07, 0x1b, 0x69, 0x20, 0x18, 0xc0, 0x88, 0x29, + 0x68, 0x7a, 0x70, 0x11, 0x88, 0x01, 0x68, 0x7a, + 0x70, 0x11, 0x88, 0x00, 0x68, 0x79, 0x70, 0x08, + 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0xb0, 0x30, 0x00, 0x50, 0x00, + 0x30, 0x00, 0x40, 0x00, 0xb5, 0x90, 0x88, 0x02, + 0x07, 0xd3, 0x0f, 0xdb, 0x1c, 0x07, 0x48, 0x0b, + 0x2b, 0x00, 0xd0, 0x02, 0x4b, 0x0a, 0x18, 0xd2, + 0xe0, 0x01, 0x4b, 0x0a, 0x18, 0xd2, 0x69, 0x00, + 0x18, 0x14, 0x1c, 0x08, 0xf0, 0x00, 0xf8, 0x4a, + 0x68, 0x78, 0x78, 0x00, 0x80, 0x20, 0x88, 0x38, + 0x07, 0xc0, 0x0f, 0xc0, 0x20, 0x00, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0xb0, + 0x30, 0x00, 0x50, 0x00, 0x30, 0x00, 0x40, 0x00, + 0xb5, 0x90, 0x1c, 0x07, 0x20, 0x00, 0x78, 0x39, + 0x29, 0x01, 0xd0, 0x02, 0x29, 0x02, 0xd1, 0x28, + 0xe0, 0x26, 0x48, 0x15, 0x24, 0x00, 0x68, 0x01, + 0x29, 0x00, 0xd0, 0x16, 0x60, 0x04, 0x20, 0x1a, + 0xf0, 0x00, 0xf9, 0x10, 0x20, 0xc8, 0xf7, 0xfe, + 0xfb, 0x79, 0x20, 0x01, 0x06, 0x40, 0xf0, 0x16, + 0xfd, 0xca, 0xf0, 0x16, 0xfd, 0xcd, 0x4b, 0x0d, + 0x40, 0x18, 0xf0, 0x16, 0xfd, 0xcd, 0x20, 0x00, + 0xf0, 0x00, 0xf8, 0xb8, 0x20, 0x01, 0xf0, 0x00, + 0xf8, 0xb5, 0x48, 0x09, 0x1f, 0xc1, 0x39, 0x01, + 0x68, 0xc9, 0x5c, 0x40, 0x28, 0x00, 0xd0, 0x02, + 0x20, 0x01, 0x70, 0x78, 0xe0, 0x00, 0x70, 0x7c, + 0x20, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x98, 0xfd, 0xff, 0xff, 0xff, + 0x2e, 0x08, 0x1a, 0xb8, 0xb5, 0xb0, 0x1c, 0x07, + 0x4c, 0x1e, 0x68, 0xe0, 0x00, 0x80, 0x4d, 0x1e, + 0x58, 0x28, 0x42, 0xb8, 0xd0, 0x32, 0x2f, 0x08, + 0xd2, 0x2d, 0xa3, 0x02, 0x5d, 0xdb, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x29, 0x29, 0x04, 0x04, + 0x13, 0x13, 0x29, 0x29, 0x28, 0x03, 0xd0, 0x22, + 0x28, 0x02, 0xd0, 0x20, 0x20, 0x03, 0x49, 0x15, + 0x60, 0x08, 0x68, 0xe0, 0x00, 0xc3, 0x18, 0x18, + 0xf0, 0x00, 0xf8, 0xc8, 0x21, 0xf3, 0x40, 0x01, + 0xe0, 0x10, 0x28, 0x04, 0xd0, 0x13, 0x28, 0x05, + 0xd0, 0x11, 0x20, 0x00, 0x21, 0x03, 0x07, 0x09, + 0x80, 0x08, 0x68, 0xe0, 0x00, 0xc3, 0x18, 0x18, + 0xf0, 0x00, 0xf8, 0xb8, 0x23, 0xf3, 0x40, 0x18, + 0x21, 0x04, 0x43, 0x01, 0x68, 0xe0, 0x00, 0xc3, + 0x18, 0x18, 0xf0, 0x00, 0xf8, 0x95, 0x68, 0xe0, + 0x00, 0x80, 0x50, 0x2f, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xb0, + 0x2e, 0x08, 0x1a, 0xb0, 0x6e, 0x00, 0x11, 0x00, + 0xb5, 0x80, 0x21, 0x80, 0x1c, 0x07, 0x20, 0x1f, + 0xf0, 0x00, 0xf8, 0x82, 0x21, 0x55, 0x20, 0x02, + 0xf0, 0x00, 0xf8, 0x7e, 0x20, 0x02, 0xf0, 0x00, + 0xf8, 0x95, 0x28, 0x55, 0xd0, 0x03, 0x20, 0x00, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x33, + 0x20, 0x05, 0xf0, 0x00, 0xf8, 0x71, 0x21, 0x33, + 0x20, 0x0e, 0xf0, 0x00, 0xf8, 0x6d, 0x21, 0x21, + 0x20, 0x17, 0xf0, 0x00, 0xf8, 0x69, 0x21, 0x00, + 0x20, 0x01, 0xf0, 0x00, 0xf8, 0x65, 0x21, 0x00, + 0x20, 0x0a, 0xf0, 0x00, 0xf8, 0x61, 0x21, 0x01, + 0x20, 0x02, 0xf0, 0x00, 0xf8, 0x5d, 0x21, 0x01, + 0x20, 0x0b, 0xf0, 0x00, 0xf8, 0x59, 0x21, 0x00, + 0x20, 0x03, 0xf0, 0x00, 0xf8, 0x55, 0x21, 0x00, + 0x20, 0x0c, 0xf0, 0x00, 0xf8, 0x51, 0x21, 0x00, + 0x20, 0x04, 0xf0, 0x00, 0xf8, 0x4d, 0x21, 0x01, + 0x20, 0x0d, 0xf0, 0x00, 0xf8, 0x49, 0x21, 0x02, + 0x20, 0x1e, 0xf0, 0x00, 0xf8, 0x45, 0x21, 0x04, + 0x20, 0x1c, 0xf0, 0x00, 0xf8, 0x41, 0x21, 0x03, + 0x20, 0x1b, 0xf0, 0x00, 0xf8, 0x3d, 0x21, 0x01, + 0x20, 0x1f, 0xf0, 0x00, 0xf8, 0x39, 0x21, 0x01, + 0x20, 0x18, 0xf0, 0x00, 0xf8, 0x35, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x04, 0x20, 0x01, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x00, 0xc3, + 0x1c, 0x07, 0x18, 0x18, 0x1c, 0x06, 0xf0, 0x00, + 0xf8, 0x41, 0x07, 0xc0, 0x0f, 0xc0, 0x25, 0x01, + 0x4c, 0x10, 0x28, 0x00, 0xd0, 0x06, 0x5d, 0xe1, + 0x29, 0x00, 0xd0, 0x03, 0x1c, 0x28, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x28, 0x00, 0xd1, 0x01, + 0x55, 0xe0, 0xe7, 0xf7, 0x21, 0x80, 0x1c, 0x30, + 0xf0, 0x00, 0xf8, 0x12, 0x20, 0x32, 0xf7, 0xfe, + 0xfa, 0x95, 0x21, 0x00, 0x1c, 0x30, 0xf0, 0x00, + 0xf8, 0x0b, 0x20, 0x32, 0xf7, 0xfe, 0xfa, 0x8e, + 0x55, 0xe5, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xb8, + 0xb5, 0xb0, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x0d, + 0x0e, 0x2d, 0x24, 0x09, 0xb0, 0x81, 0xab, 0x00, + 0x70, 0x1f, 0x70, 0x5d, 0x46, 0x69, 0x22, 0x02, + 0x20, 0x80, 0xf7, 0xf4, 0xfa, 0xe6, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x08, 0x1e, 0x60, 0x06, 0x04, + 0x0e, 0x24, 0xd1, 0xf0, 0xb0, 0x01, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x06, 0x04, + 0x0e, 0x24, 0xb0, 0x82, 0x48, 0x1f, 0x68, 0x00, + 0x90, 0x00, 0x25, 0x09, 0xab, 0x01, 0x70, 0x1c, + 0x20, 0xff, 0x3b, 0x04, 0x70, 0x18, 0x22, 0x01, + 0xb4, 0x04, 0x20, 0x80, 0xa9, 0x02, 0xab, 0x01, + 0xf7, 0xf4, 0xfb, 0x22, 0xb0, 0x01, 0xaf, 0x00, + 0x78, 0x3f, 0xab, 0x01, 0x70, 0x1c, 0x20, 0xff, + 0x3b, 0x04, 0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, + 0x20, 0x80, 0xa9, 0x02, 0xab, 0x01, 0xf7, 0xf4, + 0xfb, 0x13, 0xb0, 0x01, 0xae, 0x00, 0x78, 0x36, + 0xab, 0x01, 0x70, 0x1c, 0x20, 0xff, 0x3b, 0x04, + 0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, 0x20, 0x80, + 0xa9, 0x02, 0xab, 0x01, 0xf7, 0xf4, 0xfb, 0x04, + 0xb0, 0x01, 0xa8, 0x00, 0x78, 0x00, 0x42, 0xb7, + 0xd1, 0x03, 0x42, 0x87, 0xd1, 0x01, 0x1c, 0x38, + 0xe0, 0x04, 0x1e, 0x68, 0x06, 0x05, 0x0e, 0x2d, + 0xd1, 0xc8, 0x20, 0xff, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0xcc, 0x9c, + 0xb5, 0x80, 0x78, 0x01, 0x29, 0x00, 0xd1, 0x1b, + 0x78, 0x40, 0x28, 0x00, 0xd0, 0x18, 0x4f, 0x0e, + 0x68, 0xf8, 0x00, 0xc3, 0x18, 0x18, 0xf7, 0xff, + 0xff, 0xad, 0x21, 0x20, 0x43, 0x01, 0x68, 0xf8, + 0x00, 0xc3, 0x18, 0x18, 0xf7, 0xff, 0xff, 0x8c, + 0x68, 0xf8, 0x00, 0xc3, 0x18, 0x18, 0xf7, 0xff, + 0xff, 0xa1, 0x21, 0x40, 0x43, 0x01, 0x68, 0xf8, + 0x00, 0xc3, 0x18, 0x18, 0xf7, 0xff, 0xff, 0x80, + 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0xb0, 0xb5, 0x80, 0x20, 0xe1, + 0x01, 0x00, 0xf7, 0xfe, 0xf9, 0xcb, 0x49, 0x1f, + 0x60, 0xc8, 0x28, 0x00, 0xd0, 0x0d, 0x27, 0x00, + 0x80, 0x4f, 0x70, 0x0f, 0x20, 0x64, 0x80, 0x88, + 0x80, 0xcf, 0x21, 0x64, 0x20, 0x00, 0xf0, 0x00, + 0xfe, 0x34, 0x20, 0x00, 0x22, 0xff, 0x49, 0x18, + 0xe0, 0x08, 0x78, 0x08, 0x23, 0x80, 0x43, 0x18, + 0x70, 0x08, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x01, 0x03, 0x18, 0x5b, + 0x70, 0x5a, 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, + 0x28, 0x0a, 0xdb, 0xf7, 0x20, 0x00, 0x49, 0x0f, + 0x22, 0xff, 0x32, 0x01, 0x54, 0x0f, 0x30, 0x01, + 0x04, 0x00, 0x0c, 0x00, 0x42, 0x90, 0xdb, 0xf9, + 0x20, 0x00, 0x49, 0x0b, 0x54, 0x0f, 0x30, 0x01, + 0x04, 0x00, 0x0c, 0x00, 0x42, 0x90, 0xdb, 0xf9, + 0x1c, 0x38, 0x49, 0x08, 0x63, 0x8f, 0x60, 0x4f, + 0x60, 0x0f, 0x62, 0x0f, 0x61, 0xcf, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x8f, 0x80, + 0x2e, 0x08, 0x8f, 0x90, 0x2e, 0x08, 0x90, 0x7c, + 0x2e, 0x08, 0x91, 0x7c, 0x2e, 0x08, 0x90, 0x30, + 0xb5, 0x90, 0x27, 0x00, 0x4c, 0x0b, 0x01, 0x38, + 0x5c, 0x21, 0x29, 0x00, 0xd0, 0x09, 0x19, 0x00, + 0x68, 0x81, 0x29, 0x00, 0xd0, 0x02, 0x88, 0x80, + 0xf7, 0xff, 0xfb, 0x8a, 0x1c, 0x38, 0xf0, 0x00, + 0xff, 0x83, 0x37, 0x01, 0x2f, 0x0a, 0xdb, 0xee, + 0xf0, 0x00, 0xf8, 0x06, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x90, + 0xb5, 0xf0, 0x25, 0x00, 0x4f, 0x1e, 0x88, 0x78, + 0x26, 0x00, 0x28, 0x00, 0xdd, 0x2c, 0x00, 0xec, + 0x19, 0x64, 0x00, 0xa4, 0x68, 0xf8, 0x19, 0x00, + 0x68, 0x80, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfe, + 0xf9, 0x7b, 0x68, 0xf8, 0x19, 0x00, 0x60, 0x86, + 0x68, 0xf8, 0x19, 0x00, 0x68, 0x40, 0x28, 0x00, + 0xd0, 0x04, 0xf7, 0xfe, 0xf9, 0x71, 0x68, 0xf8, + 0x19, 0x00, 0x60, 0x46, 0x68, 0xf8, 0x59, 0x00, + 0x28, 0x00, 0xd0, 0x03, 0xf7, 0xfe, 0xf9, 0x68, + 0x68, 0xf8, 0x51, 0x06, 0x68, 0xf8, 0x19, 0x00, + 0x69, 0x40, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfe, + 0xf9, 0x5f, 0x68, 0xf8, 0x19, 0x00, 0x61, 0x46, + 0x88, 0x78, 0x35, 0x01, 0x42, 0xa8, 0xdc, 0xd2, + 0x68, 0xf8, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfe, + 0xf9, 0x53, 0x60, 0xfe, 0x80, 0x7e, 0x80, 0xbe, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x8f, 0x80, 0xb5, 0xf0, 0x06, 0x0d, + 0x0e, 0x2d, 0x1c, 0x07, 0x20, 0x02, 0x40, 0x28, + 0x26, 0x00, 0x43, 0xf6, 0x24, 0x00, 0x28, 0x00, + 0xd0, 0x0d, 0x68, 0x38, 0x28, 0x00, 0xd0, 0x02, + 0xf7, 0xfe, 0xf9, 0x3a, 0x60, 0x3c, 0x68, 0x78, + 0x28, 0x00, 0xd0, 0x02, 0xf7, 0xfe, 0xf9, 0x34, + 0x60, 0x7c, 0x61, 0x7e, 0x61, 0xbe, 0x08, 0x68, + 0xd3, 0x0d, 0x69, 0xf8, 0x28, 0x00, 0xd0, 0x02, + 0xf7, 0xfe, 0xf9, 0x2a, 0x61, 0xfc, 0x6a, 0x38, + 0x28, 0x00, 0xd0, 0x02, 0xf7, 0xfe, 0xf9, 0x24, + 0x62, 0x3c, 0x63, 0x3e, 0x63, 0x7e, 0x08, 0xe8, + 0xd3, 0x05, 0x6b, 0xb8, 0x28, 0x00, 0xd0, 0x02, + 0xf7, 0xfe, 0xf9, 0x1a, 0x63, 0xbc, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0x4f, 0x12, + 0x88, 0xb8, 0x1d, 0xc1, 0x31, 0x0d, 0x00, 0xca, + 0x18, 0x52, 0x00, 0x92, 0x00, 0xc1, 0x18, 0x09, + 0x00, 0x89, 0x68, 0xf8, 0xf7, 0xfe, 0xf8, 0xe7, + 0x60, 0xf8, 0x28, 0x00, 0xd0, 0x0b, 0x88, 0xb8, + 0x1d, 0xc1, 0x31, 0x0d, 0xf0, 0x00, 0xfd, 0x51, + 0x88, 0xb8, 0x30, 0x14, 0x80, 0xb8, 0x20, 0x00, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x38, + 0x23, 0x80, 0x43, 0x18, 0x70, 0x38, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x8f, 0x80, 0xb5, 0x90, 0x06, 0x07, + 0x0e, 0x3f, 0x4c, 0x10, 0x2f, 0x11, 0xd1, 0x02, + 0x78, 0x20, 0x27, 0x08, 0x40, 0x07, 0xf7, 0xff, + 0xff, 0x3b, 0xf7, 0xff, 0xfe, 0xeb, 0x09, 0x38, + 0xd3, 0x03, 0x78, 0x20, 0x23, 0x08, 0x43, 0x18, + 0x70, 0x20, 0x4b, 0x09, 0x22, 0x00, 0x21, 0x00, + 0x20, 0x00, 0xf0, 0x00, 0xfe, 0x4f, 0x4b, 0x07, + 0x22, 0x11, 0x21, 0x00, 0x20, 0x42, 0xf0, 0x00, + 0xfe, 0x49, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x80, + 0x00, 0x00, 0x13, 0x88, 0x00, 0x00, 0x27, 0x10, + 0x49, 0x0e, 0x78, 0x0a, 0x08, 0x52, 0xd3, 0x01, + 0x22, 0xff, 0xe0, 0x00, 0x22, 0x00, 0x70, 0x02, + 0x78, 0x0a, 0x08, 0x92, 0xd3, 0x01, 0x22, 0xff, + 0xe0, 0x00, 0x22, 0x00, 0x70, 0x42, 0x78, 0x0a, + 0x09, 0x52, 0xd3, 0x01, 0x22, 0xff, 0xe0, 0x00, + 0x22, 0x00, 0x70, 0x82, 0x78, 0x09, 0x09, 0x89, + 0xd3, 0x01, 0x21, 0xff, 0xe0, 0x00, 0x21, 0x00, + 0x70, 0xc1, 0x47, 0x70, 0x2e, 0x08, 0x8f, 0x80, + 0xb5, 0x00, 0xf7, 0xff, 0xfe, 0xf9, 0x48, 0x03, + 0x78, 0x01, 0x23, 0x80, 0x43, 0x19, 0x70, 0x01, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x8f, 0x80, + 0xb5, 0xf0, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x07, + 0xb0, 0x81, 0x48, 0x3b, 0x90, 0x00, 0x78, 0x00, + 0x23, 0x80, 0x40, 0x18, 0x26, 0x00, 0x43, 0xf6, + 0x28, 0x00, 0xd1, 0x04, 0x1c, 0x38, 0xf0, 0x00, + 0xfe, 0xd5, 0x1c, 0x04, 0xd5, 0x01, 0x1c, 0x30, + 0xe0, 0x61, 0x78, 0x38, 0x4e, 0x33, 0x28, 0x42, + 0xd0, 0x45, 0xdc, 0x1c, 0x28, 0x00, 0xd0, 0x25, + 0x28, 0x01, 0xd0, 0x57, 0x28, 0x02, 0xd1, 0x55, + 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x00, 0xf9, 0xe8, + 0x28, 0x00, 0xd0, 0x04, 0x01, 0x20, 0x19, 0x80, + 0x88, 0x80, 0xf7, 0xff, 0xfa, 0x5d, 0x1c, 0x20, + 0xf0, 0x00, 0xfe, 0x56, 0xf0, 0x00, 0xfd, 0x6f, + 0x28, 0x00, 0xd1, 0x43, 0xf0, 0x00, 0xfd, 0x6b, + 0x28, 0x00, 0xd0, 0xfb, 0xe0, 0x3e, 0x28, 0x4e, + 0xd0, 0x38, 0x28, 0x70, 0xd0, 0x1e, 0x28, 0x73, + 0xd1, 0x38, 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x00, + 0xfc, 0x37, 0xe0, 0x33, 0x98, 0x00, 0x78, 0x00, + 0x08, 0x40, 0xd2, 0x2f, 0x1c, 0x38, 0x1c, 0x29, + 0xf0, 0x00, 0xf8, 0x36, 0x28, 0x01, 0xd1, 0x29, + 0x01, 0x20, 0x19, 0x80, 0x88, 0x80, 0xf7, 0xff, + 0xfa, 0x37, 0xf0, 0x00, 0xfd, 0x4c, 0x28, 0x00, + 0xd1, 0x20, 0xf0, 0x00, 0xfd, 0x48, 0x28, 0x00, + 0xd0, 0xfb, 0xe0, 0x1b, 0x1c, 0x38, 0x1c, 0x29, + 0xf0, 0x00, 0xfb, 0xf6, 0xe0, 0x16, 0x98, 0x00, + 0x78, 0x00, 0x09, 0x40, 0xd2, 0x12, 0x1c, 0x38, + 0x1c, 0x29, 0xf0, 0x00, 0xf8, 0xd1, 0x28, 0x10, + 0xd1, 0x0c, 0x01, 0x20, 0x19, 0x80, 0x88, 0x80, + 0xf7, 0xff, 0xfa, 0x1a, 0x1c, 0x20, 0xf0, 0x00, + 0xfe, 0x13, 0xe0, 0x03, 0x1c, 0x38, 0x1c, 0x29, + 0xf0, 0x00, 0xfb, 0x10, 0x20, 0x00, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x8f, 0x80, 0x2e, 0x08, 0x8f, 0x90, + 0xb5, 0xf0, 0x04, 0x09, 0x0c, 0x09, 0x25, 0x00, + 0xb0, 0x85, 0xf7, 0xf3, 0xff, 0xa9, 0x20, 0x08, + 0xf7, 0xf3, 0xff, 0xc2, 0x20, 0x04, 0xf7, 0xf3, + 0xff, 0xbf, 0x20, 0x0c, 0xf7, 0xf3, 0xff, 0xbc, + 0x04, 0x00, 0x0c, 0x00, 0x90, 0x03, 0x20, 0x10, + 0xf7, 0xf3, 0xff, 0xb6, 0x4f, 0x4d, 0x81, 0x38, + 0x20, 0x02, 0xf7, 0xf3, 0xff, 0xb1, 0x20, 0x05, + 0xf7, 0xf3, 0xff, 0xae, 0x06, 0x04, 0x0e, 0x24, + 0x20, 0x01, 0xf7, 0xf3, 0xff, 0xa9, 0x20, 0x08, + 0xf7, 0xf3, 0xff, 0xa6, 0x06, 0x06, 0x0e, 0x36, + 0x20, 0x08, 0xf7, 0xf3, 0xff, 0xa1, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x02, 0x48, 0x42, 0x90, 0x04, + 0x5d, 0x80, 0x0a, 0x01, 0xd3, 0x03, 0x06, 0xc0, + 0x0e, 0xc0, 0x42, 0xa0, 0xd0, 0x45, 0x20, 0x80, + 0x43, 0x20, 0x99, 0x04, 0x55, 0x88, 0x98, 0x03, + 0x38, 0x09, 0xd5, 0x00, 0x30, 0x03, 0x10, 0x80, + 0x04, 0x00, 0x0c, 0x00, 0x90, 0x01, 0x88, 0x7c, + 0x28, 0x00, 0xdd, 0x36, 0x20, 0x10, 0xf7, 0xf3, + 0xff, 0x83, 0x04, 0x06, 0x0c, 0x36, 0x20, 0x10, + 0xf7, 0xf3, 0xff, 0x7e, 0x04, 0xc1, 0x0c, 0xc9, + 0x91, 0x00, 0x2e, 0x00, 0xd0, 0x21, 0x1c, 0x30, + 0xf0, 0x00, 0xfb, 0xe0, 0x4b, 0x2f, 0x42, 0x98, + 0xd1, 0x10, 0x88, 0xb8, 0x88, 0x79, 0x42, 0x88, + 0xd1, 0x05, 0xf7, 0xff, 0xfe, 0xa3, 0x23, 0x01, + 0x42, 0xd8, 0xd1, 0x00, 0xe0, 0x49, 0x88, 0x79, + 0x31, 0x01, 0x80, 0x79, 0x1c, 0x61, 0x1c, 0x20, + 0x04, 0x0c, 0x0c, 0x24, 0x00, 0xc3, 0x18, 0x18, + 0x00, 0x80, 0x68, 0xf9, 0x18, 0x09, 0x81, 0xce, + 0x99, 0x00, 0x68, 0xfa, 0x18, 0x10, 0x82, 0x01, + 0xe0, 0x01, 0x99, 0x00, 0x80, 0xf9, 0x1c, 0x68, + 0x04, 0x05, 0x0c, 0x2d, 0x98, 0x01, 0x42, 0x85, + 0xdb, 0xc8, 0x98, 0x04, 0x99, 0x02, 0xf0, 0x00, + 0xfb, 0xd3, 0x28, 0xff, 0xd1, 0x28, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xfe, 0x0a, + 0x04, 0x00, 0x0c, 0x00, 0xf0, 0x00, 0xfd, 0x78, + 0x78, 0x38, 0x09, 0x00, 0xd3, 0x16, 0x20, 0x00, + 0x88, 0x79, 0x29, 0x00, 0xdd, 0x12, 0x00, 0xc2, + 0x18, 0x12, 0x00, 0x92, 0x68, 0xf9, 0x18, 0x89, + 0x89, 0xca, 0x89, 0x7b, 0x42, 0x9a, 0xd0, 0x03, + 0x7f, 0x0a, 0x23, 0x80, 0x43, 0x1a, 0x77, 0x0a, + 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x88, 0x79, + 0x42, 0x81, 0xdc, 0xec, 0x78, 0x38, 0x23, 0x01, + 0x43, 0x18, 0x70, 0x38, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x80, + 0x2e, 0x08, 0x90, 0x7c, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0xf0, 0x04, 0x09, 0x0c, 0x09, 0x25, 0x00, + 0xb0, 0x88, 0xf7, 0xf3, 0xfe, 0xf1, 0x20, 0x08, + 0xf7, 0xf3, 0xff, 0x0a, 0x20, 0x04, 0xf7, 0xf3, + 0xff, 0x07, 0x20, 0x0c, 0xf7, 0xf3, 0xff, 0x04, + 0x04, 0x04, 0x0c, 0x24, 0x20, 0x10, 0xf7, 0xf3, + 0xfe, 0xff, 0x20, 0x02, 0xf7, 0xf3, 0xfe, 0xfc, + 0x20, 0x05, 0xf7, 0xf3, 0xfe, 0xf9, 0x06, 0x06, + 0x0e, 0x36, 0x20, 0x01, 0xf7, 0xf3, 0xfe, 0xf4, + 0x20, 0x08, 0xf7, 0xf3, 0xfe, 0xf1, 0x06, 0x07, + 0x0e, 0x3f, 0x20, 0x08, 0xf7, 0xf3, 0xfe, 0xec, + 0x06, 0x01, 0x0e, 0x09, 0x91, 0x04, 0x20, 0x10, + 0xf7, 0xf3, 0xfe, 0xe6, 0x20, 0x08, 0xf7, 0xf3, + 0xfe, 0xe3, 0x49, 0x4c, 0x91, 0x07, 0x5d, 0xc8, + 0x0a, 0x01, 0xd3, 0x05, 0x06, 0xc0, 0x0e, 0xc0, + 0x42, 0xb0, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x88, + 0x20, 0x80, 0x43, 0x30, 0x99, 0x07, 0x55, 0xc8, + 0x4f, 0x45, 0x88, 0x78, 0x90, 0x00, 0x1f, 0xe0, + 0x38, 0x05, 0x90, 0x06, 0x28, 0x00, 0xdd, 0x68, + 0x48, 0x42, 0x90, 0x05, 0x20, 0x10, 0xf7, 0xf3, + 0xfe, 0xc7, 0x04, 0x06, 0x0c, 0x36, 0x20, 0x06, + 0xf7, 0xf3, 0xfe, 0xc2, 0x20, 0x06, 0xf7, 0xf3, + 0xfe, 0xbf, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x03, + 0x2e, 0x00, 0xd1, 0x11, 0x20, 0x0c, 0xf7, 0xf3, + 0xfe, 0xb7, 0x04, 0x06, 0x0c, 0x36, 0x24, 0x00, + 0x2e, 0x00, 0xdd, 0x07, 0x20, 0x08, 0xf7, 0xf3, + 0xfe, 0xaf, 0x1c, 0x60, 0x04, 0x04, 0x0c, 0x24, + 0x42, 0xb4, 0xdb, 0xf7, 0x19, 0xa8, 0xe0, 0x3e, + 0x1c, 0x30, 0xf0, 0x00, 0xfb, 0x0f, 0x1c, 0x04, + 0x4b, 0x2f, 0x42, 0x98, 0xd1, 0x18, 0x88, 0xb8, + 0x88, 0x79, 0x42, 0x88, 0xd1, 0x05, 0xf7, 0xff, + 0xfd, 0xd1, 0x23, 0x01, 0x42, 0xd8, 0xd1, 0x00, + 0xe0, 0x47, 0x9c, 0x00, 0x00, 0xe1, 0x19, 0x09, + 0x00, 0x89, 0x68, 0xf8, 0x18, 0x40, 0x81, 0xc6, + 0x88, 0x78, 0x30, 0x01, 0x80, 0x78, 0x98, 0x00, + 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, + 0x98, 0x03, 0x00, 0xe2, 0x19, 0x12, 0x00, 0x92, + 0x68, 0xf9, 0x18, 0x89, 0x77, 0xc8, 0x20, 0x0c, + 0xf7, 0xf3, 0xfe, 0x7e, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x02, 0x26, 0x00, 0x28, 0x00, 0xdd, 0x0c, + 0x98, 0x05, 0xa9, 0x01, 0x1c, 0x22, 0xf0, 0x00, + 0xfb, 0x45, 0xa8, 0x01, 0x88, 0x00, 0x18, 0x30, + 0x04, 0x06, 0x0c, 0x36, 0x98, 0x02, 0x42, 0x86, + 0xdb, 0xf2, 0x98, 0x02, 0x18, 0x28, 0x30, 0x05, + 0x04, 0x05, 0x0c, 0x2d, 0x98, 0x06, 0x42, 0xa8, + 0xdc, 0x98, 0x98, 0x07, 0x99, 0x04, 0xf0, 0x00, + 0xfa, 0xe7, 0x28, 0xff, 0xd1, 0x82, 0x78, 0x38, + 0x23, 0x10, 0x43, 0x18, 0x70, 0x38, 0x78, 0x38, + 0x08, 0x81, 0xd3, 0x05, 0x09, 0x41, 0xd3, 0x03, + 0x09, 0x00, 0xd2, 0x01, 0xf0, 0x00, 0xfe, 0xd3, + 0x20, 0x10, 0xb0, 0x08, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x91, 0x7c, + 0x2e, 0x08, 0x8f, 0x80, 0x2e, 0x08, 0x82, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x20, 0x00, 0x47, 0x70, + 0xb5, 0xf0, 0x04, 0x09, 0x0c, 0x09, 0x22, 0x00, + 0xb0, 0x90, 0x92, 0x0c, 0x92, 0x02, 0x92, 0x01, + 0xf7, 0xf3, 0xfe, 0x1a, 0x20, 0x08, 0xf7, 0xf3, + 0xfe, 0x33, 0x20, 0x04, 0xf7, 0xf3, 0xfe, 0x30, + 0x20, 0x0c, 0xf7, 0xf3, 0xfe, 0x2d, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x0d, 0x20, 0x10, 0xf7, 0xf3, + 0xfe, 0x27, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x0a, + 0x20, 0x02, 0xf7, 0xf3, 0xfe, 0x21, 0x20, 0x05, + 0xf7, 0xf3, 0xfe, 0x1e, 0x06, 0x03, 0x0e, 0x1b, + 0x93, 0x05, 0x20, 0x01, 0xf7, 0xf3, 0xfe, 0x18, + 0x06, 0x02, 0x0e, 0x12, 0x92, 0x04, 0x20, 0x08, + 0xf7, 0xf3, 0xfe, 0x12, 0x20, 0x08, 0xf7, 0xf3, + 0xfe, 0x0f, 0x20, 0x03, 0xf7, 0xf3, 0xfe, 0x0c, + 0x20, 0x0d, 0xf7, 0xf3, 0xfe, 0x09, 0x04, 0x07, + 0x0c, 0x3f, 0x20, 0x04, 0xf7, 0xf3, 0xfe, 0x04, + 0x20, 0x0c, 0xf7, 0xf3, 0xfe, 0x01, 0x04, 0x01, + 0x0c, 0x09, 0x91, 0x09, 0x98, 0x0a, 0xf0, 0x00, + 0xfd, 0x13, 0x1c, 0x04, 0xd1, 0x01, 0x43, 0xe0, + 0xe1, 0x27, 0x7f, 0x20, 0x0a, 0x00, 0xd3, 0x01, + 0x20, 0x00, 0xe1, 0x22, 0x84, 0x27, 0x25, 0x00, + 0x99, 0x09, 0x4e, 0x92, 0x1d, 0xf7, 0x37, 0xf9, + 0x29, 0x00, 0xdd, 0x2a, 0x98, 0x0a, 0xf0, 0x00, + 0xfa, 0x51, 0x1c, 0x02, 0x1c, 0x30, 0xa9, 0x06, + 0xf0, 0x00, 0xfa, 0xb4, 0x28, 0x09, 0xd1, 0x16, + 0x98, 0x02, 0x28, 0x00, 0xd1, 0x06, 0x20, 0xff, + 0x90, 0x01, 0x20, 0x01, 0x70, 0x38, 0x18, 0x28, + 0x04, 0x05, 0x0c, 0x2d, 0x20, 0xff, 0x90, 0x02, + 0x19, 0x78, 0xaa, 0x06, 0x88, 0x12, 0x1c, 0x31, + 0xf0, 0x10, 0xfd, 0x14, 0xa8, 0x06, 0x88, 0x00, + 0x18, 0x28, 0x04, 0x05, 0x0c, 0x2d, 0xa9, 0x06, + 0x88, 0x09, 0x98, 0x0c, 0x18, 0x40, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x0c, 0x99, 0x09, 0x42, 0x88, + 0xdb, 0xd4, 0x48, 0x7b, 0x90, 0x0f, 0x2d, 0x00, + 0xd0, 0x0d, 0x9a, 0x04, 0xb4, 0x04, 0x21, 0x03, + 0x98, 0x10, 0x9a, 0x0b, 0x9b, 0x06, 0xf0, 0x00, + 0xfd, 0xac, 0xb0, 0x01, 0x98, 0x0f, 0x1c, 0x39, + 0x1c, 0x2a, 0xf0, 0x00, 0xfd, 0xc8, 0x20, 0x00, + 0x90, 0x0b, 0x98, 0x0d, 0x99, 0x09, 0x1a, 0x40, + 0x38, 0x0d, 0x90, 0x0e, 0x28, 0x00, 0xdd, 0x75, + 0x20, 0x00, 0x90, 0x00, 0x25, 0x00, 0x20, 0x08, + 0xf7, 0xf3, 0xfd, 0x9e, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x03, 0x20, 0x03, 0xf7, 0xf3, 0xfd, 0x98, + 0x20, 0x0d, 0xf7, 0xf3, 0xfd, 0x95, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x07, 0x98, 0x03, 0x28, 0x07, + 0xd2, 0x12, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x0e, 0x04, 0x04, 0x07, + 0x07, 0x0e, 0x0c, 0x00, 0x98, 0x07, 0x82, 0x60, + 0xe0, 0x06, 0x99, 0x07, 0x1c, 0x20, 0xf0, 0x00, + 0xfd, 0x51, 0xe0, 0x01, 0x20, 0xff, 0x90, 0x00, + 0x20, 0x04, 0xf7, 0xf3, 0xfd, 0x79, 0x20, 0x0c, + 0xf7, 0xf3, 0xfd, 0x76, 0x04, 0x01, 0x0c, 0x09, + 0x91, 0x08, 0x20, 0x00, 0x90, 0x0c, 0x29, 0x00, + 0xdd, 0x1c, 0x98, 0x0a, 0xf0, 0x00, 0xf9, 0xd6, + 0x1c, 0x02, 0x1c, 0x30, 0xa9, 0x06, 0xf0, 0x00, + 0xfa, 0x39, 0x28, 0x09, 0xd0, 0x37, 0x28, 0x0a, + 0xd0, 0x44, 0x28, 0x56, 0xd1, 0x04, 0x98, 0x00, + 0x28, 0xff, 0xd1, 0x01, 0x98, 0x07, 0x83, 0x60, + 0xa9, 0x06, 0x88, 0x09, 0x98, 0x0c, 0x18, 0x40, + 0x04, 0x00, 0x0c, 0x00, 0x90, 0x0c, 0x99, 0x08, + 0x42, 0x88, 0xdb, 0xe2, 0x98, 0x03, 0x70, 0x38, + 0x98, 0x07, 0x12, 0x00, 0x70, 0x78, 0x98, 0x07, + 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 0x71, 0x38, + 0x20, 0x01, 0x71, 0x78, 0x2d, 0x00, 0xd0, 0x40, + 0x98, 0x02, 0x28, 0x00, 0xd1, 0x0a, 0x20, 0xff, + 0x90, 0x02, 0x9a, 0x04, 0xb4, 0x04, 0x21, 0x03, + 0x98, 0x10, 0x9a, 0x0b, 0x9b, 0x06, 0xf0, 0x00, + 0xfd, 0x30, 0xb0, 0x01, 0x1f, 0x68, 0x12, 0x01, + 0x70, 0xf9, 0x71, 0x38, 0x98, 0x0f, 0x1c, 0x39, + 0x1c, 0x2a, 0xe0, 0x3e, 0xe0, 0x4b, 0x2d, 0x00, + 0xd1, 0x00, 0x25, 0x06, 0x19, 0x78, 0xaa, 0x06, + 0x88, 0x12, 0x1c, 0x31, 0xf0, 0x10, 0xfc, 0x6a, + 0xa8, 0x06, 0x88, 0x00, 0x18, 0x28, 0x04, 0x05, + 0x0c, 0x2d, 0xe7, 0xc1, 0x98, 0x03, 0x28, 0x04, + 0xd0, 0x02, 0x98, 0x03, 0x28, 0x03, 0xd1, 0xbb, + 0x69, 0x60, 0x28, 0x00, 0xd0, 0x09, 0x8b, 0x21, + 0x00, 0xc9, 0x18, 0x40, 0x78, 0xb1, 0x38, 0x06, + 0x70, 0x81, 0x78, 0x71, 0x70, 0x41, 0x78, 0x31, + 0x70, 0x01, 0x22, 0x00, 0x8b, 0x21, 0x00, 0xc9, + 0x69, 0x60, 0x18, 0x40, 0x38, 0x20, 0x77, 0x42, + 0xe7, 0xa6, 0x98, 0x01, 0x28, 0xff, 0xd1, 0x12, + 0x98, 0x02, 0x28, 0x00, 0xd1, 0x0a, 0x20, 0xff, + 0x90, 0x02, 0x9a, 0x04, 0xb4, 0x04, 0x21, 0x03, + 0x98, 0x10, 0x9a, 0x0b, 0x9b, 0x06, 0xf0, 0x00, + 0xfc, 0xec, 0xb0, 0x01, 0x22, 0x05, 0x98, 0x0f, + 0x1c, 0x39, 0xf0, 0x00, 0xfd, 0x24, 0x98, 0x0b, + 0x99, 0x08, 0x18, 0x40, 0x30, 0x06, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x0b, 0x98, 0x0e, 0x99, 0x0b, + 0x42, 0x88, 0xdd, 0x00, 0xe7, 0x3c, 0x7f, 0x20, + 0x23, 0x80, 0x43, 0x18, 0x77, 0x20, 0x9a, 0x04, + 0x07, 0xd0, 0x0e, 0x80, 0x9b, 0x05, 0x18, 0xc0, + 0x77, 0x60, 0x98, 0x02, 0x28, 0xff, 0xd1, 0x03, + 0x99, 0x0f, 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0x20, + 0x20, 0x01, 0xb0, 0x10, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x83, 0x80, + 0x2e, 0x08, 0x85, 0x80, 0xb5, 0xf0, 0x04, 0x09, + 0x0c, 0x09, 0x22, 0x00, 0xb0, 0x88, 0x92, 0x05, + 0xf7, 0xf3, 0xfc, 0xa2, 0x20, 0x08, 0xf7, 0xf3, + 0xfc, 0xbb, 0x20, 0x04, 0xf7, 0xf3, 0xfc, 0xb8, + 0x20, 0x0c, 0xf7, 0xf3, 0xfc, 0xb5, 0x04, 0x05, + 0x0c, 0x2d, 0x20, 0x10, 0xf7, 0xf3, 0xfc, 0xb0, + 0x04, 0x07, 0x0c, 0x3f, 0x20, 0x02, 0xf7, 0xf3, + 0xfc, 0xab, 0x20, 0x05, 0xf7, 0xf3, 0xfc, 0xa8, + 0x20, 0x01, 0xf7, 0xf3, 0xfc, 0xa5, 0x06, 0x04, + 0x0e, 0x24, 0x20, 0x08, 0xf7, 0xf3, 0xfc, 0xa0, + 0x06, 0x06, 0x0e, 0x36, 0x20, 0x08, 0xf7, 0xf3, + 0xfc, 0x9b, 0x20, 0x10, 0xf7, 0xf3, 0xfc, 0x98, + 0x20, 0x10, 0xf7, 0xf3, 0xfc, 0x95, 0x20, 0x08, + 0xf7, 0xf3, 0xfc, 0x92, 0x20, 0x08, 0xf7, 0xf3, + 0xfc, 0x8f, 0x2c, 0x00, 0xd0, 0x65, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0xf4, 0x90, 0x03, 0x4b, 0x44, + 0x42, 0x98, 0xd0, 0x5e, 0x48, 0x43, 0x89, 0x41, + 0x42, 0xb9, 0xd1, 0x5b, 0x68, 0xc0, 0x9a, 0x03, + 0x00, 0xd1, 0x18, 0x89, 0x00, 0x89, 0x18, 0x40, + 0x7f, 0x80, 0x4c, 0x3f, 0x1d, 0xe7, 0x37, 0x39, + 0x28, 0x04, 0xd0, 0x0b, 0x28, 0x05, 0xd0, 0x09, + 0x2e, 0x00, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x04, + 0x2e, 0x01, 0xd1, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x02, 0x72, 0xb8, 0x2d, 0x0f, 0xdd, 0x61, + 0x1f, 0xe8, 0x38, 0x08, 0x90, 0x07, 0x28, 0x00, + 0xdd, 0x5c, 0x48, 0x34, 0x90, 0x06, 0x20, 0x10, + 0xf7, 0xf3, 0xfc, 0x5e, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x04, 0x20, 0x10, 0xf7, 0xf3, 0xfc, 0x58, + 0x20, 0x18, 0xf7, 0xf3, 0xfc, 0x55, 0x90, 0x01, + 0x20, 0x18, 0xf7, 0xf3, 0xfc, 0x51, 0x90, 0x00, + 0x20, 0x03, 0xf7, 0xf3, 0xfc, 0x4d, 0x20, 0x01, + 0xf7, 0xf3, 0xfc, 0x4a, 0x20, 0x0c, 0xf7, 0xf3, + 0xfc, 0x47, 0x04, 0x05, 0x0c, 0x2d, 0x98, 0x05, + 0x19, 0x40, 0x30, 0x0c, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x05, 0x7a, 0xb8, 0x00, 0xc1, 0x1a, 0x09, + 0x00, 0x89, 0x19, 0x09, 0x69, 0x8a, 0x9b, 0x04, + 0x42, 0x9a, 0xd0, 0x2b, 0x26, 0x00, 0x28, 0x00, + 0xd0, 0x01, 0x28, 0x01, 0xd1, 0x0b, 0x98, 0x01, + 0x60, 0xc8, 0x7a, 0xb9, 0x00, 0xcb, 0x1a, 0x59, + 0x00, 0x89, 0x19, 0x09, 0x98, 0x00, 0x61, 0x08, + 0xe0, 0x05, 0xe0, 0x1f, 0xe0, 0x1e, 0x98, 0x01, + 0x63, 0xe0, 0x98, 0x00, 0x64, 0x20, 0x2d, 0x00, + 0xdd, 0x14, 0x98, 0x06, 0x9a, 0x03, 0xa9, 0x02, + 0xf0, 0x00, 0xf8, 0xec, 0x28, 0x4d, 0xd1, 0x06, + 0x7a, 0xb9, 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, + 0x19, 0x09, 0x98, 0x04, 0x61, 0x48, 0xa8, 0x02, + 0x88, 0x00, 0x18, 0x30, 0x04, 0x06, 0x0c, 0x36, + 0x42, 0xae, 0xdb, 0xea, 0x98, 0x07, 0x99, 0x05, + 0x42, 0x88, 0xdc, 0xa4, 0x20, 0x00, 0xb0, 0x08, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x8f, 0x80, + 0x2e, 0x08, 0x90, 0x30, 0x2e, 0x08, 0x89, 0x98, + 0xb5, 0x80, 0x04, 0x09, 0x0c, 0x09, 0xf7, 0xf3, + 0xfb, 0xd7, 0x20, 0x08, 0xf7, 0xf3, 0xfb, 0xf0, + 0x20, 0x04, 0xf7, 0xf3, 0xfb, 0xed, 0x20, 0x0c, + 0xf7, 0xf3, 0xfb, 0xea, 0x20, 0x10, 0xf7, 0xf3, + 0xfb, 0xe7, 0x4f, 0x07, 0x60, 0xf8, 0x20, 0x18, + 0xf7, 0xf3, 0xfb, 0xe2, 0x60, 0xb8, 0x48, 0x05, + 0x78, 0x01, 0x23, 0x20, 0x43, 0x19, 0x70, 0x01, + 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0xcc, 0x2e, 0x08, 0x8f, 0x80, + 0xb5, 0xb0, 0x04, 0x09, 0x0c, 0x09, 0xb0, 0x81, + 0xf7, 0xf3, 0xfb, 0xb2, 0x20, 0x08, 0xf7, 0xf3, + 0xfb, 0xcb, 0x20, 0x04, 0xf7, 0xf3, 0xfb, 0xc8, + 0x20, 0x0c, 0xf7, 0xf3, 0xfb, 0xc5, 0x20, 0x10, + 0xf7, 0xf3, 0xfb, 0xc2, 0x04, 0x00, 0x0c, 0x00, + 0x4f, 0x11, 0x60, 0xf8, 0x20, 0x18, 0xf7, 0xf3, + 0xfb, 0xbb, 0x60, 0xb8, 0x20, 0x04, 0xf7, 0xf3, + 0xfb, 0xb7, 0x20, 0x0c, 0xf7, 0xf3, 0xfb, 0xb4, + 0x04, 0x04, 0x0c, 0x24, 0x27, 0x00, 0x2c, 0x00, + 0xdd, 0x0c, 0x4d, 0x0a, 0x46, 0x69, 0x1c, 0x28, + 0x4a, 0x09, 0xf0, 0x00, 0xf8, 0x7b, 0xa8, 0x00, + 0x88, 0x00, 0x18, 0x38, 0x04, 0x07, 0x0c, 0x3f, + 0x42, 0xa7, 0xdb, 0xf3, 0x20, 0x00, 0xb0, 0x01, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0xcc, 0x2e, 0x08, 0x8a, 0x98, + 0x00, 0x00, 0xff, 0xff, 0xb4, 0x80, 0x04, 0x02, + 0x0c, 0x12, 0x20, 0x00, 0x49, 0x0a, 0x88, 0x49, + 0x29, 0x00, 0xdd, 0x0d, 0x4b, 0x08, 0x68, 0xdf, + 0x00, 0xc3, 0x18, 0x1b, 0x00, 0x9b, 0x18, 0xfb, + 0x89, 0xdb, 0x42, 0x93, 0xd0, 0x05, 0x30, 0x01, + 0x04, 0x00, 0x0c, 0x00, 0x42, 0x81, 0xdc, 0xf3, + 0x48, 0x02, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x8f, 0x80, 0x00, 0x00, 0xff, 0xff, + 0xb4, 0x80, 0x06, 0x0a, 0x0e, 0x12, 0x21, 0x00, + 0x32, 0x01, 0x2a, 0x00, 0xdd, 0x0a, 0x5c, 0x47, + 0x0a, 0x3b, 0xd2, 0x02, 0x20, 0x00, 0xbc, 0x80, + 0x47, 0x70, 0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, + 0x42, 0x8a, 0xdc, 0xf4, 0x20, 0xff, 0xbc, 0x80, + 0x47, 0x70, 0xb4, 0x90, 0x04, 0x02, 0x0c, 0x12, + 0x04, 0x0f, 0x0c, 0x3f, 0x42, 0xba, 0xda, 0x29, + 0x20, 0x00, 0x49, 0x15, 0x00, 0xd3, 0x18, 0x9b, + 0x00, 0x9b, 0x68, 0xcc, 0x18, 0xe4, 0x81, 0xe0, + 0x68, 0xcc, 0x18, 0xe4, 0x77, 0x20, 0x68, 0xcc, + 0x18, 0xe4, 0x60, 0x60, 0x68, 0xcc, 0x50, 0xe0, + 0x68, 0xcc, 0x18, 0xe4, 0x82, 0x20, 0x68, 0xcc, + 0x18, 0xe4, 0x60, 0xa0, 0x68, 0xcc, 0x18, 0xe4, + 0x81, 0xa0, 0x68, 0xcc, 0x18, 0xe4, 0x61, 0x60, + 0x68, 0xcc, 0x18, 0xe4, 0x83, 0x20, 0x68, 0xcc, + 0x18, 0xe4, 0x83, 0x60, 0x68, 0xcc, 0x18, 0xe3, + 0x82, 0x58, 0x32, 0x01, 0x04, 0x12, 0x0c, 0x12, + 0x42, 0xba, 0xdb, 0xd7, 0xbc, 0x90, 0x47, 0x70, + 0x2e, 0x08, 0x8f, 0x80, 0xb5, 0xf0, 0x04, 0x15, + 0x0c, 0x2d, 0x1c, 0x07, 0x20, 0x08, 0x1c, 0x0c, + 0xf7, 0xf3, 0xfb, 0x26, 0x06, 0x06, 0x0e, 0x36, + 0x20, 0x08, 0xf7, 0xf3, 0xfb, 0x21, 0x06, 0x01, + 0x0e, 0x09, 0x1c, 0x88, 0x80, 0x20, 0x2e, 0x48, + 0xd0, 0x42, 0xdc, 0x0c, 0x1e, 0xb0, 0x28, 0x09, + 0xd2, 0x61, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x25, 0x2c, 0x5e, 0x5e, + 0x5e, 0x5e, 0x33, 0x1e, 0x4f, 0x00, 0x2e, 0x56, + 0xd0, 0x4e, 0xdc, 0x0a, 0x2e, 0x4d, 0xd0, 0x36, + 0x2e, 0x4e, 0xd1, 0x51, 0x1c, 0x38, 0x1c, 0x2a, + 0xf0, 0x00, 0xfd, 0x4c, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x2e, 0x58, 0xd0, 0x32, 0x2e, 0x5d, + 0xd1, 0x46, 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, + 0xfc, 0x11, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 0xfb, 0xbc, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, + 0x1c, 0x2a, 0xf0, 0x00, 0xfb, 0xcd, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, 0x1c, 0x2a, + 0xf0, 0x00, 0xfb, 0xd8, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, + 0xfb, 0xe3, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 0xfc, 0x00, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, + 0x1c, 0x2a, 0xf0, 0x00, 0xfc, 0x71, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, 0x1c, 0x2a, + 0xf0, 0x00, 0xfd, 0x6c, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, + 0xfd, 0x97, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 0xfd, 0xb4, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, + 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 0xfd, 0xbe, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, + 0x22, 0x01, 0x20, 0x00, 0xb0, 0x88, 0x4f, 0x35, + 0x88, 0x79, 0x25, 0x00, 0x29, 0x00, 0xdd, 0x35, + 0x00, 0xc4, 0x18, 0x24, 0x00, 0xa4, 0x68, 0xf9, + 0x19, 0x09, 0x7f, 0x0e, 0x0a, 0x33, 0xd2, 0x1d, + 0x09, 0xf3, 0xd2, 0x1b, 0x8a, 0x0b, 0x2b, 0x00, + 0xd0, 0x18, 0x00, 0xc3, 0x18, 0x18, 0x00, 0x80, + 0x68, 0xfa, 0x18, 0x10, 0x8a, 0x02, 0x89, 0xc9, + 0x4b, 0x29, 0x20, 0x02, 0xf0, 0x00, 0xf8, 0x52, + 0x21, 0x00, 0x43, 0xc9, 0x42, 0x88, 0xd1, 0x01, + 0x1c, 0x08, 0xe0, 0x42, 0x68, 0xf8, 0x19, 0x00, + 0x7f, 0x01, 0x23, 0x40, 0x43, 0x19, 0x77, 0x01, + 0x1c, 0x28, 0xe0, 0x3a, 0x8a, 0x0b, 0x2b, 0x00, + 0xd1, 0x02, 0x23, 0xa0, 0x43, 0x33, 0x77, 0x0b, + 0x68, 0xf9, 0x19, 0x09, 0x7f, 0x09, 0x0a, 0x09, + 0xd2, 0x00, 0x22, 0x00, 0x88, 0x79, 0x30, 0x01, + 0x42, 0x81, 0xdc, 0xc9, 0x2a, 0x00, 0xd1, 0x01, + 0x20, 0x02, 0xe0, 0x26, 0x78, 0x38, 0x08, 0x81, + 0xd2, 0x22, 0x23, 0x02, 0x43, 0x18, 0x70, 0x38, + 0x78, 0x38, 0x09, 0x00, 0xd3, 0x02, 0x89, 0x78, + 0xf7, 0xfe, 0xfd, 0x1d, 0x20, 0x0c, 0xab, 0x00, + 0x70, 0x18, 0x88, 0x78, 0x0a, 0x01, 0x70, 0x59, + 0x70, 0x98, 0x46, 0x68, 0x21, 0x20, 0xf7, 0xfd, + 0xf9, 0xa7, 0x78, 0x38, 0x08, 0x81, 0xd3, 0x05, + 0x09, 0x41, 0xd3, 0x03, 0x09, 0x00, 0xd2, 0x01, + 0xf0, 0x00, 0xfa, 0xcd, 0x22, 0x14, 0x21, 0x00, + 0x20, 0x70, 0x1c, 0x2b, 0xf0, 0x00, 0xf8, 0x0a, + 0x20, 0x01, 0xb0, 0x08, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x80, + 0x00, 0x00, 0x13, 0x88, 0xb5, 0xf0, 0x06, 0x04, + 0x0e, 0x24, 0x04, 0x08, 0x0c, 0x00, 0xb0, 0x83, + 0x90, 0x00, 0x04, 0x10, 0x0c, 0x00, 0x90, 0x01, + 0x04, 0x1e, 0x0c, 0x36, 0xb0, 0x89, 0x98, 0x0a, + 0xf0, 0x00, 0xf9, 0x28, 0x90, 0x00, 0x23, 0x01, + 0x42, 0xd8, 0xd1, 0x00, 0xe0, 0x55, 0x98, 0x00, + 0x01, 0x01, 0x91, 0x0b, 0x4f, 0x2b, 0x19, 0xc8, + 0x70, 0x44, 0x9a, 0x09, 0x80, 0x42, 0x5c, 0x7a, + 0x23, 0x01, 0x43, 0x1a, 0x54, 0x7a, 0x99, 0x0a, + 0x80, 0xc1, 0x1c, 0x05, 0x60, 0x86, 0x20, 0x00, + 0x21, 0x00, 0x00, 0x42, 0xab, 0x01, 0x52, 0x99, + 0x30, 0x01, 0x04, 0x00, 0x14, 0x00, 0x28, 0x10, + 0xdb, 0xf6, 0x02, 0x20, 0x23, 0xff, 0x43, 0x18, + 0xab, 0x01, 0x80, 0x18, 0x2c, 0x02, 0xd0, 0x01, + 0x2c, 0x4e, 0xd1, 0x10, 0x20, 0xff, 0x02, 0x00, + 0x9a, 0x09, 0x40, 0x10, 0x23, 0xff, 0x43, 0x18, + 0xab, 0x01, 0x80, 0x58, 0x9a, 0x09, 0x02, 0x10, + 0x23, 0xff, 0x02, 0x1b, 0x40, 0x18, 0x23, 0xff, + 0x43, 0x18, 0xab, 0x02, 0x80, 0x18, 0x21, 0x04, + 0x98, 0x0a, 0xaa, 0x01, 0xf7, 0xf7, 0xfe, 0x98, + 0x04, 0x01, 0x0c, 0x09, 0x81, 0xa9, 0x20, 0x00, + 0x43, 0xc0, 0x42, 0x81, 0xd1, 0x07, 0x21, 0x00, + 0x9a, 0x0b, 0x54, 0xb9, 0x21, 0xff, 0x70, 0x69, + 0x0c, 0x01, 0x81, 0xa9, 0xe0, 0x0d, 0x99, 0x0b, + 0x5c, 0x78, 0x23, 0x02, 0x43, 0x18, 0x54, 0x78, + 0x2e, 0x00, 0xd0, 0x05, 0x22, 0x02, 0x99, 0x00, + 0x1c, 0x30, 0xf7, 0xfe, 0xfb, 0xe0, 0x80, 0xa8, + 0x20, 0x00, 0xb0, 0x0c, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x90, + 0xb5, 0xf0, 0x04, 0x00, 0x14, 0x00, 0x01, 0x05, + 0x4c, 0x10, 0x5d, 0x60, 0x26, 0x00, 0x28, 0x00, + 0xd1, 0x03, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x19, 0x2f, 0x89, 0xb8, 0xf7, 0xf7, + 0xff, 0xe3, 0x22, 0x00, 0x43, 0xd2, 0x21, 0xff, + 0x42, 0x90, 0xd1, 0x07, 0x55, 0x66, 0x70, 0x79, + 0x0c, 0x00, 0x81, 0xb8, 0x1c, 0x10, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x55, 0x66, 0x70, 0x79, + 0x1c, 0x30, 0x49, 0x03, 0x81, 0xb9, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x8f, 0x90, + 0x00, 0x00, 0xff, 0xff, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0xb5, 0xb0, 0x04, 0x0d, + 0x0c, 0x2d, 0x1c, 0x07, 0xb0, 0x84, 0xf0, 0x00, + 0xf8, 0x2d, 0x23, 0x01, 0x42, 0xd8, 0xd1, 0x01, + 0x20, 0x01, 0xe0, 0x15, 0x1c, 0x28, 0xf7, 0xfd, + 0xf9, 0xb1, 0x1c, 0x04, 0xd0, 0x0f, 0x1c, 0x20, + 0x1c, 0x39, 0x1c, 0x2a, 0xf0, 0x10, 0xf8, 0xca, + 0x20, 0x06, 0xab, 0x00, 0x80, 0x18, 0x70, 0x9d, + 0x94, 0x01, 0x46, 0x69, 0x20, 0x85, 0xf7, 0xfd, + 0xf8, 0xeb, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x02, + 0xb0, 0x04, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x0a, 0xdd, 0x01, + 0x20, 0xff, 0x47, 0x70, 0x01, 0x00, 0x49, 0x02, + 0x18, 0x40, 0x78, 0x40, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x8f, 0x90, 0xb4, 0x90, 0x21, 0x00, + 0x4b, 0x13, 0x01, 0x0a, 0x5c, 0x9f, 0x2f, 0x00, + 0xd0, 0x18, 0x18, 0xd7, 0x78, 0x7c, 0x78, 0x02, + 0x42, 0x94, 0xd1, 0x13, 0x2a, 0x00, 0xd0, 0x0e, + 0x2a, 0x42, 0xd0, 0x0c, 0x2a, 0x70, 0xd0, 0x0a, + 0x2a, 0x73, 0xd0, 0x08, 0x79, 0x02, 0x78, 0xc4, + 0x02, 0x24, 0x19, 0x12, 0x04, 0x12, 0x0c, 0x12, + 0x88, 0x7f, 0x42, 0x97, 0xd1, 0x02, 0x1c, 0x08, + 0xbc, 0x90, 0x47, 0x70, 0x31, 0x01, 0x04, 0x09, + 0x14, 0x09, 0x29, 0x0a, 0xd1, 0xdd, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x8f, 0x90, 0xb4, 0xb0, 0x06, 0x03, + 0x0e, 0x1b, 0x04, 0x0f, 0x0c, 0x3f, 0x06, 0x14, + 0x0e, 0x24, 0x20, 0x00, 0x4a, 0x09, 0x01, 0x01, + 0x18, 0x89, 0x78, 0x4d, 0x42, 0x9d, 0xd1, 0x04, + 0x2c, 0x00, 0xd0, 0x09, 0x88, 0x49, 0x42, 0xb9, + 0xd0, 0x06, 0x30, 0x01, 0x04, 0x00, 0x14, 0x00, + 0x28, 0x0a, 0xd1, 0xf0, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0xb0, 0x47, 0x70, 0x2e, 0x08, 0x8f, 0x90, + 0xb4, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, + 0x49, 0x09, 0x01, 0x03, 0x5c, 0xcf, 0x2f, 0x00, + 0xd0, 0x06, 0x18, 0x5b, 0x89, 0x9b, 0x42, 0x93, + 0xd1, 0x02, 0x20, 0xff, 0xbc, 0x80, 0x47, 0x70, + 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x28, 0x0a, + 0xdb, 0xef, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, + 0x2e, 0x08, 0x8f, 0x90, 0x48, 0x0a, 0x21, 0x00, + 0x4a, 0x0a, 0x01, 0x0b, 0x5c, 0xd3, 0x2b, 0x00, + 0xd1, 0x00, 0x1c, 0x08, 0x31, 0x01, 0x04, 0x09, + 0x0c, 0x09, 0x29, 0x0a, 0xdb, 0xf5, 0x4b, 0x04, + 0x42, 0x98, 0xd0, 0x02, 0x04, 0x00, 0x14, 0x00, + 0x47, 0x70, 0x20, 0x00, 0x43, 0xc0, 0x47, 0x70, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x8f, 0x90, + 0xb4, 0x80, 0x04, 0x07, 0x0c, 0x3f, 0x20, 0x00, + 0x49, 0x0b, 0x88, 0x4a, 0x2a, 0x00, 0xdd, 0x10, + 0x68, 0xc9, 0x00, 0xc3, 0x18, 0x1b, 0x00, 0x9b, + 0x18, 0xcb, 0x89, 0xdb, 0x42, 0xbb, 0xd1, 0x05, + 0x00, 0xc3, 0x18, 0x18, 0x00, 0x80, 0x18, 0x08, + 0xbc, 0x80, 0x47, 0x70, 0x30, 0x01, 0x42, 0x82, + 0xdc, 0xef, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, + 0x2e, 0x08, 0x8f, 0x80, 0xb5, 0x90, 0x06, 0x03, + 0x0e, 0x1b, 0x06, 0x0c, 0x0e, 0x24, 0x06, 0x00, + 0x0e, 0x00, 0x01, 0x02, 0x48, 0x16, 0x18, 0x11, + 0x27, 0x00, 0x2c, 0x0a, 0xd0, 0x0c, 0x2c, 0x0b, + 0xd1, 0x06, 0x2b, 0x0a, 0xda, 0x04, 0x54, 0x87, + 0x20, 0xff, 0x70, 0x48, 0x48, 0x11, 0x81, 0x88, + 0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2b, 0x0a, 0xda, 0xf9, 0x5c, 0x84, 0x23, 0x02, + 0x43, 0x23, 0x54, 0x83, 0x78, 0x48, 0x28, 0x00, + 0xd0, 0x0b, 0x28, 0x02, 0xd1, 0xf0, 0x88, 0x48, + 0xf7, 0xff, 0xff, 0xba, 0x28, 0x00, 0xd0, 0xeb, + 0x7f, 0x01, 0x23, 0x10, 0x43, 0x19, 0x77, 0x01, + 0xe7, 0xe6, 0x48, 0x05, 0x78, 0x01, 0x23, 0x40, + 0x43, 0x19, 0x70, 0x01, 0xe7, 0xe0, 0x00, 0x00, + 0x2e, 0x08, 0x8f, 0x90, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x8f, 0x80, 0xb5, 0x90, 0x04, 0x07, + 0x14, 0x3f, 0x2f, 0x0a, 0xda, 0x25, 0x2f, 0x00, + 0xdb, 0x23, 0x01, 0x38, 0x49, 0x17, 0x18, 0x44, + 0x78, 0x60, 0x28, 0x02, 0xd1, 0x0d, 0x88, 0x60, + 0xf7, 0xff, 0xff, 0x96, 0x28, 0x00, 0xd0, 0x08, + 0x7f, 0x01, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x19, + 0x77, 0x01, 0x7f, 0x01, 0x23, 0xa0, 0x43, 0x19, + 0x77, 0x01, 0x78, 0x60, 0x28, 0x42, 0xd1, 0x09, + 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0xa5, 0x4b, 0x0c, + 0x22, 0x11, 0x21, 0x00, 0x20, 0x42, 0xf7, 0xff, + 0xfe, 0x2d, 0xe0, 0x02, 0x1c, 0x38, 0xf7, 0xff, + 0xfe, 0x9b, 0xf7, 0xff, 0xfd, 0xb4, 0x28, 0x00, + 0xd1, 0x03, 0xf7, 0xff, 0xfd, 0xb0, 0x28, 0x00, + 0xd0, 0xfb, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x90, + 0x00, 0x00, 0x27, 0x10, 0xb5, 0xb0, 0x04, 0x05, + 0x0c, 0x2d, 0x24, 0x00, 0x27, 0x00, 0x48, 0x0e, + 0x21, 0x07, 0xf7, 0xfe, 0xff, 0x4b, 0x1c, 0x28, + 0xf7, 0xff, 0xff, 0x5e, 0x28, 0x00, 0xd0, 0x0e, + 0x8a, 0x41, 0x29, 0x00, 0xd0, 0x00, 0x1c, 0x0f, + 0x69, 0x40, 0x28, 0x00, 0xd0, 0x03, 0x88, 0x00, + 0x42, 0x88, 0xd0, 0x00, 0x1c, 0x04, 0x42, 0xbc, + 0xd0, 0x01, 0xf7, 0xf2, 0xf9, 0x27, 0x20, 0x00, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x90, 0x30, 0xb5, 0x90, 0x04, 0x0c, + 0x0c, 0x24, 0x1c, 0x07, 0x69, 0x40, 0x28, 0x00, + 0xd0, 0x06, 0x8b, 0x39, 0x1c, 0x4a, 0x00, 0xd2, + 0x00, 0xc9, 0xf7, 0xfd, 0xf8, 0x4c, 0xe0, 0x02, + 0x20, 0x08, 0xf7, 0xfd, 0xf8, 0x43, 0x61, 0x78, + 0x69, 0x78, 0x28, 0x00, 0xd0, 0x0e, 0x8b, 0x39, + 0x31, 0x01, 0x83, 0x39, 0x8b, 0x39, 0x00, 0xc9, + 0x18, 0x40, 0x38, 0x40, 0x87, 0x04, 0x21, 0x00, + 0x8b, 0x3a, 0x00, 0xd2, 0x69, 0x78, 0x18, 0x80, + 0x38, 0x20, 0x76, 0x81, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0xb4, 0xb0, 0x06, 0x09, 0x0e, 0x09, + 0x04, 0x12, 0x0c, 0x12, 0x06, 0x1b, 0x0e, 0x1b, + 0x9f, 0x03, 0x06, 0x3c, 0x0e, 0x24, 0x27, 0x9f, + 0x70, 0x07, 0x27, 0x80, 0x70, 0x47, 0x27, 0x32, + 0x70, 0x87, 0x27, 0x82, 0x70, 0xc7, 0x27, 0x00, + 0x71, 0x07, 0x25, 0x06, 0x71, 0x45, 0x71, 0x81, + 0x0a, 0x11, 0x71, 0xc1, 0x72, 0x02, 0x08, 0x59, + 0x43, 0x21, 0x72, 0x41, 0x72, 0x87, 0x72, 0xc7, + 0x1c, 0x38, 0xbc, 0xb0, 0x47, 0x70, 0xb5, 0xb0, + 0x04, 0x14, 0x0c, 0x24, 0x1c, 0x07, 0x79, 0x00, + 0x02, 0x00, 0x79, 0x7a, 0x43, 0x10, 0x04, 0x05, + 0x0c, 0x2d, 0x1d, 0xf8, 0x30, 0x05, 0x1c, 0x22, + 0xf0, 0x0f, 0xff, 0x1c, 0x19, 0x28, 0x04, 0x00, + 0x0c, 0x00, 0x12, 0x01, 0x71, 0x39, 0x71, 0x78, + 0x0a, 0x20, 0x72, 0xb8, 0x72, 0xfc, 0x20, 0x00, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, + 0x04, 0x15, 0x0c, 0x2d, 0x1c, 0x07, 0x79, 0x00, + 0x02, 0x00, 0x79, 0x7a, 0x43, 0x10, 0x04, 0x04, + 0x0c, 0x24, 0x19, 0x38, 0x30, 0x06, 0x1c, 0x2a, + 0xf0, 0x0f, 0xff, 0x00, 0x19, 0x60, 0x04, 0x00, + 0x0c, 0x00, 0x12, 0x01, 0x71, 0x39, 0x71, 0x78, + 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf3, 0x79, 0x08, 0x02, 0x00, 0x1c, 0x0f, + 0x79, 0x49, 0x43, 0x08, 0x04, 0x00, 0x0c, 0x00, + 0x25, 0x9f, 0x23, 0x80, 0x22, 0x32, 0x28, 0x80, + 0xda, 0x04, 0x24, 0x04, 0x70, 0xbd, 0x70, 0xfb, + 0x71, 0x3a, 0xe0, 0x07, 0x28, 0xff, 0xda, 0x07, + 0x24, 0x05, 0x70, 0x7d, 0x70, 0xbb, 0x70, 0xfa, + 0x21, 0x81, 0x71, 0x39, 0x71, 0x78, 0xe0, 0x00, + 0x24, 0x06, 0x19, 0x00, 0x1c, 0x06, 0xf7, 0xfc, + 0xff, 0xb5, 0x1c, 0x05, 0xd0, 0x0a, 0x20, 0x06, + 0x1b, 0x00, 0x19, 0xc1, 0x1c, 0x28, 0x1c, 0x32, + 0xf0, 0x0f, 0xfe, 0xcc, 0x98, 0x00, 0x60, 0x85, + 0x98, 0x00, 0x81, 0x86, 0x20, 0x00, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x47, 0x70, + 0xb5, 0xf0, 0x06, 0x12, 0x0e, 0x12, 0xb0, 0x81, + 0x92, 0x00, 0x25, 0x00, 0x1c, 0x04, 0x1c, 0x0f, + 0x28, 0x00, 0xd0, 0x01, 0x2f, 0x00, 0xd1, 0x01, + 0x20, 0x00, 0xe0, 0x34, 0x26, 0x00, 0x1c, 0x20, + 0xf0, 0x0f, 0xff, 0x20, 0x28, 0x00, 0xd9, 0x2a, + 0x5d, 0xa0, 0x28, 0x80, 0xdb, 0x03, 0x28, 0x9f, + 0xdc, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0xff, + 0x9a, 0x00, 0x2a, 0x00, 0xd0, 0x0f, 0x28, 0x87, + 0xd1, 0x01, 0x22, 0xff, 0xe0, 0x00, 0x22, 0x00, + 0x2a, 0x00, 0xd0, 0x10, 0x29, 0x00, 0xd0, 0x0e, + 0x1c, 0x69, 0x04, 0x0a, 0x0c, 0x12, 0x1c, 0x29, + 0x54, 0x78, 0x1c, 0x15, 0xe0, 0x07, 0x29, 0x00, + 0xd0, 0x05, 0x1c, 0x69, 0x04, 0x09, 0x0c, 0x09, + 0x1c, 0x2a, 0x54, 0xb8, 0x1c, 0x0d, 0x1c, 0x70, + 0x04, 0x06, 0x0c, 0x36, 0x1c, 0x20, 0xf0, 0x0f, + 0xfe, 0xf5, 0x42, 0xb0, 0xd8, 0xd4, 0x20, 0x00, + 0x55, 0x78, 0x04, 0x28, 0x14, 0x00, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0xb5, 0xf0, 0x04, 0x0d, 0x0c, 0x2d, 0x26, 0x09, + 0x70, 0x06, 0x1c, 0x07, 0x70, 0x7d, 0x24, 0x00, + 0x2d, 0x00, 0xdd, 0x09, 0x20, 0x08, 0xf7, 0xf2, + 0xff, 0x27, 0x19, 0x39, 0x70, 0x88, 0x1c, 0x60, + 0x06, 0x04, 0x0e, 0x24, 0x42, 0xac, 0xdb, 0xf5, + 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x90, 0x04, 0x0c, 0x0c, 0x24, 0x27, 0x00, + 0x2c, 0x00, 0xdd, 0x07, 0x20, 0x08, 0xf7, 0xf2, + 0xff, 0x13, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, + 0x42, 0xa7, 0xdb, 0xf7, 0x20, 0x02, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x04, 0x0c, + 0x0c, 0x24, 0x27, 0x00, 0x2c, 0x00, 0xdd, 0x07, + 0x20, 0x08, 0xf7, 0xf2, 0xff, 0x01, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0x42, 0xa7, 0xdb, 0xf7, + 0x20, 0x03, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x90, 0x04, 0x0c, 0x0c, 0x24, 0x27, 0x00, + 0x2c, 0x00, 0xdd, 0x07, 0x20, 0x08, 0xf7, 0xf2, + 0xfe, 0xef, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, + 0x42, 0xa7, 0xdb, 0xf7, 0x20, 0x08, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x04, 0x0c, + 0x0c, 0x24, 0x27, 0x00, 0x2c, 0x00, 0xdd, 0x07, + 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0xdd, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0x42, 0xa7, 0xdb, 0xf7, + 0x20, 0x5d, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf0, 0x04, 0x14, 0x0c, 0x24, 0x20, 0x08, + 0xf7, 0xf2, 0xfe, 0xce, 0x4f, 0x37, 0x00, 0xe3, + 0x19, 0x1c, 0x00, 0xa4, 0x68, 0xf9, 0x19, 0x09, + 0x77, 0x88, 0x20, 0x08, 0x1c, 0x26, 0xf7, 0xf2, + 0xfe, 0xc3, 0x06, 0x05, 0x0e, 0x2d, 0x68, 0xf8, + 0x19, 0x80, 0x68, 0x40, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xfc, 0xff, 0x06, 0x1c, 0x68, 0xf7, 0xfc, + 0xfe, 0xdd, 0x68, 0xf9, 0x19, 0x09, 0x60, 0x48, + 0x28, 0x00, 0xd1, 0x0b, 0x26, 0x00, 0x2d, 0x00, + 0xdd, 0x1c, 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0xac, + 0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0x42, 0xae, + 0xdb, 0xf7, 0xe0, 0x13, 0x26, 0x00, 0x2d, 0x00, + 0xdd, 0x0b, 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0xa0, + 0x68, 0xf9, 0x19, 0x09, 0x68, 0x49, 0x55, 0x88, + 0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0x42, 0xae, + 0xdb, 0xf3, 0x21, 0x00, 0x68, 0xf8, 0x19, 0x00, + 0x68, 0x40, 0x55, 0x81, 0x20, 0x08, 0xf7, 0xf2, + 0xfe, 0x8f, 0x06, 0x05, 0x0e, 0x2d, 0x68, 0xf8, + 0x59, 0x00, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfc, + 0xfe, 0xd3, 0x1c, 0x68, 0xf7, 0xfc, 0xfe, 0xaa, + 0x68, 0xf9, 0x51, 0x08, 0x28, 0x00, 0xd1, 0x0b, + 0x27, 0x00, 0x2d, 0x00, 0xdd, 0x1a, 0x20, 0x08, + 0xf7, 0xf2, 0xfe, 0x7a, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0x42, 0xaf, 0xdb, 0xf7, 0xe0, 0x11, + 0x26, 0x00, 0x2d, 0x00, 0xdd, 0x0a, 0x20, 0x08, + 0xf7, 0xf2, 0xfe, 0x6e, 0x68, 0xf9, 0x59, 0x09, + 0x55, 0x88, 0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, + 0x42, 0xae, 0xdb, 0xf4, 0x21, 0x00, 0x68, 0xf8, + 0x59, 0x00, 0x55, 0x81, 0x20, 0x48, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x8f, 0x80, + 0xb5, 0xf0, 0x04, 0x0d, 0x0c, 0x2d, 0x20, 0x18, + 0xf7, 0xf2, 0xfe, 0x56, 0x4f, 0x4e, 0x1d, 0xfc, + 0x34, 0x39, 0x7a, 0xa0, 0x28, 0x00, 0xd0, 0x0e, + 0x28, 0x01, 0xd0, 0x0c, 0x27, 0x00, 0x1e, 0xec, + 0x2c, 0x00, 0xdd, 0x68, 0x20, 0x08, 0xf7, 0xf2, + 0xfe, 0x47, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, + 0x42, 0xbc, 0xdc, 0xf7, 0xe0, 0x84, 0x28, 0x00, + 0xd1, 0x01, 0x21, 0x02, 0xe0, 0x00, 0x21, 0x01, + 0x1c, 0x38, 0xf7, 0xfe, 0xfd, 0x3b, 0x20, 0x08, + 0xf7, 0xf2, 0xfe, 0x36, 0x06, 0x05, 0x0e, 0x2d, + 0x1c, 0x68, 0xf7, 0xfc, 0xfe, 0x57, 0x7a, 0xa1, + 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, 0x50, 0x78, + 0x28, 0x00, 0xd1, 0x0b, 0x26, 0x00, 0x2d, 0x00, + 0xdd, 0x29, 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0x24, + 0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0x42, 0xae, + 0xdb, 0xf7, 0xe0, 0x20, 0x26, 0x00, 0x2d, 0x00, + 0xdd, 0x0d, 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0x18, + 0x7a, 0xa1, 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, + 0x58, 0x79, 0x55, 0x88, 0x1c, 0x70, 0x06, 0x06, + 0x0e, 0x36, 0x42, 0xae, 0xdb, 0xf1, 0x20, 0x00, + 0x7a, 0xa1, 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, + 0x58, 0x79, 0x55, 0x88, 0x7a, 0xa0, 0x00, 0xc3, + 0x1a, 0x18, 0x00, 0x80, 0x58, 0x39, 0x22, 0x00, + 0x1c, 0x08, 0xf7, 0xff, 0xfe, 0x81, 0x20, 0x08, + 0xf7, 0xf2, 0xfd, 0xfa, 0x06, 0x06, 0x0e, 0x36, + 0x1c, 0x70, 0xf7, 0xfc, 0xfe, 0x1b, 0x7a, 0xa1, + 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, 0x19, 0xc9, + 0x60, 0x48, 0x28, 0x00, 0xd1, 0x0c, 0x27, 0x00, + 0x2e, 0x00, 0xdd, 0x08, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0xe7, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, + 0x42, 0xb7, 0xdb, 0xf7, 0xe0, 0x24, 0xe0, 0x23, + 0x25, 0x00, 0x2e, 0x00, 0xdd, 0x0e, 0x20, 0x08, + 0xf7, 0xf2, 0xfd, 0xda, 0x7a, 0xa1, 0x00, 0xcb, + 0x1a, 0x59, 0x00, 0x89, 0x19, 0xc9, 0x68, 0x49, + 0x55, 0x48, 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, + 0x42, 0xb5, 0xdb, 0xf0, 0x20, 0x00, 0x7a, 0xa1, + 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, 0x19, 0xc9, + 0x68, 0x49, 0x55, 0x48, 0x7a, 0xa0, 0x00, 0xc3, + 0x1a, 0x18, 0x00, 0x80, 0x19, 0xc0, 0x68, 0x41, + 0x22, 0x00, 0x1c, 0x08, 0xf7, 0xff, 0xfe, 0x40, + 0x20, 0x4d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x90, 0x30, 0xb5, 0xf0, 0x1c, 0x07, + 0x20, 0x04, 0xb0, 0x81, 0xf7, 0xf2, 0xfd, 0xb0, + 0x20, 0x04, 0xf7, 0xf2, 0xfd, 0xad, 0x20, 0x18, + 0xf7, 0xf2, 0xfd, 0xaa, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0xa7, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, + 0x26, 0x00, 0x28, 0x00, 0xdd, 0x2e, 0x20, 0x08, + 0xf7, 0xf2, 0xfd, 0x9e, 0x04, 0x05, 0x0c, 0x2d, + 0x24, 0x00, 0x2d, 0x00, 0xdd, 0x08, 0x20, 0x08, + 0xf7, 0xf2, 0xfd, 0x96, 0x55, 0x38, 0x1c, 0x60, + 0x04, 0x04, 0x0c, 0x24, 0x42, 0xac, 0xdb, 0xf6, + 0x20, 0x20, 0x55, 0x78, 0x19, 0x70, 0x06, 0x06, + 0x0e, 0x36, 0x20, 0x08, 0xf7, 0xf2, 0xfd, 0x88, + 0x04, 0x04, 0x0c, 0x24, 0x25, 0x00, 0x2c, 0x00, + 0xdd, 0x08, 0x20, 0x08, 0xf7, 0xf2, 0xfd, 0x80, + 0x55, 0x78, 0x1c, 0x68, 0x04, 0x05, 0x0c, 0x2d, + 0x42, 0xa5, 0xdb, 0xf6, 0x20, 0x00, 0x55, 0x38, + 0x19, 0x30, 0x06, 0x06, 0x0e, 0x36, 0x98, 0x00, + 0x42, 0x86, 0xdb, 0xd0, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0x6f, 0x04, 0x05, 0x0c, 0x2d, 0x24, 0x00, + 0x2d, 0x00, 0xdd, 0x08, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0x67, 0x55, 0x38, 0x1c, 0x60, 0x06, 0x04, + 0x0e, 0x24, 0x42, 0xac, 0xdb, 0xf6, 0x20, 0x00, + 0x55, 0x78, 0x20, 0x4e, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x04, 0x0c, + 0x0c, 0x24, 0x26, 0x00, 0x2c, 0x00, 0xdd, 0x24, + 0x4d, 0x14, 0x20, 0x18, 0xf7, 0xf2, 0xfd, 0x50, + 0x68, 0x29, 0x42, 0x88, 0xd1, 0x12, 0x20, 0x06, + 0xf7, 0xf2, 0xfd, 0x4a, 0x20, 0x01, 0xf7, 0xf2, + 0xfd, 0x47, 0x20, 0x01, 0xf7, 0xf2, 0xfd, 0x44, + 0x20, 0x10, 0xf7, 0xf2, 0xfd, 0x41, 0x20, 0x28, + 0xf7, 0xf2, 0xfd, 0x3e, 0x20, 0x10, 0xf7, 0xf2, + 0xfd, 0x3b, 0xe0, 0x08, 0x27, 0x00, 0x20, 0x08, + 0xf7, 0xf2, 0xfd, 0x36, 0x1c, 0x78, 0x04, 0x07, + 0x0c, 0x3f, 0x2f, 0x0a, 0xdb, 0xf7, 0x42, 0xa6, + 0xdb, 0xdb, 0x20, 0x58, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xd0, + 0xb5, 0xb0, 0x1c, 0x07, 0x04, 0x08, 0x0c, 0x00, + 0x24, 0x00, 0x08, 0x85, 0x2d, 0x00, 0xdd, 0x17, + 0x2c, 0x00, 0xd1, 0x0d, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0x1b, 0x70, 0x38, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0x17, 0x70, 0x78, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0x13, 0x70, 0xb8, 0x20, 0x08, 0xe0, 0x00, + 0x20, 0x20, 0xf7, 0xf2, 0xfd, 0x0d, 0x1c, 0x60, + 0x06, 0x04, 0x0e, 0x24, 0x42, 0xa5, 0xdc, 0xe7, + 0x20, 0x0a, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x90, 0x04, 0x0c, 0x0c, 0x24, 0x27, 0x00, + 0x2c, 0x00, 0xdd, 0x07, 0x20, 0x08, 0xf7, 0xf2, + 0xfc, 0xfb, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, + 0x42, 0xa7, 0xdb, 0xf7, 0x20, 0x56, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x04, 0x0c, + 0x0c, 0x24, 0x27, 0x00, 0x2c, 0x00, 0xdd, 0x07, + 0x20, 0x08, 0xf7, 0xf2, 0xfc, 0xe9, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0x42, 0xa7, 0xdb, 0xf7, + 0x20, 0xff, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf7, 0x06, 0x0e, 0x0e, 0x36, 0xb0, 0x83, + 0xf0, 0x0c, 0xfc, 0x22, 0x1c, 0x05, 0xd0, 0x05, + 0x00, 0xa8, 0x30, 0x0c, 0xf7, 0xf7, 0xf8, 0x5c, + 0x1c, 0x04, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x22, + 0x95, 0x01, 0x1d, 0xe0, 0x30, 0x05, 0x90, 0x02, + 0x46, 0x6a, 0xb4, 0x04, 0x25, 0x00, 0x98, 0x04, + 0x1c, 0x31, 0xaa, 0x02, 0x1c, 0x2b, 0x1c, 0x27, + 0xf0, 0x0c, 0xf9, 0xc8, 0xb0, 0x01, 0x98, 0x00, + 0x60, 0x38, 0x28, 0x00, 0xd0, 0x0b, 0x99, 0x05, + 0xf0, 0x0c, 0xfb, 0x9e, 0x28, 0x00, 0xd1, 0x02, + 0x60, 0x7d, 0x1c, 0x38, 0xe0, 0x07, 0x68, 0x38, + 0xa9, 0x01, 0xf0, 0x0c, 0xf9, 0xe7, 0x1c, 0x20, + 0xf7, 0xf7, 0xf8, 0x58, 0x1c, 0x28, 0xb0, 0x03, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xff, 0x9c, 0x0b, 0x9d, 0x09, 0x9e, 0x0a, + 0xb0, 0x8c, 0x4a, 0x78, 0x92, 0x0b, 0x49, 0x78, + 0x91, 0x0a, 0x2c, 0x00, 0xd1, 0x0b, 0x20, 0x00, + 0x00, 0x81, 0x9a, 0x0b, 0x58, 0x51, 0x29, 0x00, + 0xd1, 0x01, 0x1c, 0x04, 0xe0, 0x19, 0x30, 0x01, + 0x28, 0x08, 0xdb, 0xf5, 0xe0, 0x15, 0x2c, 0x08, + 0xd8, 0x07, 0x3c, 0x01, 0x00, 0xa0, 0x9a, 0x0b, + 0x58, 0x10, 0x28, 0x00, 0xd0, 0x0d, 0x20, 0x00, + 0xe0, 0xcf, 0x23, 0x20, 0x99, 0x0a, 0x5e, 0xcc, + 0x1c, 0x60, 0x84, 0x08, 0x99, 0x0a, 0x5e, 0xc8, + 0x28, 0x00, 0xd1, 0x02, 0x20, 0x64, 0x99, 0x0a, + 0x84, 0x08, 0x2e, 0x00, 0xd0, 0x03, 0x2e, 0x01, + 0xd1, 0x03, 0x22, 0x01, 0xe0, 0x02, 0x22, 0x00, + 0xe0, 0x00, 0x22, 0x03, 0x92, 0x01, 0x1c, 0x28, + 0xf0, 0x08, 0xfd, 0xd3, 0x90, 0x00, 0x00, 0x80, + 0x30, 0x80, 0xf7, 0xf6, 0xff, 0xf1, 0x1c, 0x07, + 0xd0, 0xdd, 0x98, 0x00, 0x1d, 0xc2, 0x32, 0x79, + 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfc, 0x9e, + 0x98, 0x00, 0x60, 0xf8, 0x1d, 0xf8, 0x30, 0x79, + 0x61, 0x38, 0x98, 0x0e, 0x86, 0x78, 0x98, 0x0f, + 0x86, 0xb8, 0x98, 0x0c, 0x90, 0x02, 0x99, 0x0d, + 0x91, 0x03, 0x9a, 0x0e, 0x18, 0x80, 0x38, 0x01, + 0x90, 0x04, 0x98, 0x0f, 0x18, 0x08, 0x38, 0x01, + 0x90, 0x05, 0xa8, 0x02, 0x1c, 0x29, 0xf0, 0x08, + 0xfd, 0xb3, 0x61, 0x78, 0x9a, 0x01, 0x2a, 0x00, + 0xd0, 0x0e, 0x2a, 0x01, 0xd1, 0x1e, 0x00, 0x80, + 0xf7, 0xf6, 0xff, 0xc6, 0x61, 0xb8, 0x28, 0x00, + 0xd0, 0x04, 0x69, 0x79, 0x00, 0x8a, 0x21, 0x00, + 0xf0, 0x0f, 0xfc, 0x74, 0x20, 0x01, 0xe0, 0x0b, + 0x00, 0x80, 0xf7, 0xf7, 0xf8, 0x01, 0x61, 0xb8, + 0x28, 0x00, 0xd0, 0x04, 0x69, 0x79, 0x00, 0x8a, + 0x21, 0x00, 0xf0, 0x0f, 0xfc, 0x67, 0x20, 0x00, + 0x86, 0x38, 0x23, 0x01, 0x03, 0xdb, 0x69, 0xf8, + 0x43, 0x18, 0xe0, 0x0d, 0x61, 0xbe, 0x0e, 0x36, + 0x06, 0x36, 0x23, 0x0d, 0x06, 0x9b, 0x42, 0xde, + 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x01, + 0x86, 0x38, 0x69, 0xf8, 0x4b, 0x33, 0x40, 0x18, + 0x61, 0xf8, 0x69, 0xb8, 0x28, 0x00, 0xd1, 0x06, + 0x69, 0x78, 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, + 0xf7, 0xf6, 0xff, 0xb4, 0xe7, 0x7f, 0x68, 0xf8, + 0x90, 0x06, 0x69, 0x38, 0x90, 0x07, 0x69, 0x78, + 0x90, 0x08, 0x69, 0xb8, 0x90, 0x09, 0xa8, 0x02, + 0x1c, 0x21, 0x1d, 0xfa, 0x32, 0x01, 0xb4, 0x07, + 0x1c, 0x2a, 0xb4, 0x04, 0x20, 0x00, 0x9a, 0x05, + 0xa9, 0x0a, 0xab, 0x0c, 0xf0, 0x03, 0xf8, 0x8a, + 0xb0, 0x04, 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x5f, 0xe7, 0x63, 0x2d, 0x00, + 0xd0, 0x09, 0x2d, 0x01, 0xd0, 0x07, 0x2d, 0x02, + 0xd0, 0x05, 0x2d, 0x03, 0xd0, 0x03, 0x23, 0x02, + 0x69, 0xf8, 0x43, 0x18, 0x61, 0xf8, 0x85, 0xfc, + 0x2c, 0x08, 0xd2, 0x02, 0x00, 0xa0, 0x9a, 0x0b, + 0x50, 0x17, 0x20, 0x01, 0x24, 0x00, 0x63, 0xf8, + 0x63, 0xbc, 0x85, 0xbd, 0x21, 0x01, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x0c, 0x99, 0x0a, 0x8c, 0x88, + 0x06, 0x01, 0x0e, 0x09, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0xbe, 0x22, 0x00, 0x21, 0x00, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x93, 0x98, 0x18, 0x60, 0x38, + 0x98, 0x18, 0x28, 0x00, 0xd0, 0x06, 0x22, 0x00, + 0x21, 0x03, 0x1c, 0x23, 0x9c, 0x18, 0x1c, 0x38, + 0xf0, 0x0f, 0xfa, 0xaa, 0x68, 0xb8, 0x60, 0x78, + 0x1c, 0x38, 0xb0, 0x0c, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0xdc, + 0x2e, 0x08, 0x1a, 0xdc, 0xff, 0xff, 0x7f, 0xff, + 0xb5, 0x80, 0x1c, 0x07, 0xb0, 0x82, 0x28, 0x00, + 0xd0, 0x13, 0x68, 0x78, 0x28, 0x00, 0xd1, 0x10, + 0x68, 0xb8, 0x90, 0x00, 0x1d, 0xf8, 0x30, 0x05, + 0x90, 0x01, 0x46, 0x69, 0x68, 0x38, 0xf0, 0x0c, + 0xf8, 0xd1, 0x22, 0x0c, 0x21, 0x00, 0x1c, 0x38, + 0xf0, 0x0f, 0xfb, 0xd4, 0x1c, 0x38, 0xf7, 0xf6, + 0xff, 0x3d, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0xb0, 0x84, + 0x28, 0x00, 0xd1, 0x03, 0xb0, 0x04, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x23, 0x00, + 0x49, 0x1d, 0x00, 0x82, 0x58, 0x8c, 0x42, 0xbc, + 0xd1, 0x00, 0x50, 0x8b, 0x30, 0x01, 0x28, 0x08, + 0xdb, 0xf7, 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0xbc, 0x68, 0xf8, 0x90, 0x00, 0x69, 0x38, + 0x90, 0x01, 0x69, 0x78, 0x90, 0x02, 0x69, 0xb8, + 0x90, 0x03, 0x46, 0x68, 0x1d, 0xc2, 0x32, 0x01, + 0x46, 0x69, 0x68, 0xb8, 0xf0, 0x03, 0xfb, 0x0e, + 0x6a, 0x38, 0x28, 0x00, 0xd0, 0x03, 0x68, 0x41, + 0x39, 0x01, 0x60, 0x41, 0x30, 0x04, 0x69, 0xf8, + 0x0c, 0x00, 0xd3, 0x0c, 0x23, 0x30, 0x5e, 0xf8, + 0x28, 0x00, 0xd1, 0x03, 0x69, 0xb8, 0xf7, 0xf6, + 0xff, 0x31, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02, + 0x69, 0xb8, 0xf7, 0xf6, 0xfe, 0xfb, 0x22, 0x80, + 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfb, 0x8a, + 0x1c, 0x38, 0xf7, 0xf6, 0xfe, 0xf3, 0xe7, 0xbd, + 0x2e, 0x08, 0x1a, 0xdc, 0x28, 0x00, 0xd0, 0x08, + 0x28, 0x01, 0xd0, 0x08, 0x28, 0x02, 0xd0, 0x08, + 0x28, 0x03, 0xd1, 0x08, 0x20, 0xff, 0x30, 0x01, + 0x47, 0x70, 0x20, 0x02, 0x47, 0x70, 0x20, 0x04, + 0x47, 0x70, 0x20, 0x10, 0x47, 0x70, 0x20, 0x00, + 0x47, 0x70, 0xb5, 0x90, 0x1c, 0x07, 0x06, 0x08, + 0x0e, 0x00, 0x06, 0x14, 0x0e, 0x24, 0x28, 0x00, + 0xd0, 0x0a, 0x21, 0x03, 0x68, 0xb8, 0xf0, 0x04, + 0xfc, 0x15, 0x68, 0xb8, 0x1c, 0x21, 0xf0, 0x04, + 0xfc, 0xbd, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x00, 0x68, 0xb8, 0xf0, 0x04, 0xfc, 0x0a, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, + 0x06, 0x09, 0xd0, 0x02, 0x68, 0x80, 0x21, 0x02, + 0xe0, 0x01, 0x68, 0x80, 0x21, 0x00, 0xf0, 0x04, + 0xfb, 0xfd, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, + 0x06, 0x09, 0x0e, 0x09, 0x28, 0x00, 0xd0, 0x02, + 0x68, 0x80, 0xf0, 0x04, 0xfe, 0x03, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0xb0, 0x23, 0x05, 0x43, 0x18, + 0x4d, 0x08, 0x84, 0xa8, 0x27, 0x00, 0x4c, 0x08, + 0x00, 0xb8, 0x58, 0x20, 0x8c, 0xa9, 0x06, 0x09, + 0x0e, 0x09, 0xf7, 0xff, 0xff, 0xe8, 0x37, 0x01, + 0x2f, 0x08, 0xdb, 0xf5, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xdc, + 0x2e, 0x08, 0x1a, 0xdc, 0x48, 0x01, 0x23, 0x24, + 0x5e, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0xdc, + 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x28, 0x00, + 0xd0, 0x15, 0x6a, 0x20, 0x28, 0x00, 0xd0, 0x06, + 0x42, 0xb8, 0xd0, 0x10, 0x68, 0x41, 0x39, 0x01, + 0x60, 0x41, 0x20, 0x00, 0x62, 0x20, 0x2f, 0x00, + 0xd0, 0x09, 0x68, 0xa0, 0x68, 0x39, 0xf0, 0x0c, + 0xf8, 0x0f, 0x28, 0x00, 0xd1, 0x03, 0x62, 0x27, + 0x68, 0x78, 0x30, 0x01, 0x60, 0x78, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x06, 0x09, + 0xd0, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, + 0x68, 0x80, 0xf0, 0x04, 0xfd, 0x03, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0x1c, 0x0c, + 0xd0, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, + 0x68, 0xb8, 0xf0, 0x04, 0xf8, 0x9b, 0x2c, 0x00, + 0xd0, 0x03, 0x23, 0x01, 0x69, 0xf8, 0x43, 0x18, + 0xe0, 0x02, 0x69, 0xf8, 0x08, 0x40, 0x00, 0x40, + 0x61, 0xf8, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x01, 0x21, 0x07, 0x07, 0x09, 0x63, 0x88, + 0x47, 0x70, 0x00, 0x00, 0xb5, 0x90, 0x9c, 0x03, + 0x9f, 0x04, 0xb0, 0x85, 0x91, 0x00, 0x92, 0x01, + 0x93, 0x02, 0x94, 0x03, 0x97, 0x04, 0x68, 0x80, + 0x46, 0x69, 0xf0, 0x0a, 0xff, 0x5f, 0xb0, 0x05, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, + 0xb0, 0x86, 0x98, 0x06, 0x6a, 0x40, 0x68, 0xc3, + 0x93, 0x05, 0x98, 0x06, 0x6b, 0xc0, 0x01, 0x80, + 0x06, 0x05, 0x0e, 0x2d, 0x95, 0x00, 0x68, 0x18, + 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, + 0x08, 0xc0, 0x90, 0x04, 0x99, 0x07, 0x68, 0x48, + 0x99, 0x04, 0x43, 0x48, 0x99, 0x07, 0x68, 0x09, + 0x08, 0xc9, 0x18, 0x0f, 0x97, 0x03, 0x21, 0x00, + 0x91, 0x02, 0x9b, 0x05, 0x68, 0x58, 0x28, 0x00, + 0xdd, 0x5e, 0x23, 0x32, 0x98, 0x06, 0x5e, 0xc0, + 0x9b, 0x09, 0x43, 0x58, 0x9a, 0x08, 0x18, 0x81, + 0x1c, 0x08, 0xd5, 0x00, 0x30, 0x03, 0x10, 0x80, + 0x29, 0x00, 0xda, 0x04, 0x42, 0x49, 0x07, 0x89, + 0x0f, 0x89, 0x42, 0x49, 0xe0, 0x01, 0x07, 0x89, + 0x0f, 0x89, 0x00, 0x4a, 0x9d, 0x00, 0x41, 0x15, + 0x1c, 0x2b, 0x06, 0x2d, 0x0e, 0x2d, 0x27, 0xc0, + 0x40, 0xd7, 0x06, 0x3a, 0x0e, 0x12, 0x9b, 0x06, + 0x69, 0x9b, 0x18, 0x18, 0x9b, 0x05, 0x9f, 0x03, + 0x19, 0xdb, 0x33, 0x88, 0x78, 0x1f, 0x33, 0x01, + 0x93, 0x01, 0x24, 0x00, 0x9b, 0x07, 0x68, 0x9b, + 0x2b, 0x00, 0xd9, 0x23, 0x0a, 0x3b, 0xd3, 0x05, + 0x78, 0x03, 0x43, 0x93, 0x70, 0x03, 0x78, 0x03, + 0x43, 0x2b, 0x70, 0x03, 0x31, 0x01, 0x29, 0x03, + 0xdd, 0x04, 0x22, 0xc0, 0x21, 0x00, 0x9d, 0x00, + 0x30, 0x01, 0xe0, 0x05, 0x10, 0x92, 0x06, 0x12, + 0x0e, 0x12, 0x10, 0xab, 0x06, 0x1d, 0x0e, 0x2d, + 0x00, 0x7b, 0x06, 0x1f, 0x0e, 0x3f, 0x34, 0x01, + 0x07, 0x63, 0xd1, 0x03, 0x9b, 0x01, 0x78, 0x1f, + 0x33, 0x01, 0x93, 0x01, 0x9b, 0x07, 0x68, 0x9b, + 0x42, 0xa3, 0xd8, 0xdb, 0x98, 0x04, 0x9f, 0x03, + 0x18, 0x3f, 0x97, 0x03, 0x9b, 0x09, 0x33, 0x01, + 0x93, 0x09, 0x99, 0x02, 0x31, 0x01, 0x91, 0x02, + 0x9b, 0x05, 0x68, 0x58, 0x42, 0x88, 0xdc, 0xa0, + 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0xff, 0xb0, 0x86, 0x98, 0x06, + 0x6a, 0x40, 0x68, 0xc3, 0x93, 0x05, 0x98, 0x06, + 0x6b, 0xc0, 0x07, 0x06, 0x0f, 0x36, 0x96, 0x00, + 0x01, 0x30, 0x06, 0x06, 0x0e, 0x36, 0x96, 0x01, + 0x68, 0x18, 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, + 0x01, 0x40, 0x08, 0xc0, 0x90, 0x04, 0x68, 0x48, + 0x9a, 0x04, 0x43, 0x50, 0x68, 0x0a, 0x08, 0xd2, + 0x18, 0x17, 0x97, 0x03, 0x22, 0x00, 0x92, 0x02, + 0x9b, 0x05, 0x68, 0x58, 0x28, 0x00, 0xdd, 0x48, + 0x23, 0x32, 0x98, 0x06, 0x5e, 0xc0, 0x9b, 0x09, + 0x43, 0x58, 0x9a, 0x08, 0x18, 0x82, 0x1c, 0x10, + 0xd5, 0x00, 0x30, 0x01, 0x10, 0x40, 0x9b, 0x06, + 0x69, 0x9b, 0x18, 0x18, 0x9b, 0x05, 0x9f, 0x03, + 0x19, 0xdb, 0x1d, 0xdd, 0x35, 0x81, 0x78, 0x2f, + 0x24, 0x00, 0x68, 0x8b, 0x35, 0x01, 0x2b, 0x00, + 0xd9, 0x21, 0x0a, 0x3b, 0xd3, 0x10, 0x08, 0x53, + 0xd3, 0x06, 0x78, 0x06, 0x23, 0xf0, 0x40, 0x33, + 0x70, 0x03, 0x78, 0x03, 0x9e, 0x00, 0xe0, 0x05, + 0x78, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 0x70, 0x03, + 0x78, 0x03, 0x9e, 0x01, 0x43, 0x33, 0x70, 0x03, + 0x32, 0x01, 0x08, 0x53, 0xd2, 0x00, 0x30, 0x01, + 0x00, 0x7b, 0x06, 0x1f, 0x0e, 0x3f, 0x34, 0x01, + 0x07, 0x63, 0xd1, 0x01, 0x78, 0x2f, 0x35, 0x01, + 0x68, 0x8b, 0x42, 0xa3, 0xd8, 0xdd, 0x98, 0x04, + 0x9f, 0x03, 0x18, 0x3f, 0x97, 0x03, 0x9b, 0x09, + 0x33, 0x01, 0x93, 0x09, 0x9a, 0x02, 0x32, 0x01, + 0x92, 0x02, 0x9b, 0x05, 0x68, 0x58, 0x42, 0x90, + 0xdc, 0xb6, 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0xb0, 0x83, + 0x98, 0x03, 0x6a, 0x40, 0x68, 0xc4, 0x98, 0x03, + 0x6b, 0xc0, 0x06, 0x03, 0x0e, 0x1b, 0x93, 0x00, + 0x68, 0x20, 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, + 0x01, 0x40, 0x08, 0xc2, 0x92, 0x02, 0x68, 0x48, + 0x43, 0x50, 0x68, 0x0a, 0x08, 0xd2, 0x18, 0x10, + 0x90, 0x01, 0x25, 0x00, 0x68, 0x60, 0x28, 0x00, + 0xdd, 0x35, 0x23, 0x32, 0x98, 0x03, 0x5e, 0xc0, + 0x9b, 0x06, 0x43, 0x58, 0x9a, 0x05, 0x18, 0x80, + 0x9a, 0x03, 0x69, 0x92, 0x18, 0x17, 0x98, 0x01, + 0x18, 0x20, 0x1d, 0xc6, 0x36, 0x81, 0x78, 0x32, + 0x20, 0x00, 0x68, 0x8b, 0x36, 0x01, 0x2b, 0x00, + 0xd9, 0x16, 0x0a, 0x13, 0xd3, 0x01, 0x9b, 0x00, + 0x70, 0x3b, 0x00, 0x52, 0x06, 0x12, 0x0e, 0x12, + 0xd1, 0x09, 0x1d, 0xc2, 0x32, 0x01, 0x08, 0xd2, + 0x00, 0xd2, 0x1a, 0x10, 0x19, 0xc7, 0x1c, 0x10, + 0x78, 0x32, 0x36, 0x01, 0xe0, 0x01, 0x30, 0x01, + 0x37, 0x01, 0x68, 0x8b, 0x42, 0x83, 0xd8, 0xe8, + 0x98, 0x01, 0x9a, 0x02, 0x18, 0x80, 0x90, 0x01, + 0x9b, 0x06, 0x33, 0x01, 0x93, 0x06, 0x68, 0x60, + 0x35, 0x01, 0x42, 0xa8, 0xdc, 0xc9, 0xb0, 0x03, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xff, 0x23, 0x2c, 0x1c, 0x07, 0x5e, 0xc0, + 0xb0, 0x85, 0x28, 0x01, 0xd0, 0x0f, 0x28, 0x02, + 0xd0, 0x07, 0x28, 0x03, 0xd1, 0x11, 0xab, 0x06, + 0xcb, 0x0e, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x9a, + 0xe0, 0x5d, 0xab, 0x06, 0xcb, 0x0e, 0x1c, 0x38, + 0xf7, 0xff, 0xff, 0x23, 0xe0, 0x57, 0xab, 0x06, + 0xcb, 0x0e, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x97, + 0xe0, 0x51, 0x6a, 0x78, 0x68, 0xc0, 0x90, 0x04, + 0x68, 0x00, 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, + 0x01, 0x40, 0x08, 0xc0, 0x90, 0x03, 0x99, 0x06, + 0x68, 0x48, 0x99, 0x03, 0x43, 0x48, 0x99, 0x06, + 0x68, 0x09, 0x08, 0xc9, 0x18, 0x09, 0x91, 0x02, + 0x21, 0x00, 0x91, 0x01, 0x98, 0x04, 0x68, 0x40, + 0x28, 0x00, 0xdd, 0x38, 0x98, 0x04, 0x99, 0x02, + 0x9e, 0x07, 0x18, 0x40, 0x30, 0x88, 0x78, 0x05, + 0x30, 0x01, 0x90, 0x00, 0x24, 0x00, 0x99, 0x06, + 0x68, 0x88, 0x28, 0x00, 0xd9, 0x1d, 0x0a, 0x28, + 0xd3, 0x05, 0x68, 0xb8, 0x6b, 0xfb, 0x9a, 0x08, + 0x1c, 0x31, 0xf0, 0x0a, 0xfb, 0x7d, 0x00, 0x68, + 0x06, 0x05, 0x0e, 0x2d, 0xd1, 0x0b, 0x1d, 0xe0, + 0x30, 0x01, 0x08, 0xc0, 0x00, 0xc0, 0x1b, 0x01, + 0x19, 0x8e, 0x1c, 0x04, 0x98, 0x00, 0x78, 0x05, + 0x30, 0x01, 0x90, 0x00, 0xe0, 0x01, 0x34, 0x01, + 0x36, 0x01, 0x99, 0x06, 0x68, 0x88, 0x42, 0xa0, + 0xd8, 0xe1, 0x98, 0x03, 0x99, 0x02, 0x18, 0x09, + 0x91, 0x02, 0x9a, 0x08, 0x32, 0x01, 0x92, 0x08, + 0x99, 0x01, 0x31, 0x01, 0x91, 0x01, 0x98, 0x04, + 0x68, 0x40, 0x42, 0x88, 0xdc, 0xc6, 0xb0, 0x05, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x90, 0x1c, 0x07, 0x20, 0x00, 0xb0, 0x88, + 0xf0, 0x08, 0xfa, 0x2b, 0x90, 0x06, 0x00, 0x80, + 0x30, 0x10, 0x00, 0x80, 0xf7, 0xf6, 0xfc, 0x48, + 0x1c, 0x04, 0x20, 0x00, 0x2c, 0x00, 0xd1, 0x03, + 0xb0, 0x08, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1d, 0xe1, 0x31, 0x09, 0x91, 0x07, 0x49, 0x19, + 0x68, 0x4b, 0x1c, 0x5a, 0x60, 0x4a, 0x60, 0x63, + 0x60, 0xe7, 0x68, 0x39, 0x01, 0x09, 0x31, 0x1f, + 0x09, 0x49, 0x01, 0x49, 0x90, 0x00, 0x90, 0x01, + 0x1e, 0x48, 0x90, 0x02, 0x68, 0xe0, 0x68, 0x40, + 0x00, 0xc0, 0x38, 0x01, 0x90, 0x03, 0x46, 0x68, + 0x21, 0x00, 0xf0, 0x08, 0xfa, 0x09, 0x60, 0xa0, + 0x68, 0xe0, 0x30, 0x88, 0x90, 0x05, 0x68, 0xa0, + 0x90, 0x04, 0x46, 0x68, 0x1c, 0x22, 0x68, 0x61, + 0xb4, 0x07, 0x22, 0x00, 0xb4, 0x04, 0x22, 0x01, + 0x20, 0x00, 0xa9, 0x0a, 0xab, 0x08, 0xf0, 0x02, + 0xfd, 0x21, 0xb0, 0x04, 0x28, 0x00, 0xd0, 0x03, + 0x1c, 0x20, 0xf7, 0xf6, 0xfc, 0x2f, 0x24, 0x00, + 0x1c, 0x20, 0xe7, 0xc5, 0x2e, 0x08, 0x1b, 0x04, + 0xb5, 0x80, 0x1c, 0x07, 0xb0, 0x84, 0x28, 0x00, + 0xd0, 0x1a, 0x20, 0x00, 0xf0, 0x08, 0xf9, 0xdd, + 0x90, 0x00, 0x1d, 0xf8, 0x30, 0x09, 0x90, 0x01, + 0x68, 0xb8, 0x90, 0x02, 0x68, 0xf8, 0x30, 0x88, + 0x90, 0x03, 0x46, 0x68, 0x46, 0x69, 0x1d, 0xc2, + 0x32, 0x01, 0x68, 0x38, 0xf0, 0x03, 0xf8, 0x0e, + 0x22, 0x10, 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, + 0xf8, 0xa1, 0x1c, 0x38, 0xf7, 0xf6, 0xfc, 0x0a, + 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xff, 0x23, 0x32, 0x1c, 0x07, 0x5e, 0xc0, + 0x1c, 0x0c, 0x1c, 0x15, 0xb0, 0x8a, 0x42, 0x90, + 0xdd, 0x63, 0x6a, 0x78, 0x28, 0x00, 0xd1, 0x0b, + 0x4e, 0x38, 0x68, 0x30, 0x28, 0x00, 0xd1, 0x05, + 0x48, 0x37, 0xf7, 0xff, 0xff, 0x7d, 0x60, 0x30, + 0x28, 0x00, 0xd0, 0x61, 0x68, 0x30, 0x62, 0x78, + 0x23, 0x01, 0x6b, 0xb8, 0x6a, 0x79, 0x42, 0xd8, + 0xd1, 0x01, 0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, + 0x92, 0x01, 0x68, 0xc8, 0x90, 0x00, 0x68, 0x00, + 0x90, 0x04, 0x98, 0x00, 0x68, 0x40, 0x90, 0x03, + 0x6b, 0xf8, 0x28, 0x01, 0xd1, 0x01, 0x90, 0x02, + 0xe0, 0x11, 0x20, 0x00, 0x90, 0x02, 0x9a, 0x01, + 0x2a, 0x00, 0xd1, 0x0c, 0x1c, 0x20, 0xf0, 0x00, + 0xf8, 0x57, 0x6b, 0xba, 0x99, 0x03, 0xb4, 0x06, + 0x1c, 0x03, 0x9a, 0x0f, 0x1c, 0x38, 0x1c, 0x29, + 0xf7, 0xff, 0xfd, 0x80, 0xb0, 0x02, 0x99, 0x03, + 0x91, 0x08, 0x20, 0x01, 0x90, 0x09, 0x78, 0x20, + 0x28, 0x00, 0xd0, 0x31, 0x23, 0x32, 0x5e, 0xf8, + 0x42, 0xa8, 0xdd, 0x22, 0x78, 0x20, 0x99, 0x00, + 0xf0, 0x00, 0xf8, 0x34, 0x90, 0x07, 0x1c, 0x06, + 0x78, 0x20, 0x07, 0x00, 0x0f, 0x00, 0x99, 0x04, + 0x43, 0x48, 0x90, 0x05, 0x78, 0x20, 0x09, 0x00, + 0x07, 0x40, 0x0f, 0x40, 0x99, 0x03, 0x43, 0x48, + 0x90, 0x06, 0x98, 0x02, 0x34, 0x01, 0x28, 0x00, + 0xd0, 0x0c, 0x99, 0x0d, 0x9a, 0x01, 0xb4, 0x06, + 0x6a, 0x78, 0x68, 0xb9, 0x68, 0x00, 0xaa, 0x07, + 0x1c, 0x2b, 0xf0, 0x0a, 0xfd, 0x81, 0xb0, 0x02, + 0xe0, 0x06, 0xe0, 0x09, 0x9b, 0x0d, 0x1c, 0x38, + 0xa9, 0x05, 0x1c, 0x2a, 0xf7, 0xff, 0xfe, 0xa8, + 0x19, 0xad, 0x78, 0x20, 0x28, 0x00, 0xd1, 0xcd, + 0xb0, 0x0a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1b, 0x04, + 0x2e, 0x03, 0x45, 0xb8, 0x29, 0x00, 0xd1, 0x00, + 0x49, 0x02, 0x06, 0x40, 0x0e, 0x40, 0x18, 0x40, + 0x7a, 0x00, 0x47, 0x70, 0x2e, 0x03, 0x45, 0xb8, + 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0xd1, 0x08, + 0x4f, 0x0c, 0x68, 0x38, 0x28, 0x00, 0xd1, 0x03, + 0x48, 0x0b, 0xf7, 0xff, 0xfe, 0xf9, 0x60, 0x38, + 0x68, 0x3f, 0x25, 0x00, 0x78, 0x20, 0x28, 0x00, + 0xd0, 0x08, 0x78, 0x20, 0x68, 0xf9, 0x34, 0x01, + 0xf7, 0xff, 0xff, 0xe0, 0x19, 0x45, 0x78, 0x20, + 0x28, 0x00, 0xd1, 0xf6, 0x1c, 0x28, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1b, 0x04, + 0x2e, 0x03, 0x45, 0xb8, 0xb5, 0x80, 0x28, 0x00, + 0xd1, 0x08, 0x4f, 0x09, 0x68, 0x38, 0x28, 0x00, + 0xd1, 0x03, 0x48, 0x08, 0xf7, 0xff, 0xfe, 0xd8, + 0x60, 0x38, 0x68, 0x38, 0x28, 0x00, 0xd1, 0x02, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xc0, + 0x68, 0x40, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1b, 0x04, 0x2e, 0x03, 0x45, 0xb8, + 0xb5, 0xf0, 0xb0, 0x83, 0x4a, 0x18, 0x21, 0x00, + 0x20, 0xff, 0x30, 0x01, 0xf7, 0xff, 0xfa, 0xac, + 0x49, 0x16, 0x27, 0x00, 0x64, 0x08, 0x49, 0x16, + 0x91, 0x02, 0x49, 0x16, 0x91, 0x01, 0x49, 0x16, + 0x91, 0x00, 0x4c, 0x16, 0x01, 0x38, 0x06, 0x01, + 0x0e, 0x09, 0x20, 0x10, 0x1c, 0x22, 0x1c, 0x0d, + 0xf7, 0xff, 0xfa, 0x9a, 0x00, 0xbe, 0x99, 0x02, + 0x51, 0x88, 0x20, 0x04, 0x1c, 0x29, 0x1c, 0x22, + 0xf7, 0xff, 0xfa, 0x92, 0x99, 0x01, 0x51, 0x88, + 0x20, 0x02, 0x1c, 0x29, 0x1c, 0x22, 0xf7, 0xff, + 0xfa, 0x8b, 0x99, 0x00, 0x51, 0x88, 0x37, 0x01, + 0x2f, 0x08, 0xdb, 0xe3, 0x20, 0x00, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1b, 0x4c, 0x2e, 0x08, 0x1d, 0x0c, + 0x2e, 0x08, 0x92, 0xbc, 0x2e, 0x08, 0x92, 0xdc, + 0x2e, 0x08, 0x92, 0xfc, 0x2e, 0x08, 0x1b, 0x0c, + 0xb5, 0x80, 0x48, 0x0c, 0xf7, 0xff, 0xfe, 0x84, + 0x4f, 0x0b, 0x64, 0x78, 0x48, 0x0b, 0xf7, 0xff, + 0xfe, 0x7f, 0x64, 0xb8, 0x48, 0x0a, 0xf7, 0xff, + 0xfe, 0x7b, 0x64, 0xf8, 0x20, 0x00, 0x22, 0x00, + 0x49, 0x08, 0x00, 0x83, 0x50, 0xca, 0x30, 0x01, + 0x28, 0x10, 0xdb, 0xfa, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0xcc, 0xa0, + 0x2e, 0x08, 0x1d, 0x0c, 0x2e, 0x03, 0x03, 0x2c, + 0x2e, 0x03, 0x45, 0xb8, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0x90, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, + 0x29, 0x00, 0xd0, 0x0b, 0x29, 0x0f, 0xdc, 0x09, + 0x00, 0x8c, 0x4f, 0x06, 0x59, 0x39, 0x29, 0x00, + 0xd0, 0x04, 0x1c, 0x08, 0xf7, 0xff, 0xfb, 0x91, + 0x20, 0x00, 0x51, 0x38, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0xff, 0x04, 0x05, 0x0c, 0x2d, 0x04, 0x10, + 0x0c, 0x00, 0xb0, 0x82, 0x90, 0x00, 0x04, 0x18, + 0x0c, 0x00, 0x90, 0x01, 0x2d, 0x00, 0xd0, 0x01, + 0x2d, 0x0f, 0xdd, 0x01, 0x20, 0xff, 0xe0, 0x53, + 0x00, 0xaf, 0x4c, 0x2c, 0x59, 0xe0, 0x28, 0x00, + 0xd0, 0x02, 0x1c, 0x28, 0xf7, 0xff, 0xff, 0xd0, + 0x98, 0x00, 0x4a, 0x29, 0x40, 0x02, 0x92, 0x00, + 0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9a, 0xdd, 0x01, + 0x1c, 0x1a, 0x93, 0x00, 0x23, 0x09, 0x01, 0x9b, + 0x98, 0x01, 0x42, 0x98, 0xdd, 0x01, 0x1c, 0x1a, + 0x93, 0x00, 0x2d, 0x08, 0xda, 0x01, 0x20, 0x00, + 0xe0, 0x00, 0x20, 0x01, 0x22, 0x00, 0x21, 0x00, + 0xb4, 0x07, 0x9a, 0x06, 0xb4, 0x04, 0x20, 0x00, + 0x9a, 0x04, 0x9b, 0x05, 0xf7, 0xff, 0xfa, 0x38, + 0x51, 0xe0, 0xb0, 0x04, 0x1c, 0x01, 0xd0, 0xd1, + 0x48, 0x18, 0x6c, 0x82, 0x62, 0x4a, 0x21, 0x01, + 0x59, 0xe2, 0x63, 0xd1, 0x21, 0x00, 0x43, 0xc9, + 0x59, 0xe2, 0x63, 0x91, 0x99, 0x03, 0x29, 0x08, + 0xd2, 0x10, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x06, 0x08, 0x0b, + 0x04, 0x06, 0x08, 0x0b, 0x48, 0x0e, 0xe0, 0x02, + 0x48, 0x0e, 0xe0, 0x00, 0x48, 0x0e, 0x59, 0xc6, + 0xe0, 0x00, 0x6c, 0x06, 0x59, 0xe0, 0x1c, 0x31, + 0xf7, 0xff, 0xfb, 0xd6, 0x59, 0xe0, 0x68, 0x80, + 0x21, 0x07, 0xf0, 0x04, 0xf9, 0xb3, 0x20, 0x00, + 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0x00, 0x00, 0xff, 0xfe, 0x2e, 0x08, 0x1d, 0x0c, + 0x2e, 0x08, 0x92, 0xfc, 0x2e, 0x08, 0x92, 0xdc, + 0x2e, 0x08, 0x92, 0xbc, 0xb5, 0xf0, 0x04, 0x00, + 0x0c, 0x00, 0x04, 0x09, 0x14, 0x09, 0x04, 0x16, + 0x14, 0x36, 0xb0, 0x85, 0x28, 0x07, 0xdc, 0x29, + 0x00, 0x84, 0x4f, 0x21, 0x59, 0x38, 0x28, 0x00, + 0xd0, 0x24, 0x08, 0x49, 0x00, 0x49, 0x04, 0x0d, + 0x14, 0x2d, 0x68, 0x80, 0xa9, 0x01, 0xf0, 0x04, + 0xfa, 0x61, 0x98, 0x01, 0x19, 0x40, 0x90, 0x01, + 0x98, 0x03, 0x19, 0x40, 0x90, 0x03, 0x98, 0x02, + 0x19, 0x80, 0x90, 0x02, 0x98, 0x04, 0x19, 0x80, + 0x90, 0x04, 0x98, 0x01, 0x49, 0x15, 0x42, 0x88, + 0xd8, 0x0c, 0x98, 0x02, 0x42, 0x88, 0xd8, 0x09, + 0x23, 0x2d, 0x01, 0x1b, 0x98, 0x01, 0x42, 0x98, + 0xda, 0x04, 0x23, 0x09, 0x01, 0x9b, 0x98, 0x02, + 0x42, 0x98, 0xdb, 0x01, 0x20, 0xff, 0xe0, 0x12, + 0x59, 0x38, 0x68, 0x80, 0xa9, 0x01, 0xf0, 0x02, + 0xf8, 0x31, 0x59, 0x38, 0x68, 0x80, 0x46, 0x69, + 0xf0, 0x03, 0xff, 0x00, 0x98, 0x00, 0x28, 0x00, + 0xd1, 0x04, 0x59, 0x38, 0x68, 0x80, 0x21, 0x01, + 0xf0, 0x03, 0xfc, 0x44, 0x20, 0x00, 0xb0, 0x05, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x92, 0x7c, 0x80, 0x00, 0x00, 0x00, + 0xb5, 0xf0, 0x04, 0x07, 0x0c, 0x3f, 0x04, 0x0b, + 0x0c, 0x1b, 0x04, 0x16, 0x0c, 0x36, 0x20, 0xff, + 0xb0, 0x85, 0x2f, 0x07, 0xdc, 0x10, 0x00, 0xbc, + 0x4f, 0x1c, 0x59, 0x39, 0x29, 0x00, 0xd0, 0x0b, + 0x08, 0x5a, 0x00, 0x52, 0x04, 0x15, 0x0c, 0x2d, + 0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9d, 0xda, 0x03, + 0x23, 0x09, 0x01, 0x9b, 0x42, 0x9e, 0xdb, 0x03, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x68, 0x88, 0xa9, 0x01, 0xf0, 0x04, 0xfa, 0x02, + 0x98, 0x03, 0x99, 0x01, 0x1a, 0x40, 0x90, 0x03, + 0x19, 0x40, 0x90, 0x03, 0x98, 0x04, 0x99, 0x02, + 0x1a, 0x40, 0x90, 0x04, 0x19, 0x80, 0x90, 0x04, + 0x95, 0x01, 0x96, 0x02, 0x59, 0x38, 0x68, 0x80, + 0xa9, 0x01, 0xf0, 0x01, 0xff, 0xe3, 0x59, 0x38, + 0x68, 0x80, 0x46, 0x69, 0xf0, 0x03, 0xfe, 0xb2, + 0x98, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x59, 0x38, + 0x68, 0x80, 0x21, 0x01, 0xf0, 0x03, 0xfb, 0xf6, + 0x20, 0x00, 0xe7, 0xd5, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x80, + 0x49, 0x04, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x03, + 0x68, 0x80, 0x21, 0x00, 0xf0, 0x03, 0xfb, 0xe6, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0x80, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, + 0x29, 0x07, 0xdc, 0x0c, 0x29, 0x01, 0xdb, 0x0a, + 0x00, 0x88, 0x49, 0x06, 0x58, 0x08, 0x27, 0x00, + 0x28, 0x00, 0xd0, 0x03, 0x68, 0x80, 0x21, 0x01, + 0xf0, 0x03, 0xfa, 0x2c, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x92, 0x7c, + 0x04, 0x01, 0x0c, 0x09, 0x20, 0x00, 0x29, 0x0f, + 0xdc, 0x06, 0x00, 0x89, 0x4a, 0x03, 0x58, 0x51, + 0x29, 0x00, 0xd0, 0x01, 0x23, 0x32, 0x5e, 0xc8, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0x04, 0x01, 0x0c, 0x09, 0x20, 0x00, 0x29, 0x0f, + 0xdc, 0x06, 0x00, 0x89, 0x4a, 0x03, 0x58, 0x51, + 0x29, 0x00, 0xd0, 0x01, 0x23, 0x34, 0x5e, 0xc8, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0xb0, 0x04, 0x03, 0x0c, 0x1b, 0x04, 0x0a, + 0x0c, 0x12, 0x20, 0xff, 0x2b, 0x07, 0xdc, 0x10, + 0x00, 0x9d, 0x4f, 0x09, 0x59, 0x79, 0x29, 0x00, + 0xd0, 0x0b, 0x07, 0x14, 0x0f, 0x24, 0x68, 0x88, + 0x21, 0x03, 0xf0, 0x03, 0xfe, 0x9b, 0x59, 0x78, + 0x68, 0x80, 0x1c, 0x21, 0xf0, 0x03, 0xff, 0x42, + 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x92, 0x7c, 0xb5, 0x00, 0x04, 0x01, + 0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x09, + 0x00, 0x89, 0x4a, 0x05, 0x58, 0x51, 0x29, 0x00, + 0xd0, 0x04, 0x68, 0x88, 0x21, 0x02, 0xf0, 0x03, + 0xfe, 0x81, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x92, 0x7c, 0xb5, 0x00, 0x04, 0x01, + 0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x09, + 0x00, 0x89, 0x4a, 0x05, 0x58, 0x51, 0x29, 0x00, + 0xd0, 0x04, 0x68, 0x88, 0x21, 0x00, 0xf0, 0x03, + 0xfe, 0x6d, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x92, 0x7c, 0xb5, 0xf0, 0x04, 0x05, + 0x0c, 0x2d, 0x04, 0x09, 0x0c, 0x09, 0x04, 0x12, + 0x0c, 0x12, 0x04, 0x1e, 0x0c, 0x36, 0x9c, 0x05, + 0x9f, 0x06, 0x04, 0x24, 0x0c, 0x24, 0x04, 0x3f, + 0x0c, 0x3f, 0x20, 0xff, 0xb0, 0x85, 0x2d, 0x0f, + 0xdc, 0x04, 0x00, 0xab, 0x4d, 0x10, 0x58, 0xed, + 0x2d, 0x00, 0xd1, 0x03, 0xb0, 0x05, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x19, 0x88, 0x23, 0x32, + 0x5e, 0xeb, 0x42, 0x98, 0xdd, 0x02, 0x1a, 0x58, + 0x04, 0x06, 0x0c, 0x36, 0x19, 0x10, 0x23, 0x34, + 0x5e, 0xeb, 0x42, 0x98, 0xdd, 0x02, 0x1a, 0x98, + 0x04, 0x04, 0x0c, 0x24, 0x91, 0x00, 0x92, 0x01, + 0x96, 0x02, 0x94, 0x03, 0x97, 0x04, 0x46, 0x69, + 0x68, 0xa8, 0xf0, 0x0a, 0xfa, 0x13, 0xe7, 0xe1, + 0x2e, 0x08, 0x92, 0x7c, 0xb4, 0x80, 0x04, 0x03, + 0x0c, 0x1b, 0x20, 0x00, 0x29, 0x00, 0xdb, 0x0f, + 0x2a, 0x00, 0xdb, 0x0d, 0x00, 0x9b, 0x4f, 0x07, + 0x58, 0xff, 0x2f, 0x00, 0xd0, 0x08, 0x23, 0x32, + 0x5e, 0xfb, 0x42, 0x8b, 0xdd, 0x04, 0x23, 0x34, + 0x5e, 0xf9, 0x42, 0x91, 0xdd, 0x00, 0x20, 0x01, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0xf0, 0x9c, 0x06, 0x9e, 0x05, 0x04, 0x00, + 0x0c, 0x00, 0xb0, 0x85, 0x90, 0x00, 0x04, 0x08, + 0x14, 0x00, 0x04, 0x17, 0x14, 0x3f, 0x04, 0x1d, + 0x14, 0x2d, 0x04, 0x31, 0x14, 0x09, 0x91, 0x01, + 0x04, 0x23, 0x0c, 0x1b, 0x93, 0x02, 0xb0, 0x82, + 0x99, 0x02, 0x00, 0x89, 0x91, 0x06, 0x4a, 0x71, + 0x92, 0x05, 0x58, 0x51, 0x29, 0x00, 0xd1, 0x01, + 0x20, 0xff, 0xe0, 0xd6, 0x2d, 0x00, 0xda, 0x0e, + 0x19, 0x40, 0x04, 0x00, 0x14, 0x00, 0x42, 0x69, + 0x04, 0x0d, 0x14, 0x2d, 0x99, 0x03, 0x18, 0x79, + 0x04, 0x0f, 0x14, 0x3f, 0x99, 0x03, 0x42, 0x49, + 0x04, 0x09, 0x14, 0x09, 0x91, 0x03, 0x1c, 0x01, + 0x1c, 0x04, 0x98, 0x02, 0x1c, 0x3a, 0xf7, 0xff, + 0xff, 0xb1, 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, + 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, + 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, 0xff, 0x70, + 0x98, 0x03, 0x10, 0x40, 0x90, 0x00, 0x10, 0x6e, + 0x1c, 0x28, 0xb0, 0x82, 0xf0, 0x0e, 0xfd, 0x38, + 0xf0, 0x0e, 0xfd, 0x74, 0x90, 0x00, 0x91, 0x01, + 0x98, 0x05, 0xf0, 0x0e, 0xfd, 0x31, 0xf0, 0x0e, + 0xfd, 0x6d, 0x9a, 0x00, 0x9b, 0x01, 0xb0, 0x02, + 0xf0, 0x0e, 0xfd, 0x6c, 0x28, 0x00, 0xd0, 0x4c, + 0x98, 0x03, 0x28, 0x00, 0xdd, 0x21, 0x26, 0x00, + 0x2d, 0x00, 0xdd, 0x6d, 0x98, 0x00, 0x99, 0x03, + 0x18, 0x40, 0x90, 0x00, 0x34, 0x01, 0x42, 0xa8, + 0xdb, 0x03, 0x98, 0x00, 0x1b, 0x40, 0x90, 0x00, + 0x37, 0x01, 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, + 0xf7, 0xff, 0xff, 0x78, 0x28, 0x00, 0xd0, 0x08, + 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, + 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, + 0xff, 0x37, 0x36, 0x01, 0x42, 0xae, 0xdb, 0xe1, + 0xe0, 0x76, 0x98, 0x03, 0x42, 0x40, 0x04, 0x00, + 0x14, 0x00, 0x90, 0x03, 0x98, 0x00, 0x42, 0x46, + 0x20, 0x00, 0x90, 0x01, 0x2d, 0x00, 0xdd, 0x43, + 0x98, 0x03, 0x18, 0x36, 0x34, 0x01, 0x42, 0xae, + 0xdb, 0x01, 0x1b, 0x76, 0x3f, 0x01, 0x98, 0x02, + 0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x52, + 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, + 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, + 0x1c, 0x3a, 0xf0, 0x09, 0xff, 0x11, 0x98, 0x01, + 0x30, 0x01, 0x90, 0x01, 0x42, 0xa8, 0xdb, 0xe3, + 0xe0, 0x4e, 0x98, 0x03, 0x28, 0x00, 0xdd, 0x24, + 0x20, 0x00, 0x90, 0x01, 0x98, 0x03, 0x28, 0x00, + 0xdd, 0x1e, 0x19, 0x76, 0x99, 0x03, 0x37, 0x01, + 0x42, 0x8e, 0xdb, 0x02, 0x98, 0x03, 0x1a, 0x36, + 0x34, 0x01, 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, + 0xf7, 0xff, 0xff, 0x2c, 0x28, 0x00, 0xd0, 0x08, + 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, + 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, + 0xfe, 0xeb, 0x98, 0x01, 0x30, 0x01, 0x90, 0x01, + 0x99, 0x03, 0x42, 0x88, 0xdb, 0xe1, 0xe0, 0x27, + 0xe0, 0x26, 0x98, 0x03, 0x42, 0x40, 0x04, 0x01, + 0x14, 0x09, 0x91, 0x03, 0x20, 0x00, 0x90, 0x01, + 0x29, 0x00, 0xdd, 0x1d, 0x19, 0x76, 0x99, 0x03, + 0x3f, 0x01, 0x42, 0x8e, 0xdb, 0x02, 0x99, 0x03, + 0x1a, 0x76, 0x34, 0x01, 0x98, 0x02, 0x1c, 0x21, + 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x03, 0x28, 0x00, + 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, + 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, + 0xf0, 0x09, 0xfe, 0xc2, 0x98, 0x01, 0x30, 0x01, + 0x90, 0x01, 0x99, 0x03, 0x42, 0x88, 0xdb, 0xe1, + 0x20, 0x00, 0xb0, 0x07, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0xb4, 0x80, 0x23, 0x00, 0x88, 0x01, 0x0a, 0x0a, + 0x06, 0x12, 0x0e, 0x12, 0x06, 0x09, 0x0e, 0x09, + 0x2a, 0xdf, 0xd0, 0x1a, 0xdc, 0x07, 0x2a, 0xc4, + 0xd0, 0x19, 0x2a, 0xd6, 0xd0, 0x1b, 0x2a, 0xdc, + 0xd1, 0x08, 0x22, 0x1e, 0xe0, 0x06, 0x2a, 0xe4, + 0xd0, 0x13, 0x2a, 0xf6, 0xd0, 0x15, 0x2a, 0xfc, + 0xd1, 0x00, 0x22, 0x1f, 0x29, 0xdf, 0xd0, 0x26, + 0xdc, 0x11, 0x29, 0xc4, 0xd0, 0x25, 0x29, 0xd6, + 0xd0, 0x27, 0x29, 0xdc, 0xd1, 0x12, 0x21, 0x1e, + 0xe0, 0x10, 0x22, 0x19, 0xe7, 0xf2, 0x22, 0x1a, + 0xe7, 0xf0, 0x22, 0x1b, 0xe7, 0xee, 0x22, 0x1c, + 0xe7, 0xec, 0x22, 0x1d, 0xe7, 0xea, 0x29, 0xe4, + 0xd0, 0x15, 0x29, 0xf6, 0xd0, 0x17, 0x29, 0xfc, + 0xd1, 0x00, 0x21, 0x1f, 0x02, 0x17, 0x18, 0x7f, + 0x80, 0x07, 0x30, 0x02, 0x2a, 0x00, 0xd0, 0x04, + 0x29, 0x00, 0xd0, 0x02, 0x33, 0x01, 0x2b, 0x70, + 0xdb, 0xc0, 0xbc, 0x80, 0x47, 0x70, 0x21, 0x19, + 0xe7, 0xf0, 0x21, 0x1a, 0xe7, 0xee, 0x21, 0x1b, + 0xe7, 0xec, 0x21, 0x1c, 0xe7, 0xea, 0x21, 0x1d, + 0xe7, 0xe8, 0xb5, 0xf0, 0x1c, 0x0f, 0x1c, 0x11, + 0x04, 0x02, 0x0c, 0x12, 0x04, 0x0c, 0x0c, 0x24, + 0x04, 0x1d, 0x0c, 0x2d, 0x00, 0x96, 0xb0, 0x81, + 0x48, 0x10, 0x90, 0x00, 0x59, 0x81, 0x20, 0xff, + 0x29, 0x00, 0xd0, 0x16, 0x2a, 0x00, 0xd0, 0x14, + 0x2a, 0x0f, 0xdc, 0x12, 0x23, 0x32, 0x5e, 0xca, + 0x42, 0xa2, 0xdb, 0x0e, 0x23, 0x34, 0x5e, 0xc9, + 0x42, 0xa9, 0xdb, 0x0a, 0x1c, 0x38, 0xf7, 0xff, + 0xff, 0x93, 0x98, 0x00, 0x59, 0x80, 0x1c, 0x39, + 0x1c, 0x22, 0x1c, 0x2b, 0xf7, 0xff, 0xfb, 0x5c, + 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0xb4, 0xb0, 0x04, 0x07, 0x0c, 0x3f, 0x04, 0x09, + 0x0c, 0x09, 0x04, 0x14, 0x14, 0x24, 0x04, 0x1a, + 0x14, 0x12, 0x20, 0xff, 0x2f, 0x0f, 0xdc, 0x1d, + 0x00, 0xbd, 0x4f, 0x0f, 0x59, 0x7b, 0x2b, 0x00, + 0xd0, 0x18, 0x48, 0x0e, 0x29, 0x01, 0xd0, 0x05, + 0x29, 0x02, 0xd0, 0x01, 0x29, 0x03, 0xd0, 0x03, + 0x6c, 0x80, 0xe0, 0x02, 0x6c, 0x40, 0xe0, 0x00, + 0x6c, 0xc0, 0x62, 0x58, 0x59, 0x78, 0x63, 0xc4, + 0x20, 0x00, 0x43, 0xc0, 0x42, 0x82, 0xd1, 0x02, + 0x59, 0x79, 0x63, 0x88, 0xe0, 0x01, 0x59, 0x78, + 0x63, 0x82, 0x20, 0x00, 0xbc, 0xb0, 0x47, 0x70, + 0x2e, 0x08, 0x92, 0x7c, 0x2e, 0x08, 0x1d, 0x0c, + 0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09, + 0x0c, 0x09, 0x00, 0x80, 0x4a, 0x07, 0x58, 0x10, + 0x28, 0x00, 0xd1, 0x02, 0x20, 0xff, 0xbc, 0x08, + 0x47, 0x18, 0x07, 0x89, 0x0f, 0x89, 0x68, 0x80, + 0xf0, 0x03, 0xfe, 0x6c, 0x20, 0x00, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0x80, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x12, + 0x0c, 0x12, 0x1c, 0x1f, 0x28, 0x07, 0xdc, 0x1f, + 0x28, 0x01, 0xdb, 0x1d, 0x00, 0x80, 0x4b, 0x10, + 0x58, 0x1b, 0x2b, 0x00, 0xd0, 0x18, 0x29, 0x02, + 0xd0, 0x0e, 0x29, 0x04, 0xd0, 0x0c, 0x29, 0x10, + 0xd0, 0x0a, 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, + 0xd1, 0x0e, 0x06, 0x12, 0x0e, 0x12, 0x1c, 0x39, + 0x48, 0x08, 0x6c, 0x00, 0x68, 0x00, 0xe0, 0x05, + 0x07, 0x12, 0x0f, 0x12, 0x49, 0x06, 0x58, 0x08, + 0x68, 0x00, 0x1c, 0x39, 0xf0, 0x0b, 0xfa, 0xf2, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x92, 0x7c, 0x2e, 0x08, 0x1d, 0x0c, + 0x2e, 0x08, 0x92, 0xbc, 0xb5, 0xf0, 0x04, 0x07, + 0x0c, 0x3f, 0x04, 0x10, 0x0c, 0x00, 0x22, 0x00, + 0xb0, 0x85, 0x92, 0x00, 0x2f, 0x07, 0xdc, 0x74, + 0x2f, 0x01, 0xdb, 0x73, 0x00, 0xbe, 0x4a, 0x3e, + 0x59, 0x92, 0x2a, 0x00, 0xd0, 0x6f, 0x04, 0x1a, + 0x0c, 0x12, 0x07, 0xd5, 0x0f, 0xed, 0x24, 0x02, + 0x40, 0x14, 0x27, 0x04, 0x40, 0x17, 0x23, 0x08, + 0x40, 0x1a, 0x92, 0x04, 0x29, 0x02, 0xd0, 0x34, + 0x29, 0x04, 0xd0, 0x32, 0x29, 0x10, 0xd0, 0x30, + 0x01, 0x5b, 0x42, 0x99, 0xd1, 0x60, 0x06, 0x02, + 0x0e, 0x12, 0x46, 0x69, 0x1c, 0x16, 0x48, 0x31, + 0x90, 0x01, 0x6c, 0x00, 0x68, 0x00, 0xf0, 0x0b, + 0xfa, 0xe9, 0x98, 0x00, 0x4b, 0x2e, 0x40, 0x18, + 0x90, 0x00, 0x2d, 0x00, 0xd0, 0x02, 0x23, 0x02, + 0x43, 0x18, 0x90, 0x00, 0x2c, 0x00, 0xd0, 0x04, + 0x23, 0x01, 0x04, 0x5b, 0x98, 0x00, 0x43, 0x18, + 0x90, 0x00, 0x2f, 0x00, 0xd0, 0x03, 0x23, 0x01, + 0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x9a, 0x04, + 0x2a, 0x00, 0xd0, 0x04, 0x23, 0x01, 0x04, 0x1b, + 0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x98, 0x01, + 0x99, 0x00, 0x6c, 0x00, 0x68, 0x00, 0x1c, 0x32, + 0xe0, 0x30, 0x07, 0x02, 0x0f, 0x12, 0x92, 0x03, + 0x48, 0x1c, 0x90, 0x02, 0x59, 0x80, 0x68, 0x00, + 0x46, 0x69, 0xf0, 0x0b, 0xfa, 0xbb, 0x98, 0x00, + 0x4b, 0x17, 0x40, 0x18, 0x90, 0x00, 0x2d, 0x00, + 0xd0, 0x02, 0x23, 0x02, 0x43, 0x18, 0x90, 0x00, + 0x2c, 0x00, 0xd0, 0x04, 0x23, 0x01, 0x04, 0x5b, + 0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x2f, 0x00, + 0xd0, 0x03, 0x23, 0x01, 0x98, 0x00, 0x43, 0x18, + 0x90, 0x00, 0x9a, 0x04, 0x2a, 0x00, 0xd0, 0x04, + 0x23, 0x01, 0x04, 0x1b, 0x98, 0x00, 0x43, 0x18, + 0x90, 0x00, 0x98, 0x02, 0x9a, 0x03, 0x59, 0x80, + 0xe0, 0x02, 0xe0, 0x05, 0xe0, 0x04, 0xe0, 0x03, + 0x68, 0x00, 0x99, 0x00, 0xf0, 0x0b, 0xfa, 0x62, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x92, 0x7c, 0x2e, 0x08, 0x1d, 0x0c, + 0xff, 0xfc, 0xff, 0xfc, 0x2e, 0x08, 0x92, 0xbc, + 0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, + 0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36, 0xb0, 0x85, + 0xa8, 0x01, 0x49, 0x48, 0xc9, 0x8e, 0xc0, 0x8e, + 0x2c, 0x00, 0xd0, 0x07, 0x2c, 0x01, 0xd0, 0x07, + 0x2c, 0x02, 0xd0, 0x07, 0x2c, 0x03, 0xd1, 0x74, + 0x20, 0x08, 0xe0, 0x04, 0x20, 0x01, 0xe0, 0x02, + 0x20, 0x02, 0xe0, 0x00, 0x20, 0x04, 0x90, 0x00, + 0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9d, 0xdc, 0x69, + 0x23, 0x09, 0x01, 0x9b, 0x42, 0x9e, 0xdc, 0x65, + 0x1e, 0x68, 0x90, 0x03, 0x1e, 0x70, 0x90, 0x04, + 0xa8, 0x01, 0x1c, 0x21, 0xf0, 0x07, 0xfb, 0xe4, + 0x4f, 0x37, 0x60, 0x78, 0x00, 0x80, 0x23, 0x01, + 0x04, 0x1b, 0x42, 0x98, 0xdc, 0x56, 0x1f, 0xf8, + 0x38, 0x79, 0x67, 0xc4, 0x68, 0x38, 0x28, 0x00, + 0xd0, 0x0a, 0x68, 0x80, 0xb0, 0x81, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x00, 0xf0, 0x09, 0xfd, 0x6e, + 0x68, 0x38, 0xf7, 0xfe, 0xfe, 0xd2, 0xb0, 0x01, + 0x22, 0x00, 0x21, 0x0a, 0x20, 0x01, 0xb4, 0x07, + 0x1c, 0x22, 0xb4, 0x04, 0x21, 0x00, 0x20, 0x00, + 0x1c, 0x2a, 0x1c, 0x33, 0xf7, 0xfe, 0xfd, 0xac, + 0x60, 0x38, 0xb0, 0x04, 0x28, 0x00, 0xd0, 0x40, + 0x69, 0x84, 0x98, 0x00, 0x43, 0x45, 0x1d, 0xe8, + 0xd5, 0x00, 0x30, 0x07, 0x10, 0xc0, 0x43, 0x70, + 0x1c, 0x01, 0x60, 0x78, 0x20, 0x00, 0x29, 0x00, + 0xdd, 0x05, 0x21, 0x00, 0x54, 0x21, 0x68, 0x7a, + 0x30, 0x01, 0x42, 0x90, 0xdb, 0xfa, 0x20, 0x01, + 0x02, 0x80, 0xf7, 0xf0, 0xff, 0x55, 0x28, 0x00, + 0xdb, 0xf9, 0x4d, 0x18, 0x1c, 0x28, 0xf7, 0xf0, + 0xff, 0x6f, 0x28, 0x00, 0xdb, 0xfa, 0x68, 0x78, + 0x28, 0x00, 0xdd, 0x14, 0x68, 0x78, 0x04, 0x00, + 0x0c, 0x00, 0xf7, 0xf0, 0xff, 0x45, 0x28, 0x00, + 0xdb, 0xf8, 0x1c, 0x20, 0xf7, 0xf0, 0xff, 0x60, + 0x28, 0x00, 0xdb, 0xfa, 0x18, 0x24, 0x68, 0x79, + 0x1a, 0x08, 0x60, 0x78, 0x28, 0x00, 0xdc, 0xed, + 0xe0, 0x01, 0xe0, 0x0a, 0xe0, 0x09, 0x20, 0x00, + 0xf7, 0xf0, 0xff, 0x32, 0x28, 0x00, 0xd1, 0xfa, + 0x1c, 0x20, 0xf7, 0xf0, 0xff, 0x4d, 0x28, 0x00, + 0xdb, 0xfa, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x03, 0xa7, 0xc4, + 0x2e, 0x08, 0x1d, 0x8c, 0x2e, 0x08, 0x93, 0x1c, + 0xb5, 0xf0, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09, + 0x0c, 0x09, 0xb0, 0x87, 0x91, 0x00, 0x04, 0x11, + 0x0c, 0x09, 0x91, 0x01, 0x04, 0x19, 0x0c, 0x09, + 0x91, 0x02, 0xb0, 0x85, 0x28, 0x07, 0xdc, 0x43, + 0x28, 0x01, 0xdb, 0x41, 0x00, 0x85, 0x48, 0x3e, + 0x90, 0x0b, 0x59, 0x41, 0x29, 0x00, 0xd0, 0x3b, + 0x48, 0x3c, 0x90, 0x0a, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x36, 0x23, 0x2c, 0x5e, 0xca, 0x2a, 0x0b, + 0xd2, 0x32, 0xa3, 0x02, 0x5c, 0x9b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, + 0x22, 0x00, 0x92, 0x00, 0x92, 0x01, 0x23, 0x32, + 0x5e, 0xc3, 0x93, 0x02, 0x23, 0x34, 0x5e, 0xc0, + 0x90, 0x03, 0x92, 0x04, 0x98, 0x07, 0x08, 0x80, + 0xd3, 0x40, 0x23, 0x2c, 0x5e, 0xc8, 0x28, 0x00, + 0xd0, 0x08, 0x28, 0x01, 0xd0, 0x08, 0x28, 0x02, + 0xd0, 0x08, 0x28, 0x03, 0xd1, 0x10, 0x27, 0xff, + 0x37, 0x01, 0xe0, 0x04, 0x27, 0x02, 0xe0, 0x02, + 0x27, 0x04, 0xe0, 0x00, 0x27, 0x10, 0x4e, 0x24, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x9f, 0xd1, 0x16, + 0x24, 0x00, 0x48, 0x22, 0x90, 0x09, 0xe0, 0x03, + 0xb0, 0x0c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0xa0, 0x58, 0x31, 0x29, 0x00, 0xd0, 0x06, + 0x06, 0x22, 0x0e, 0x12, 0x98, 0x09, 0x6c, 0x00, + 0x68, 0x00, 0xf0, 0x0b, 0xf9, 0x53, 0x34, 0x01, + 0x42, 0xbc, 0xdb, 0xf1, 0xe0, 0x12, 0x24, 0x00, + 0x2f, 0x00, 0xdd, 0x0f, 0x48, 0x16, 0x90, 0x08, + 0x00, 0xa0, 0x58, 0x31, 0x29, 0x00, 0xd0, 0x06, + 0x07, 0x22, 0x0f, 0x12, 0x98, 0x08, 0x59, 0x40, + 0x68, 0x00, 0xf0, 0x0b, 0xf9, 0x3f, 0x34, 0x01, + 0x42, 0xbc, 0xdb, 0xf1, 0x98, 0x07, 0x08, 0x40, + 0xd3, 0x01, 0x22, 0xff, 0xe0, 0x00, 0x22, 0x00, + 0x99, 0x06, 0xb4, 0x06, 0x98, 0x0d, 0x59, 0x40, + 0x68, 0x81, 0x98, 0x0c, 0x68, 0x00, 0x68, 0x80, + 0x9b, 0x07, 0xaa, 0x02, 0xf0, 0x09, 0xff, 0x08, + 0xb0, 0x0e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x92, 0x7c, 0x2e, 0x08, 0x1d, 0x8c, + 0x2e, 0x08, 0x93, 0x1c, 0x2e, 0x08, 0x1d, 0x0c, + 0x2e, 0x08, 0x92, 0xbc, 0xb5, 0x80, 0x4f, 0x05, + 0x68, 0x38, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfe, + 0xfd, 0xd4, 0x20, 0x00, 0x60, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1d, 0x8c, + 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, + 0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, + 0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, + 0x21, 0x01, 0xf0, 0x03, 0xfb, 0x93, 0x20, 0x00, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, + 0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, + 0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, + 0x21, 0x00, 0xf0, 0x03, 0xfb, 0x7f, 0x20, 0x00, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0xf7, 0xb0, 0x86, 0x9c, 0x07, 0x20, 0x00, + 0x6e, 0x40, 0x90, 0x05, 0x98, 0x05, 0x30, 0x0c, + 0x90, 0x05, 0x48, 0x7f, 0x90, 0x04, 0x98, 0x04, + 0x30, 0x0c, 0x90, 0x04, 0xf0, 0x13, 0xfc, 0x2a, + 0x90, 0x01, 0xf0, 0x13, 0xfc, 0x0d, 0x90, 0x00, + 0x20, 0x00, 0x43, 0xc0, 0x49, 0x79, 0x60, 0x08, + 0x20, 0x00, 0x43, 0xc0, 0x49, 0x77, 0x60, 0x88, + 0x20, 0x00, 0x43, 0xc0, 0x49, 0x75, 0x61, 0x08, + 0x98, 0x06, 0x28, 0x00, 0xd0, 0x73, 0x20, 0x00, + 0x6a, 0x40, 0x90, 0x03, 0x68, 0x20, 0x30, 0x05, + 0x99, 0x06, 0x1a, 0x08, 0x90, 0x06, 0x68, 0xe0, + 0x28, 0x00, 0xd0, 0x08, 0x68, 0x60, 0x99, 0x03, + 0x68, 0x09, 0x42, 0x88, 0xd1, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x06, 0x68, 0x60, + 0x9a, 0x08, 0x42, 0x90, 0xd1, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x73, + 0x68, 0x27, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x01, + 0x98, 0x05, 0xe0, 0x00, 0x98, 0x04, 0x1c, 0x06, + 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, + 0x6e, 0x40, 0xe0, 0x00, 0x48, 0x5c, 0x90, 0x02, + 0x1d, 0xe5, 0x35, 0x0d, 0x68, 0xa0, 0x28, 0x08, + 0xd2, 0x5f, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x16, 0x28, 0x3a, + 0x49, 0x55, 0x65, 0x71, 0x69, 0x20, 0x49, 0x55, + 0x60, 0x08, 0xcd, 0x02, 0x48, 0x53, 0x60, 0x41, + 0xcd, 0x02, 0x98, 0x02, 0x60, 0x01, 0x3f, 0x01, + 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, + 0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x67, + 0x69, 0x20, 0x49, 0x4c, 0x60, 0x88, 0xcd, 0x02, + 0x48, 0x4a, 0x60, 0xc1, 0xcd, 0x02, 0x98, 0x02, + 0x60, 0x41, 0x3f, 0x01, 0x1c, 0x38, 0x3f, 0x01, + 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 0xc6, 0x02, + 0xe7, 0xf8, 0xe0, 0x55, 0x69, 0x20, 0x49, 0x43, + 0x61, 0x08, 0xcd, 0x02, 0x48, 0x41, 0x61, 0x41, + 0xcd, 0x02, 0x98, 0x02, 0x60, 0x81, 0x3f, 0x01, + 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, + 0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x43, + 0x69, 0x20, 0x00, 0x80, 0xe0, 0x00, 0xe0, 0x4b, + 0x21, 0x00, 0x6a, 0x89, 0x50, 0x0e, 0x1c, 0x38, + 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, + 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x34, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x33, 0x50, 0x0e, 0x1c, 0x38, + 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, + 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x28, 0x69, 0x20, + 0x00, 0x80, 0x21, 0x00, 0x6e, 0x09, 0xe0, 0x01, + 0xe0, 0x28, 0xe0, 0x20, 0x50, 0x0e, 0x1c, 0x38, + 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, + 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x18, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x26, 0x50, 0x0e, 0x1c, 0x38, + 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, + 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x0c, 0x69, 0x20, + 0x90, 0x03, 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, + 0xd0, 0x04, 0xcd, 0x02, 0x98, 0x03, 0xc0, 0x02, + 0x90, 0x03, 0xe7, 0xf6, 0xe0, 0x00, 0xe7, 0xff, + 0x68, 0xe0, 0x28, 0xff, 0xd1, 0x01, 0x96, 0x05, + 0xe0, 0x00, 0x96, 0x04, 0x68, 0x20, 0x00, 0x80, + 0x19, 0x00, 0x1d, 0xc4, 0x34, 0x0d, 0xe7, 0x3b, + 0x98, 0x01, 0x28, 0x00, 0xd1, 0x01, 0xf0, 0x13, + 0xfb, 0x89, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x01, + 0xf0, 0x13, 0xfb, 0x68, 0x20, 0x00, 0x6e, 0x80, + 0x68, 0x00, 0x4b, 0x0f, 0x42, 0x98, 0xd0, 0x06, + 0x48, 0x0d, 0x21, 0x00, 0x6e, 0x89, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x08, 0x62, 0x08, 0x20, 0x00, + 0x21, 0x00, 0x6e, 0x89, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x06, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb0, 0x06, 0xe7, 0xf9, 0x00, 0x00, + 0x2e, 0x08, 0x97, 0x1c, 0x66, 0x00, 0x00, 0x80, + 0x2e, 0x08, 0x3b, 0xa4, 0x2e, 0x08, 0x1d, 0x94, + 0xda, 0xa5, 0xaa, 0x57, 0xb5, 0x80, 0xb0, 0xa7, + 0x46, 0x68, 0x4f, 0x08, 0x23, 0x13, 0xcf, 0x06, + 0xc0, 0x06, 0x3b, 0x01, 0xd1, 0xfb, 0xcf, 0x04, + 0xc0, 0x04, 0x46, 0x69, 0x4a, 0x04, 0x20, 0x27, + 0xf7, 0xff, 0xfe, 0xde, 0xb0, 0x27, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x03, 0xa7, 0xd4, + 0xf0, 0x24, 0x00, 0x09, 0xb5, 0xff, 0xb0, 0x83, + 0x99, 0x04, 0x04, 0x09, 0x0c, 0x09, 0x91, 0x00, + 0x9a, 0x05, 0x06, 0x16, 0x0e, 0x36, 0x9b, 0x06, + 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 0x98, 0x0c, + 0x06, 0x00, 0x0e, 0x00, 0x90, 0x02, 0xb0, 0x84, + 0x25, 0x00, 0x98, 0x07, 0x1d, 0xc2, 0x32, 0x21, + 0x92, 0x00, 0x20, 0xff, 0x30, 0x01, 0x68, 0x00, + 0x49, 0x6b, 0x60, 0x08, 0x98, 0x12, 0x28, 0x01, + 0xd1, 0x73, 0x98, 0x07, 0x28, 0x00, 0xd1, 0x05, + 0x20, 0x63, 0xb0, 0x07, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x91, 0x01, + 0x99, 0x01, 0x23, 0xff, 0x33, 0xe1, 0x42, 0x99, + 0xd3, 0x04, 0xe0, 0x0a, 0x99, 0x01, 0x31, 0x01, + 0x91, 0x01, 0xe7, 0xf5, 0x20, 0x00, 0x99, 0x01, + 0x23, 0x2c, 0x43, 0x59, 0x9a, 0x00, 0x50, 0x50, + 0xe7, 0xf4, 0x98, 0x07, 0x49, 0x5b, 0x68, 0x09, + 0x60, 0x08, 0x98, 0x05, 0x28, 0x10, 0xdb, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x99, 0x05, + 0x29, 0x1f, 0xdc, 0x01, 0x21, 0x01, 0xe0, 0x00, + 0x21, 0x00, 0x40, 0x08, 0xd0, 0x04, 0x98, 0x05, + 0x49, 0x53, 0x68, 0x09, 0x60, 0x08, 0xe0, 0x02, + 0x20, 0x62, 0xb0, 0x07, 0xe7, 0xce, 0x20, 0x00, + 0x49, 0x4d, 0x68, 0x09, 0x70, 0x08, 0x1c, 0x30, + 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, + 0x21, 0x01, 0xf0, 0x00, 0xfb, 0x01, 0x1c, 0x07, + 0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, + 0xe7, 0xbc, 0x22, 0x00, 0xb4, 0x04, 0x99, 0x05, + 0x1c, 0x30, 0x23, 0x04, 0x22, 0x00, 0xf0, 0x00, + 0xf9, 0x2f, 0xb0, 0x01, 0x1c, 0x07, 0x2f, 0x00, + 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, 0xe7, 0xad, + 0x98, 0x06, 0x28, 0x00, 0xdb, 0x04, 0x98, 0x06, + 0x28, 0x3f, 0xdc, 0x01, 0x9d, 0x06, 0xe0, 0x00, + 0x25, 0x1b, 0x98, 0x11, 0x01, 0x80, 0x43, 0x05, + 0x23, 0x80, 0x43, 0x1d, 0x48, 0x39, 0x68, 0x01, + 0x0a, 0x09, 0x02, 0x09, 0x60, 0x01, 0x48, 0x37, + 0x68, 0x01, 0x43, 0x29, 0x60, 0x01, 0xf0, 0x13, + 0xfa, 0x67, 0x90, 0x03, 0xf0, 0x13, 0xfa, 0x7e, + 0xe0, 0x00, 0xe0, 0x13, 0x90, 0x02, 0xf0, 0x13, + 0xfa, 0xdd, 0x1c, 0x04, 0x4b, 0x30, 0x40, 0x1c, + 0x1c, 0x20, 0xf0, 0x13, 0xfa, 0xdb, 0x98, 0x02, + 0x28, 0x40, 0xd0, 0x01, 0xf0, 0x13, 0xfa, 0xa6, + 0x98, 0x03, 0x28, 0x80, 0xd0, 0x01, 0xf0, 0x13, + 0xfa, 0x85, 0xe0, 0x43, 0x22, 0x00, 0xb4, 0x04, + 0x1c, 0x30, 0x23, 0x04, 0x22, 0x00, 0x49, 0x27, + 0xf0, 0x00, 0xf8, 0xee, 0xb0, 0x01, 0x1c, 0x07, + 0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, + 0xe7, 0x6c, 0x1c, 0x30, 0x23, 0x03, 0x02, 0x5b, + 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0xf0, 0x00, + 0xfa, 0xa3, 0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x02, + 0x20, 0xa2, 0xb0, 0x07, 0xe7, 0x5e, 0x48, 0x19, + 0x68, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x60, 0x01, + 0x48, 0x16, 0x68, 0x01, 0x23, 0x1b, 0x43, 0x19, + 0x60, 0x01, 0x48, 0x12, 0x68, 0x00, 0x68, 0x00, + 0x90, 0x07, 0xf0, 0x13, 0xfa, 0x21, 0x90, 0x03, + 0xf0, 0x13, 0xfa, 0x38, 0x90, 0x02, 0xf0, 0x13, + 0xfa, 0x99, 0x1c, 0x04, 0x23, 0x01, 0x04, 0x5b, + 0x43, 0x1c, 0x1c, 0x20, 0xf0, 0x13, 0xfa, 0x96, + 0x98, 0x02, 0x28, 0x40, 0xd0, 0x01, 0xf0, 0x13, + 0xfa, 0x61, 0x98, 0x03, 0x28, 0x80, 0xd0, 0x01, + 0xf0, 0x13, 0xfa, 0x40, 0x1c, 0x38, 0xb0, 0x07, + 0xe7, 0x34, 0xb0, 0x04, 0xb0, 0x03, 0xe7, 0x31, + 0x2e, 0x08, 0x9b, 0x24, 0x2e, 0x08, 0x9b, 0x1c, + 0x2e, 0x08, 0x9b, 0x20, 0x68, 0x00, 0x00, 0x38, + 0xff, 0xfd, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0x00, 0xf7, 0xff, 0xfe, 0xe7, 0xf0, 0x00, + 0xf8, 0x02, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, + 0xf0, 0x0b, 0xf9, 0x48, 0x26, 0x00, 0x2e, 0x04, + 0xd3, 0x02, 0xe0, 0x12, 0x36, 0x01, 0xe7, 0xfa, + 0x01, 0x30, 0x4b, 0x3c, 0x18, 0xc7, 0x25, 0x00, + 0x2d, 0x04, 0xd3, 0x02, 0xe0, 0x08, 0x35, 0x01, + 0xe7, 0xfa, 0x20, 0x00, 0x60, 0xb8, 0x20, 0x00, + 0x60, 0xf8, 0x37, 0xff, 0x37, 0x01, 0xe7, 0xf6, + 0xe7, 0xec, 0x4f, 0x35, 0x25, 0x00, 0x2d, 0x04, + 0xd3, 0x02, 0xe0, 0x07, 0x35, 0x01, 0xe7, 0xfa, + 0x20, 0x00, 0x60, 0xb8, 0x20, 0x00, 0x60, 0xf8, + 0x37, 0x10, 0xe7, 0xf7, 0x20, 0x00, 0x49, 0x2f, + 0x68, 0x09, 0x70, 0x08, 0x24, 0x00, 0x2c, 0x20, + 0xd3, 0x02, 0xe0, 0x1f, 0x34, 0x01, 0xe7, 0xfa, + 0x21, 0x00, 0x00, 0xe0, 0x4a, 0x2a, 0x68, 0x12, + 0x50, 0x11, 0x20, 0x00, 0x00, 0xe1, 0x4a, 0x28, + 0x68, 0x12, 0x18, 0x89, 0x60, 0x48, 0x21, 0x00, + 0x00, 0xe0, 0x4a, 0x26, 0x68, 0x12, 0x18, 0x80, + 0x60, 0x41, 0x20, 0x00, 0x00, 0xa1, 0x4a, 0x24, + 0x68, 0x12, 0x50, 0x50, 0x20, 0x00, 0x00, 0xe1, + 0x1b, 0x09, 0x00, 0x89, 0x4a, 0x21, 0x68, 0x12, + 0x52, 0x50, 0xe7, 0xdf, 0x20, 0x00, 0x21, 0x19, + 0x06, 0x89, 0x62, 0x48, 0x48, 0x1e, 0x21, 0x19, + 0x06, 0x89, 0x62, 0x48, 0x20, 0x00, 0x49, 0x1d, + 0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0x1b, + 0x68, 0x09, 0x60, 0x48, 0x20, 0x00, 0x49, 0x19, + 0x68, 0x09, 0x60, 0xc8, 0x20, 0x00, 0x49, 0x17, + 0x68, 0x09, 0x61, 0x08, 0x20, 0x00, 0x49, 0x15, + 0x68, 0x09, 0x61, 0x48, 0x20, 0x00, 0x49, 0x13, + 0x68, 0x09, 0x61, 0x88, 0x20, 0x00, 0x49, 0x12, + 0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0x10, + 0x68, 0x09, 0x60, 0x48, 0x20, 0x00, 0x49, 0x0e, + 0x68, 0x09, 0x60, 0x88, 0x48, 0x0d, 0x68, 0x01, + 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x9e, 0x00, 0x00, 0xc0, + 0x9e, 0x00, 0x09, 0x80, 0x2e, 0x08, 0x9b, 0x28, + 0x2e, 0x08, 0x9b, 0x3c, 0x2e, 0x08, 0x9b, 0x40, + 0x2e, 0x08, 0x9b, 0x38, 0x2e, 0x08, 0x9b, 0x30, + 0x00, 0x40, 0x00, 0x03, 0x2e, 0x08, 0x9b, 0x78, + 0x2e, 0x08, 0x9b, 0x7c, 0x6a, 0x00, 0x00, 0x10, + 0xb5, 0xff, 0xb0, 0x83, 0x98, 0x03, 0x06, 0x04, + 0x0e, 0x24, 0x99, 0x04, 0x04, 0x08, 0x0c, 0x00, + 0x90, 0x00, 0x9a, 0x05, 0x06, 0x10, 0x0e, 0x00, + 0x90, 0x01, 0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00, + 0x90, 0x02, 0xb0, 0x81, 0x00, 0xe0, 0x49, 0xc1, + 0x68, 0x09, 0x18, 0x47, 0x00, 0xa0, 0x49, 0xc0, + 0x68, 0x09, 0x18, 0x45, 0x00, 0xe0, 0x1b, 0x00, + 0x00, 0x80, 0x49, 0xbe, 0x68, 0x09, 0x18, 0x46, + 0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x04, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x68, 0x28, 0x4b, 0xb9, 0x40, 0x18, 0x60, 0x28, + 0x68, 0x38, 0x4b, 0xb8, 0x40, 0x18, 0x60, 0x38, + 0x68, 0x38, 0x23, 0x40, 0x40, 0x18, 0xd0, 0x17, + 0x68, 0x38, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, + 0x60, 0x38, 0x48, 0xb3, 0x68, 0x01, 0x08, 0x49, + 0x00, 0x49, 0x60, 0x01, 0x48, 0xb1, 0x68, 0x01, + 0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, + 0x98, 0x01, 0x4b, 0xaf, 0x42, 0x98, 0xd1, 0x03, + 0x20, 0x00, 0x49, 0xae, 0x68, 0x09, 0x60, 0x08, + 0x98, 0x01, 0x4b, 0xab, 0x42, 0x98, 0xd0, 0x73, + 0x68, 0x38, 0x23, 0x21, 0x43, 0xdb, 0x40, 0x18, + 0x60, 0x38, 0x68, 0x28, 0x23, 0x07, 0x03, 0x5b, + 0x40, 0x18, 0x60, 0x28, 0x98, 0x01, 0x4b, 0xa6, + 0x40, 0x18, 0x68, 0x29, 0x43, 0x08, 0x60, 0x28, + 0x20, 0x00, 0x75, 0x30, 0x98, 0x02, 0x07, 0x80, + 0x0f, 0x80, 0x28, 0x01, 0xd1, 0x04, 0x88, 0x30, + 0x23, 0x10, 0x43, 0x18, 0x80, 0x30, 0xe0, 0x04, + 0x88, 0x30, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, + 0x80, 0x30, 0x98, 0x02, 0x23, 0x80, 0x40, 0x18, + 0x28, 0x80, 0xd1, 0x08, 0x68, 0x38, 0x23, 0x40, + 0x43, 0x18, 0x60, 0x38, 0x20, 0xff, 0x49, 0x97, + 0x68, 0x09, 0x70, 0x08, 0xe0, 0x04, 0x68, 0x38, + 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, 0x60, 0x38, + 0x98, 0x03, 0x28, 0x01, 0xd1, 0x36, 0x88, 0x30, + 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 0x80, 0x30, + 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, 0x23, 0x0d, + 0x06, 0x9b, 0x1a, 0xc1, 0x00, 0xe0, 0x4a, 0x8c, + 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 0x20, 0x01, + 0x70, 0xb0, 0x68, 0x38, 0x23, 0x01, 0x03, 0x9b, + 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 0x4b, 0x87, + 0x43, 0x18, 0x60, 0x38, 0x48, 0x86, 0x70, 0x44, + 0x20, 0x00, 0x49, 0x86, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x01, 0x02, 0xc0, 0x49, 0x84, 0x61, 0x48, + 0x49, 0x83, 0x61, 0x08, 0x20, 0x01, 0x49, 0x83, + 0x64, 0x48, 0x20, 0x00, 0x49, 0x81, 0x64, 0x48, + 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x28, 0x20, 0x00, 0x49, 0x7e, 0x68, 0x09, + 0x60, 0x08, 0xe0, 0x9a, 0x98, 0x03, 0x28, 0x02, + 0xd1, 0x30, 0x20, 0x33, 0x06, 0x40, 0xe0, 0x00, + 0xe0, 0x94, 0x6d, 0xc0, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc0, 0x00, 0xe1, 0x4a, 0x70, 0x68, 0x12, + 0x18, 0x89, 0x60, 0x48, 0x20, 0x02, 0x70, 0xb0, + 0x68, 0x38, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x18, + 0x60, 0x38, 0x68, 0x38, 0x4b, 0x6b, 0x43, 0x18, + 0x60, 0x38, 0x48, 0x6b, 0x70, 0x84, 0x20, 0x00, + 0x49, 0x6e, 0x60, 0x08, 0x00, 0xe0, 0x49, 0x5b, + 0x68, 0x09, 0x58, 0x08, 0x23, 0xff, 0x33, 0x01, + 0x43, 0x18, 0x00, 0xe1, 0x4a, 0x57, 0x68, 0x12, + 0x50, 0x50, 0x20, 0x4b, 0x49, 0x67, 0x60, 0x08, + 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x28, 0xe0, 0x66, 0x98, 0x03, 0x28, 0x04, + 0xd1, 0x15, 0x20, 0x00, 0x00, 0xe1, 0x4a, 0x5a, + 0x68, 0x12, 0x18, 0x89, 0x60, 0x48, 0x98, 0x03, + 0x70, 0xb0, 0x68, 0x38, 0x23, 0x20, 0x43, 0x18, + 0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 0x48, 0x56, + 0x70, 0x04, 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, + 0x43, 0x18, 0x60, 0x28, 0xe0, 0x4d, 0x98, 0x03, + 0x23, 0x10, 0x40, 0x18, 0xd0, 0x0f, 0x21, 0x00, + 0x00, 0xe0, 0x4a, 0x4d, 0x68, 0x12, 0x18, 0x80, + 0x60, 0x41, 0x68, 0x38, 0x4b, 0x52, 0x43, 0x18, + 0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 0x37, 0x04, + 0x20, 0x0e, 0x60, 0x38, 0xe0, 0x39, 0x98, 0x03, + 0x28, 0x08, 0xd1, 0x23, 0x48, 0x4d, 0x68, 0x00, + 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x03, + 0x20, 0x4f, 0xb0, 0x04, 0xe6, 0xf8, 0xe0, 0x67, + 0x20, 0x01, 0x49, 0x48, 0x68, 0x09, 0x31, 0x60, + 0x76, 0x88, 0x48, 0x46, 0x68, 0x00, 0x30, 0x60, + 0x76, 0x04, 0x20, 0x01, 0x49, 0x43, 0x68, 0x09, + 0x31, 0x80, 0x70, 0xc8, 0x49, 0x42, 0x00, 0xe0, + 0x4a, 0x37, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, + 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x28, 0xe0, 0x12, 0x21, 0x00, 0x00, 0xe0, + 0x4a, 0x31, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, + 0x98, 0x03, 0x70, 0xb0, 0x68, 0x38, 0x23, 0x20, + 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 0x60, 0x38, + 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x28, 0xe0, 0x33, 0x98, 0x03, 0x23, 0x10, + 0x40, 0x18, 0xd0, 0x09, 0x1c, 0x20, 0xf0, 0x05, + 0xf8, 0x0f, 0x90, 0x00, 0x28, 0x00, 0xd0, 0x02, + 0x98, 0x00, 0xb0, 0x04, 0xe6, 0xbc, 0xe0, 0x1a, + 0x98, 0x03, 0x28, 0x01, 0xd1, 0x03, 0x20, 0xff, + 0x49, 0x21, 0x70, 0x48, 0xe0, 0x13, 0x98, 0x03, + 0x28, 0x02, 0xd1, 0x03, 0x20, 0xff, 0x49, 0x1e, + 0x70, 0x88, 0xe0, 0x0c, 0x98, 0x03, 0x28, 0x08, + 0xd1, 0x09, 0x20, 0x00, 0x49, 0x21, 0x68, 0x09, + 0x31, 0x80, 0x70, 0xc8, 0x20, 0x00, 0x49, 0x1f, + 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x7d, 0x30, + 0x07, 0xc0, 0x0f, 0xc0, 0x28, 0x01, 0xd1, 0x03, + 0x1c, 0x20, 0x49, 0x1c, 0xf0, 0x00, 0xf9, 0x16, + 0x20, 0x00, 0x70, 0xb0, 0x20, 0x00, 0xb0, 0x04, + 0xe6, 0x92, 0xb0, 0x01, 0xb0, 0x03, 0xe6, 0x8f, + 0xe6, 0x8e, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x3c, + 0x2e, 0x08, 0x9b, 0x38, 0x2e, 0x08, 0x9b, 0x30, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x9b, 0x44, + 0xff, 0xff, 0x1f, 0xff, 0x2e, 0x08, 0x9b, 0x98, + 0x2e, 0x08, 0x9b, 0x40, 0x00, 0x00, 0x20, 0x01, + 0x2e, 0x08, 0x9b, 0x9c, 0x2e, 0x08, 0x9b, 0x68, + 0xcc, 0x00, 0x0f, 0x00, 0x66, 0x00, 0x00, 0x80, + 0x2e, 0x08, 0x9b, 0xac, 0x2e, 0x08, 0x9b, 0xb0, + 0x00, 0x00, 0x20, 0xa0, 0x2e, 0x08, 0xb9, 0xb0, + 0x66, 0x00, 0x01, 0xf0, 0xff, 0xff, 0x00, 0x00, + 0xb5, 0xff, 0x98, 0x00, 0x06, 0x01, 0x0e, 0x09, + 0x98, 0x01, 0x06, 0x02, 0x0e, 0x12, 0x98, 0x02, + 0x04, 0x07, 0x0c, 0x3f, 0x9b, 0x03, 0x04, 0x1c, + 0x0c, 0x24, 0x29, 0x20, 0xdb, 0x04, 0x20, 0xa2, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2a, 0x02, 0xd1, 0x0a, 0x00, 0xc8, 0x4b, 0x1f, + 0x68, 0x1b, 0x58, 0x18, 0x4b, 0x1e, 0x40, 0x18, + 0x00, 0xcb, 0x4d, 0x1c, 0x68, 0x2d, 0x50, 0xe8, + 0xe0, 0x30, 0x2a, 0x01, 0xd1, 0x0b, 0x00, 0xc8, + 0x4b, 0x18, 0x68, 0x1b, 0x58, 0x18, 0x43, 0x27, + 0x1c, 0x3b, 0x43, 0x18, 0x00, 0xcb, 0x4d, 0x15, + 0x68, 0x2d, 0x50, 0xe8, 0xe0, 0x22, 0x20, 0x00, + 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x1e, 0x1c, 0x43, + 0x06, 0x1b, 0x16, 0x18, 0xe7, 0xf8, 0x2a, 0x03, + 0xd1, 0x0b, 0x00, 0xc3, 0x4d, 0x0d, 0x68, 0x2d, + 0x58, 0xeb, 0x1c, 0x3d, 0x43, 0x25, 0x43, 0x1d, + 0x00, 0xc3, 0x4e, 0x0a, 0x68, 0x36, 0x50, 0xf5, + 0xe0, 0x0b, 0x2a, 0x04, 0xd1, 0x09, 0x00, 0xc3, + 0x4d, 0x06, 0x68, 0x2d, 0x58, 0xed, 0x4b, 0x06, + 0x40, 0x2b, 0x00, 0xc5, 0x4e, 0x03, 0x68, 0x36, + 0x51, 0x73, 0xe7, 0xe0, 0x20, 0x00, 0xe7, 0xbb, + 0xe7, 0xba, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x3c, + 0xff, 0xff, 0xe1, 0xff, 0xb4, 0xb0, 0x1c, 0x07, + 0x1c, 0x0a, 0x06, 0x38, 0x0e, 0x00, 0x06, 0x11, + 0x0e, 0x09, 0x4c, 0x14, 0x68, 0x25, 0x4b, 0x14, + 0x40, 0x2b, 0x60, 0x23, 0x28, 0x01, 0xd1, 0x06, + 0x4c, 0x10, 0x68, 0x25, 0x23, 0x01, 0x04, 0x1b, + 0x43, 0x2b, 0x60, 0x23, 0xe0, 0x07, 0x28, 0x00, + 0xd1, 0x05, 0x4c, 0x0c, 0x68, 0x25, 0x23, 0x01, + 0x05, 0x9b, 0x43, 0x2b, 0x60, 0x23, 0x29, 0x01, + 0xd1, 0x06, 0x4c, 0x08, 0x68, 0x25, 0x23, 0x01, + 0x03, 0x9b, 0x43, 0x2b, 0x60, 0x23, 0xe0, 0x07, + 0x29, 0x02, 0xd1, 0x05, 0x4c, 0x03, 0x68, 0x25, + 0x23, 0x01, 0x03, 0xdb, 0x43, 0x2b, 0x60, 0x23, + 0xbc, 0xb0, 0x47, 0x70, 0x64, 0x00, 0x00, 0x24, + 0xff, 0xbe, 0x3f, 0xff, 0xb5, 0xff, 0x1c, 0x1f, + 0x9c, 0x09, 0xb0, 0x82, 0x98, 0x02, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x00, 0x99, 0x03, 0x06, 0x0a, + 0x0e, 0x12, 0x98, 0x04, 0x06, 0x05, 0x0e, 0x2d, + 0x98, 0x0c, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x01, + 0x00, 0xd0, 0x1a, 0x80, 0x00, 0x80, 0x4b, 0x1b, + 0x68, 0x1b, 0x18, 0xc1, 0x2a, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x1f, 0xdb, 0x02, + 0x20, 0xaf, 0xb0, 0x02, 0xe7, 0xf6, 0x71, 0x8d, + 0x68, 0x3b, 0x00, 0xd0, 0x4e, 0x12, 0x68, 0x36, + 0x19, 0x80, 0x60, 0x43, 0x1c, 0x20, 0x71, 0xc8, + 0x20, 0x00, 0x80, 0x88, 0x20, 0x00, 0x60, 0xc8, + 0x98, 0x00, 0x23, 0x01, 0x43, 0x18, 0x75, 0x08, + 0x98, 0x01, 0x74, 0x88, 0x60, 0x8f, 0x88, 0xb8, + 0x82, 0x08, 0x20, 0x00, 0x74, 0xc8, 0x88, 0xb8, + 0x61, 0x38, 0x20, 0x00, 0x73, 0x38, 0x20, 0x00, + 0x73, 0x78, 0x20, 0x00, 0x73, 0xb8, 0x20, 0x00, + 0x73, 0xf8, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xd1, + 0xb0, 0x02, 0xe7, 0xcf, 0x2e, 0x08, 0x9b, 0x30, + 0x2e, 0x08, 0x9b, 0x40, 0xb5, 0xf3, 0x98, 0x00, + 0x06, 0x04, 0x0e, 0x24, 0x99, 0x01, 0x04, 0x0d, + 0x0c, 0x2d, 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, + 0x49, 0x25, 0x68, 0x09, 0x18, 0x47, 0x2c, 0x20, + 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x4b, 0x21, 0x42, 0x9d, + 0xd1, 0x27, 0x00, 0xe1, 0x4b, 0x20, 0x68, 0x1b, + 0x18, 0xc8, 0x00, 0xa1, 0x4b, 0x1f, 0x68, 0x1b, + 0x18, 0xca, 0x68, 0x11, 0x4b, 0x1e, 0x40, 0x19, + 0x60, 0x11, 0x68, 0x01, 0x23, 0x40, 0x40, 0x19, + 0xd0, 0x13, 0x68, 0x01, 0x23, 0x40, 0x43, 0xdb, + 0x40, 0x19, 0x60, 0x01, 0x21, 0x00, 0x4b, 0x19, + 0x68, 0x1b, 0x70, 0x19, 0x49, 0x18, 0x68, 0x0b, + 0x08, 0x5b, 0x00, 0x5b, 0x60, 0x0b, 0x49, 0x17, + 0x68, 0x0e, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x33, + 0x60, 0x0b, 0x68, 0x01, 0x4b, 0x14, 0x40, 0x19, + 0x60, 0x01, 0x20, 0x00, 0x75, 0x38, 0x20, 0x00, + 0x80, 0x38, 0x20, 0x00, 0x80, 0xb8, 0x68, 0xb8, + 0x72, 0x44, 0x20, 0xa0, 0x68, 0xb9, 0x72, 0x08, + 0x20, 0x00, 0x60, 0xb8, 0x79, 0xb9, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x12, 0xfe, 0x1f, 0x20, 0x00, + 0x71, 0xb8, 0x20, 0x00, 0xe7, 0xba, 0xe7, 0xb9, + 0x2e, 0x08, 0x9b, 0x30, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x9b, 0x3c, 0x2e, 0x08, 0x9b, 0x38, + 0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x9b, 0x2c, + 0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20, + 0xff, 0xff, 0x3f, 0xde, 0xb5, 0xff, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x28, 0x0e, 0x00, + 0x06, 0x23, 0x0e, 0x1b, 0x06, 0x39, 0x0e, 0x09, + 0x9e, 0x03, 0x06, 0x36, 0x16, 0x32, 0x28, 0x20, + 0xda, 0x02, 0x4e, 0x08, 0x68, 0x36, 0x60, 0x30, + 0x4e, 0x07, 0x68, 0x36, 0x60, 0x33, 0x4e, 0x07, + 0x68, 0x36, 0x60, 0x31, 0x4e, 0x06, 0x68, 0x36, + 0x60, 0x32, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x58, + 0x2e, 0x08, 0x9b, 0x5c, 0x2e, 0x08, 0x9b, 0x60, + 0x2e, 0x08, 0x9b, 0x64, 0x1c, 0x01, 0x06, 0x08, + 0x0e, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x22, 0x01, + 0x4b, 0x04, 0x68, 0x1b, 0x60, 0x1a, 0xe0, 0x03, + 0x22, 0x02, 0x4b, 0x02, 0x68, 0x1b, 0x60, 0x1a, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xa0, + 0xb5, 0xf1, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24, + 0xb0, 0x81, 0x27, 0x00, 0x26, 0x00, 0x4a, 0x55, + 0x92, 0x00, 0x00, 0xe0, 0x49, 0x54, 0x68, 0x09, + 0x58, 0x08, 0x23, 0x03, 0x03, 0x9b, 0x40, 0x18, + 0x23, 0x01, 0x03, 0x9b, 0x42, 0x98, 0xd0, 0x05, + 0x20, 0xa0, 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0xe0, 0x49, 0x4c, + 0x68, 0x09, 0x58, 0x08, 0x21, 0x20, 0x43, 0x01, + 0x00, 0xe0, 0x4a, 0x49, 0x68, 0x12, 0x50, 0x11, + 0x21, 0x00, 0x48, 0x48, 0xf0, 0x05, 0xfc, 0x3c, + 0x48, 0x47, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x01, + 0xe0, 0x08, 0xe0, 0x82, 0x20, 0x02, 0xf0, 0x0c, + 0xf8, 0x75, 0x1c, 0x38, 0x37, 0x01, 0x4b, 0x43, + 0x42, 0x98, 0xd3, 0xf1, 0x4b, 0x41, 0x42, 0x9f, + 0xd3, 0x00, 0x26, 0xa1, 0x48, 0x40, 0x68, 0x01, + 0x4b, 0x40, 0x40, 0x19, 0x60, 0x01, 0x20, 0x00, + 0x00, 0xe1, 0x1b, 0x09, 0x00, 0x89, 0x4a, 0x3e, + 0x68, 0x12, 0x18, 0x89, 0x70, 0x88, 0x20, 0x00, + 0x43, 0xc0, 0x49, 0x3c, 0x67, 0x48, 0x22, 0x00, + 0xb4, 0x04, 0x1c, 0x20, 0x23, 0x00, 0x22, 0x00, + 0x49, 0x39, 0xf7, 0xff, 0xfc, 0x69, 0xb0, 0x01, + 0x27, 0x00, 0x25, 0x00, 0x2d, 0x04, 0xdb, 0x02, + 0xe0, 0x1e, 0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa9, + 0x22, 0x0f, 0x1c, 0x10, 0x40, 0x88, 0x01, 0x29, + 0x9a, 0x00, 0x18, 0x89, 0x68, 0x49, 0x42, 0xa1, + 0xd1, 0x11, 0x21, 0x33, 0x06, 0x49, 0x6b, 0xc9, + 0x40, 0x01, 0xd0, 0x01, 0x37, 0x01, 0xe0, 0x00, + 0xe0, 0x02, 0x4b, 0x26, 0x42, 0x9f, 0xd3, 0xf4, + 0x4b, 0x24, 0x42, 0x9f, 0xd3, 0x02, 0x26, 0xa1, + 0xe0, 0x02, 0xe0, 0x3a, 0x27, 0x00, 0xe7, 0xe0, + 0x48, 0x26, 0x68, 0x01, 0x23, 0xff, 0x33, 0x01, + 0x43, 0x19, 0x60, 0x01, 0x48, 0x21, 0x6d, 0x80, + 0x49, 0x20, 0x65, 0x88, 0x48, 0x1f, 0x6b, 0xc0, + 0x23, 0x01, 0x07, 0x9b, 0x40, 0x18, 0xd0, 0x00, + 0xe7, 0xf8, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, + 0x21, 0x33, 0x06, 0x49, 0x66, 0x48, 0x20, 0x33, + 0x06, 0x40, 0x6d, 0x80, 0x21, 0x33, 0x06, 0x49, + 0x66, 0x88, 0x20, 0x03, 0x02, 0x00, 0x49, 0x15, + 0x67, 0x48, 0x48, 0x11, 0x68, 0x01, 0x23, 0x01, + 0x02, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00, + 0x49, 0x13, 0x65, 0x88, 0x20, 0x00, 0x49, 0x12, + 0x65, 0xc8, 0x20, 0x00, 0x49, 0x10, 0x66, 0x08, + 0x21, 0x00, 0x20, 0xff, 0xf0, 0x05, 0xfb, 0xb8, + 0x1c, 0x30, 0xb0, 0x01, 0xe7, 0x66, 0xb0, 0x01, + 0xe7, 0x64, 0xe7, 0x63, 0x9e, 0x00, 0x00, 0xc0, + 0x2e, 0x08, 0x9b, 0x3c, 0x00, 0x00, 0x80, 0x0f, + 0xcc, 0x00, 0x05, 0x00, 0x00, 0x1e, 0x84, 0x80, + 0x66, 0x00, 0x00, 0x4c, 0xff, 0xff, 0xfd, 0xff, + 0x2e, 0x08, 0x9b, 0x30, 0x66, 0x00, 0x00, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x66, 0x00, 0x00, 0xe0, + 0xcc, 0x00, 0x00, 0x00, 0xb5, 0xf1, 0x98, 0x00, + 0x06, 0x07, 0x0e, 0x3f, 0xb0, 0x81, 0x25, 0x00, + 0x26, 0x00, 0x4a, 0x2e, 0x92, 0x00, 0x00, 0xf8, + 0x49, 0x2d, 0x68, 0x09, 0x58, 0x08, 0x23, 0x03, + 0x03, 0x9b, 0x40, 0x18, 0x23, 0x01, 0x03, 0xdb, + 0x42, 0x98, 0xd0, 0x05, 0x20, 0xa0, 0xb0, 0x01, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x22, 0x00, 0xb4, 0x04, 0x1c, 0x38, 0x23, 0x00, + 0x22, 0x00, 0x49, 0x24, 0xf7, 0xff, 0xfb, 0xd0, + 0xb0, 0x01, 0x24, 0x00, 0x2c, 0x04, 0xdb, 0x02, + 0xe0, 0x1e, 0x34, 0x01, 0xe7, 0xfa, 0x00, 0xa1, + 0x22, 0x0f, 0x1c, 0x10, 0x40, 0x88, 0x01, 0x21, + 0x9a, 0x00, 0x18, 0x89, 0x68, 0x49, 0x42, 0xb9, + 0xd1, 0x11, 0x21, 0x33, 0x06, 0x49, 0x6b, 0xc9, + 0x40, 0x01, 0xd0, 0x01, 0x35, 0x01, 0xe0, 0x00, + 0xe0, 0x02, 0x4b, 0x17, 0x42, 0x9d, 0xd3, 0xf4, + 0x4b, 0x15, 0x42, 0x9d, 0xd9, 0x02, 0x26, 0xa1, + 0xe0, 0x02, 0xe0, 0x1d, 0x25, 0x00, 0xe7, 0xe0, + 0x20, 0x04, 0xf0, 0x02, 0xff, 0xb7, 0x20, 0x01, + 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, 0x21, 0x00, + 0x00, 0xf8, 0x4a, 0x0b, 0x68, 0x12, 0x50, 0x11, + 0x21, 0x00, 0x00, 0xf8, 0x4a, 0x08, 0x68, 0x12, + 0x18, 0x80, 0x60, 0x41, 0x21, 0x00, 0x00, 0xb8, + 0x4a, 0x08, 0x68, 0x12, 0x50, 0x11, 0x1c, 0x30, + 0xb0, 0x01, 0xe7, 0xb5, 0xb0, 0x01, 0xe7, 0xb3, + 0xe7, 0xb2, 0x00, 0x00, 0x9e, 0x00, 0x00, 0xc0, + 0x2e, 0x08, 0x9b, 0x3c, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x01, 0xd4, 0xc0, 0x2e, 0x08, 0x9b, 0x38, + 0xb5, 0xff, 0x99, 0x01, 0x06, 0x0f, 0x0e, 0x3f, + 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, 0x9b, 0x03, + 0x06, 0x1e, 0x0e, 0x36, 0x2d, 0x1f, 0xdb, 0x04, + 0x20, 0xaf, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x2f, 0x20, 0xdb, 0x01, 0x20, 0xa2, + 0xe7, 0xf7, 0x2e, 0x80, 0xd0, 0x13, 0xf0, 0x12, + 0xfc, 0xc3, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80, + 0x20, 0x01, 0xf0, 0x00, 0xfb, 0x6d, 0x2c, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfc, 0xef, 0x98, 0x00, + 0x21, 0x80, 0x68, 0x49, 0x60, 0x08, 0x48, 0x09, + 0x68, 0x00, 0x70, 0x05, 0xe0, 0x0b, 0xf0, 0x12, + 0xfc, 0xaf, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80, + 0x20, 0x02, 0xf0, 0x00, 0xfb, 0x59, 0x2c, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfc, 0xdb, 0x20, 0x00, + 0xe7, 0xd3, 0xe7, 0xd2, 0x2e, 0x08, 0x9b, 0x88, + 0xb5, 0xff, 0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, + 0x9a, 0x02, 0x06, 0x17, 0x0e, 0x3f, 0x9b, 0x03, + 0x06, 0x1c, 0x0e, 0x24, 0xb0, 0x82, 0x20, 0x80, + 0x40, 0x38, 0x90, 0x00, 0x06, 0x7f, 0x0e, 0x7f, + 0x2e, 0x1f, 0xdb, 0x05, 0x20, 0xaf, 0xb0, 0x02, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2c, 0x20, 0xdb, 0x02, 0x20, 0xa2, 0xb0, 0x02, + 0xe7, 0xf6, 0x2f, 0x04, 0xd1, 0x00, 0x27, 0x00, + 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 0x49, 0x17, + 0x68, 0x09, 0x18, 0x40, 0x90, 0x01, 0x98, 0x00, + 0x28, 0x00, 0xd0, 0x0d, 0xf0, 0x12, 0xfc, 0x74, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0x92, + 0x20, 0x02, 0xf0, 0x00, 0xfb, 0x1d, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfc, 0x9f, 0xe0, 0x13, + 0xf0, 0x12, 0xfc, 0x66, 0x1c, 0x05, 0x1c, 0x21, + 0x22, 0x01, 0x02, 0x92, 0x20, 0x01, 0xf0, 0x00, + 0xfb, 0x0f, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x12, + 0xfc, 0x91, 0x98, 0x02, 0x21, 0x80, 0x68, 0x89, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0x00, 0x55, 0xc6, + 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xc4, 0xb0, 0x02, + 0xe7, 0xc2, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x30, + 0xb5, 0xff, 0xb0, 0x82, 0x99, 0x03, 0x04, 0x0d, + 0x0c, 0x2d, 0x9a, 0x04, 0x06, 0x10, 0x0e, 0x00, + 0x90, 0x00, 0x9b, 0x05, 0x06, 0x18, 0x0e, 0x00, + 0x90, 0x01, 0x98, 0x00, 0x28, 0x1f, 0xdb, 0x05, + 0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x23, 0x80, + 0x40, 0x18, 0xd1, 0x2f, 0x98, 0x00, 0x49, 0x2c, + 0x68, 0x09, 0x73, 0x08, 0x27, 0x00, 0x2f, 0x20, + 0xdb, 0x04, 0xe0, 0x26, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0xe7, 0xf8, 0x20, 0x01, 0x40, 0xb8, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x1c, 0x24, 0x00, + 0x20, 0x40, 0x40, 0x28, 0xd0, 0x04, 0x04, 0x20, + 0x0c, 0x00, 0x24, 0x01, 0x03, 0xa4, 0x43, 0x04, + 0x20, 0x80, 0x40, 0x28, 0xd0, 0x04, 0x04, 0x20, + 0x0c, 0x00, 0x24, 0x01, 0x03, 0xe4, 0x43, 0x04, + 0xf0, 0x12, 0xfc, 0x0e, 0x1c, 0x06, 0x1c, 0x22, + 0x1c, 0x39, 0x20, 0x01, 0xf0, 0x00, 0xfa, 0xb8, + 0x2e, 0x80, 0xd0, 0x01, 0xf0, 0x12, 0xfc, 0x3a, + 0xe7, 0xd8, 0xe0, 0x24, 0x27, 0x00, 0x2f, 0x20, + 0xdb, 0x04, 0xe0, 0x20, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0xe7, 0xf8, 0x20, 0x01, 0x40, 0xb8, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x16, 0x24, 0x00, + 0x20, 0x40, 0x40, 0x28, 0xd0, 0x01, 0x4b, 0x0d, + 0x40, 0x1c, 0x20, 0x80, 0x40, 0x28, 0xd0, 0x01, + 0x04, 0x64, 0x0c, 0x64, 0xf0, 0x12, 0xfb, 0xe8, + 0x1c, 0x06, 0x1c, 0x22, 0x1c, 0x39, 0x20, 0x02, + 0xf0, 0x00, 0xfa, 0x92, 0x2e, 0x80, 0xd0, 0x01, + 0xf0, 0x12, 0xfc, 0x14, 0xe7, 0xde, 0x20, 0x00, + 0xb0, 0x02, 0xe7, 0x9f, 0xb0, 0x02, 0xe7, 0x9d, + 0x2e, 0x08, 0x9b, 0x7c, 0x00, 0x00, 0xbf, 0xff, + 0xb5, 0x80, 0x1c, 0x07, 0x48, 0x07, 0x68, 0x01, + 0x20, 0x00, 0xf0, 0x1b, 0xfa, 0xad, 0x60, 0x38, + 0x48, 0x04, 0x68, 0x00, 0x1d, 0x01, 0x20, 0x00, + 0xf0, 0x1b, 0xfa, 0xa6, 0x60, 0x78, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x9b, 0x7c, + 0xb5, 0xf7, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0e, + 0x0e, 0x36, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, + 0x2e, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20, + 0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x20, 0x80, + 0x40, 0x20, 0xd0, 0x0d, 0xf0, 0x12, 0xfb, 0xa8, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2, + 0x20, 0x02, 0xf0, 0x00, 0xfa, 0x51, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfb, 0xd3, 0xe0, 0x16, + 0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b, + 0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09, + 0x68, 0x09, 0x71, 0x08, 0xf0, 0x12, 0xfb, 0x90, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2, + 0x20, 0x01, 0xf0, 0x00, 0xfa, 0x39, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfb, 0xbb, 0x20, 0x00, + 0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x9b, 0x80, + 0xb5, 0xf7, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0e, + 0x0e, 0x36, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, + 0x2e, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20, + 0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x20, 0x80, + 0x40, 0x20, 0xd0, 0x0d, 0xf0, 0x12, 0xfb, 0x68, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12, + 0x20, 0x02, 0xf0, 0x00, 0xfa, 0x11, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfb, 0x93, 0xe0, 0x16, + 0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b, + 0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09, + 0x68, 0x09, 0x71, 0x08, 0xf0, 0x12, 0xfb, 0x50, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12, + 0x20, 0x01, 0xf0, 0x00, 0xf9, 0xf9, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfb, 0x7b, 0x20, 0x00, + 0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x9b, 0x84, + 0xb5, 0xff, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, 0x06, 0x0d, + 0x0e, 0x2d, 0x9a, 0x03, 0x06, 0x16, 0x0e, 0x36, + 0x9f, 0x04, 0x1c, 0x29, 0x98, 0x00, 0xf0, 0x00, + 0xf8, 0x91, 0x28, 0x00, 0xd0, 0x05, 0x20, 0xa2, + 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x79, 0x38, 0x79, 0x79, 0x18, 0x40, + 0x79, 0xb9, 0x18, 0x40, 0x06, 0x04, 0x0e, 0x24, + 0x79, 0xb8, 0x02, 0x00, 0x43, 0x04, 0x00, 0x68, + 0x19, 0x80, 0x01, 0x00, 0x49, 0x15, 0x68, 0x09, + 0x50, 0x0c, 0x9b, 0x04, 0x88, 0x99, 0x00, 0x68, + 0x19, 0x80, 0x01, 0x00, 0x4a, 0x11, 0x68, 0x12, + 0x18, 0x80, 0x60, 0x41, 0x78, 0x78, 0x78, 0x39, + 0x18, 0x40, 0x78, 0xb9, 0x18, 0x40, 0x06, 0x04, + 0x0e, 0x24, 0x78, 0xb8, 0x02, 0x00, 0x43, 0x04, + 0x00, 0x68, 0x19, 0x80, 0x01, 0x00, 0x49, 0x09, + 0x68, 0x09, 0x18, 0x40, 0x60, 0x84, 0x9b, 0x04, + 0x88, 0x19, 0x00, 0x68, 0x19, 0x80, 0x01, 0x00, + 0x4a, 0x04, 0x68, 0x12, 0x18, 0x80, 0x60, 0xc1, + 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xc5, 0xb0, 0x01, + 0xe7, 0xc3, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x34, + 0xb5, 0xff, 0x1c, 0x07, 0x06, 0x3d, 0x0e, 0x2d, + 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0x9a, 0x02, + 0x06, 0x16, 0x0e, 0x36, 0x1c, 0x21, 0x1c, 0x28, + 0xf0, 0x00, 0xf8, 0x40, 0x28, 0x00, 0xd0, 0x04, + 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x9a, 0x03, 0x1c, 0x31, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x02, 0xe7, 0xf5, 0xe7, 0xf4, + 0xb4, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, + 0x06, 0x21, 0x0e, 0x09, 0x06, 0x3a, 0x0e, 0x12, + 0x29, 0x10, 0xdb, 0x02, 0x20, 0xa2, 0xbc, 0xf0, + 0x47, 0x70, 0x88, 0xdd, 0x00, 0x48, 0x18, 0x80, + 0x01, 0x00, 0x4e, 0x0f, 0x68, 0x36, 0x50, 0x35, + 0x88, 0x98, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, + 0x4e, 0x0b, 0x68, 0x36, 0x19, 0xad, 0x60, 0x68, + 0x88, 0x58, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, + 0x4e, 0x07, 0x68, 0x36, 0x19, 0xad, 0x60, 0xa8, + 0x88, 0x18, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, + 0x4e, 0x03, 0x68, 0x36, 0x19, 0xad, 0x60, 0xe8, + 0x20, 0x00, 0xe7, 0xdc, 0xe7, 0xdb, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0x34, 0xb4, 0xb0, 0x1c, 0x07, + 0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x06, 0x15, + 0x0e, 0x2d, 0xb0, 0x81, 0x29, 0x20, 0xdb, 0x03, + 0x20, 0xa2, 0xb0, 0x01, 0xbc, 0xb0, 0x47, 0x70, + 0x2d, 0x10, 0xdb, 0x02, 0x20, 0xa2, 0xb0, 0x01, + 0xe7, 0xf8, 0x00, 0xc8, 0x4b, 0x0a, 0x68, 0x1b, + 0x18, 0xc4, 0x68, 0x20, 0x90, 0x00, 0x98, 0x00, + 0x4b, 0x08, 0x40, 0x18, 0x90, 0x00, 0x00, 0x68, + 0x23, 0x1e, 0x40, 0x18, 0x9b, 0x00, 0x43, 0x18, + 0x90, 0x00, 0x98, 0x00, 0x60, 0x20, 0x20, 0x00, + 0xb0, 0x01, 0xe7, 0xe3, 0xb0, 0x01, 0xe7, 0xe1, + 0x2e, 0x08, 0x9b, 0x3c, 0xff, 0xff, 0xdf, 0xe1, + 0x20, 0xff, 0x49, 0x02, 0x68, 0x09, 0x70, 0x08, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x98, + 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0xb0, 0x83, + 0x20, 0x00, 0x43, 0xc0, 0x23, 0x19, 0x06, 0x9b, + 0x67, 0x58, 0x08, 0xb9, 0x00, 0x89, 0x1a, 0x78, + 0x90, 0x02, 0x98, 0x02, 0x18, 0x10, 0x07, 0x80, + 0x0f, 0x80, 0x90, 0x01, 0x98, 0x02, 0x18, 0x10, + 0x08, 0x80, 0x90, 0x00, 0x9b, 0x02, 0x20, 0x03, + 0x1a, 0xc0, 0x23, 0x19, 0x06, 0x9b, 0x67, 0xd8, + 0x24, 0x00, 0x98, 0x00, 0x42, 0x84, 0xd3, 0x02, + 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xf9, 0xc9, 0x08, + 0x20, 0x19, 0x06, 0x80, 0x67, 0x03, 0xe7, 0xf8, + 0x98, 0x01, 0x28, 0x00, 0xd0, 0x0b, 0x9b, 0x01, + 0x00, 0xd8, 0x25, 0x00, 0x43, 0xed, 0x40, 0xc5, + 0x1c, 0x2b, 0x43, 0xdb, 0x68, 0x0d, 0x40, 0x2b, + 0x25, 0x19, 0x06, 0xad, 0x67, 0x2b, 0x20, 0x19, + 0x06, 0x80, 0x6f, 0x40, 0xb0, 0x03, 0xbc, 0xb0, + 0x47, 0x70, 0xb0, 0x03, 0xe7, 0xfb, 0x1c, 0x01, + 0x06, 0x08, 0x0e, 0x00, 0x22, 0x19, 0x06, 0x92, + 0x63, 0x90, 0x47, 0x70, 0xb4, 0xf0, 0x48, 0x4d, + 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x74, + 0x22, 0x00, 0x27, 0x00, 0x49, 0x4a, 0x20, 0x00, + 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x16, 0x1c, 0x43, + 0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, 0x00, 0x83, + 0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b, 0x40, 0x23, + 0xd0, 0x0b, 0x24, 0x01, 0x40, 0x84, 0x1c, 0x23, + 0x43, 0x1f, 0x00, 0x83, 0x58, 0xcc, 0x23, 0x01, + 0x03, 0x5b, 0x43, 0x9c, 0x1c, 0x23, 0x00, 0x84, + 0x51, 0x0b, 0xe7, 0xe8, 0x20, 0x00, 0x28, 0x04, + 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x43, 0x06, 0x18, + 0x0e, 0x00, 0xe7, 0xf8, 0x01, 0x05, 0x4b, 0x39, + 0x18, 0xec, 0x22, 0x00, 0x2a, 0x04, 0xdb, 0x04, + 0xe0, 0x0e, 0x1c, 0x53, 0x06, 0x1a, 0x0e, 0x12, + 0xe7, 0xf8, 0x4b, 0x35, 0x60, 0x23, 0x4b, 0x35, + 0x60, 0x63, 0x23, 0x00, 0x60, 0xa3, 0x23, 0x00, + 0x60, 0xe3, 0x34, 0xff, 0x34, 0x01, 0xe7, 0xf0, + 0xe7, 0xe4, 0xb0, 0x82, 0x4b, 0x2b, 0x69, 0xdc, + 0x23, 0x0c, 0x40, 0x23, 0x08, 0x9c, 0xab, 0x01, + 0x70, 0x1c, 0x4b, 0x28, 0x69, 0xdc, 0x23, 0x30, + 0x40, 0x23, 0x09, 0x1c, 0xab, 0x00, 0x70, 0x1c, + 0xab, 0x01, 0x78, 0x1b, 0xac, 0x00, 0x78, 0x24, + 0x42, 0xa3, 0xd1, 0x09, 0x23, 0x33, 0x06, 0x5b, + 0x6b, 0xdb, 0x2b, 0x00, 0xd1, 0x04, 0x4b, 0x1f, + 0x6a, 0x9b, 0x07, 0xdb, 0x0f, 0xdb, 0xd0, 0x21, + 0x4b, 0x1c, 0x69, 0xdd, 0x23, 0x0c, 0x40, 0x2b, + 0x08, 0x9c, 0x00, 0xa5, 0x26, 0x01, 0x40, 0xae, + 0x1c, 0x33, 0x25, 0x33, 0x06, 0x6d, 0x64, 0x2b, + 0x25, 0x01, 0x40, 0xa5, 0x1c, 0x2b, 0x4d, 0x1a, + 0x63, 0xab, 0x4b, 0x14, 0x69, 0xdd, 0x23, 0x0c, + 0x40, 0x2b, 0x08, 0x9d, 0xab, 0x01, 0x70, 0x1d, + 0xe0, 0x00, 0xe0, 0x1d, 0x4b, 0x0f, 0x69, 0xdd, + 0x23, 0x30, 0x40, 0x2b, 0x09, 0x1d, 0xab, 0x00, + 0x70, 0x1d, 0xe7, 0xcd, 0xb0, 0x02, 0x20, 0x00, + 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x10, 0x1c, 0x43, + 0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, 0x24, 0x01, + 0x40, 0x84, 0x1c, 0x23, 0x40, 0x3b, 0xd0, 0x06, + 0x00, 0x83, 0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b, + 0x43, 0x23, 0x00, 0x84, 0x51, 0x0b, 0xe7, 0xee, + 0xbc, 0xf0, 0x47, 0x70, 0x66, 0x00, 0x01, 0x00, + 0x64, 0x00, 0x00, 0x80, 0x9e, 0x00, 0x00, 0xc0, + 0x9e, 0x00, 0x00, 0x00, 0x2e, 0x0f, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x80, 0xb4, 0x80, 0x1c, 0x03, + 0x1c, 0x0a, 0x48, 0x0a, 0x68, 0x00, 0x68, 0x01, + 0x20, 0x19, 0x06, 0x80, 0x6a, 0x80, 0x0a, 0x40, + 0x00, 0x4f, 0x43, 0x38, 0x60, 0x18, 0x0f, 0xc8, + 0x07, 0xc0, 0x60, 0x10, 0x68, 0x10, 0x0f, 0xc0, + 0x60, 0x10, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, + 0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xa4, + 0xb5, 0x80, 0x1c, 0x07, 0x48, 0x05, 0x68, 0x00, + 0x1d, 0xc1, 0x31, 0x01, 0x20, 0x00, 0xf0, 0x1b, + 0xf8, 0x37, 0x60, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x7c, + 0xb4, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, + 0x06, 0x20, 0x0e, 0x00, 0x06, 0x39, 0x0e, 0x09, + 0x04, 0x1a, 0x0c, 0x12, 0x4d, 0x07, 0x68, 0x2d, + 0x70, 0xe8, 0x4d, 0x06, 0x68, 0x2d, 0x70, 0xa9, + 0x4d, 0x04, 0x68, 0x2d, 0x80, 0x2a, 0x25, 0x01, + 0x04, 0x2d, 0x26, 0x33, 0x06, 0x76, 0x60, 0x35, + 0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x9b, 0xa8, + 0x20, 0x0d, 0x06, 0xc0, 0x69, 0xc0, 0x47, 0x70, + 0xe7, 0xfd, 0x1c, 0x01, 0x31, 0x01, 0x23, 0x2d, + 0x01, 0x1b, 0x42, 0x99, 0xd9, 0x03, 0x20, 0x2d, + 0x01, 0x00, 0x47, 0x70, 0xe0, 0x01, 0x1c, 0x08, + 0xe7, 0xfb, 0xe7, 0xfa, 0xb5, 0xf3, 0xb0, 0x85, + 0x20, 0x00, 0x90, 0x03, 0x20, 0x00, 0x90, 0x02, + 0x9f, 0x05, 0x69, 0x3d, 0x69, 0x38, 0x28, 0x13, + 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x05, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x99, 0x06, + 0x68, 0x88, 0x68, 0x09, 0x1a, 0x40, 0x1c, 0x41, + 0x91, 0x04, 0x69, 0x78, 0x23, 0x04, 0x40, 0x18, + 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, + 0x00, 0xa8, 0x49, 0xf8, 0x58, 0x08, 0x99, 0x04, + 0x43, 0x48, 0x61, 0xf8, 0x99, 0x06, 0x68, 0x88, + 0x68, 0x09, 0x1a, 0x40, 0x30, 0x01, 0x63, 0xb8, + 0x68, 0xf8, 0x90, 0x01, 0x48, 0xf2, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x06, 0x98, 0x01, 0x28, 0x19, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0xe0, 0x05, 0x98, 0x01, 0x28, 0x08, 0xd3, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, + 0xd0, 0x07, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06, + 0xf0, 0x02, 0xf9, 0xea, 0x20, 0x00, 0xb0, 0x05, + 0xe7, 0xc5, 0x49, 0xe6, 0x20, 0x91, 0xf0, 0x1a, + 0xff, 0xb7, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x0b, 0xfb, 0x64, 0xe7, 0xf5, 0x98, 0x01, + 0x00, 0x80, 0x49, 0xe1, 0x58, 0x08, 0x99, 0x05, + 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 0x49, 0xdd, + 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, 0xe7, 0xae, + 0x48, 0xd9, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, + 0x2d, 0x0b, 0xdb, 0x26, 0x2d, 0x12, 0xdc, 0x24, + 0x2d, 0x0b, 0xdb, 0x0b, 0x2d, 0x12, 0xdc, 0x09, + 0x48, 0xd6, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, + 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06, 0xf0, 0x02, + 0xf9, 0xbb, 0xe0, 0x16, 0x6b, 0x38, 0xf7, 0xff, + 0xff, 0x7c, 0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00, + 0x48, 0xcf, 0xf0, 0x0c, 0xfb, 0x4b, 0x1d, 0xf8, + 0x30, 0x21, 0x99, 0x06, 0xf0, 0x02, 0xf9, 0xac, + 0x6b, 0x38, 0xf7, 0xff, 0xff, 0x6e, 0x90, 0x00, + 0x6a, 0xb9, 0x9a, 0x00, 0x48, 0xc8, 0xf0, 0x0c, + 0xfb, 0x6b, 0x48, 0xc8, 0x68, 0x00, 0x99, 0x05, + 0x42, 0x88, 0xd1, 0x30, 0x48, 0xc0, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x2c, 0x48, 0xc1, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x0a, 0x20, 0x0d, 0x06, 0xc0, + 0x68, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x01, + 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0xc8, 0x48, 0xba, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x0d, 0x6a, 0xb8, 0x30, 0x01, 0x05, 0x00, + 0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, 0x43, 0x08, + 0x6b, 0x79, 0x31, 0x02, 0x43, 0x08, 0x21, 0x0d, + 0x06, 0xc9, 0x61, 0x88, 0xe0, 0x0b, 0x6a, 0xb8, + 0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, + 0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, + 0x43, 0x08, 0x49, 0xaf, 0x60, 0x08, 0x2d, 0x0b, + 0xdb, 0x15, 0x2d, 0x12, 0xdc, 0x13, 0x48, 0xa9, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0f, 0x48, 0xa4, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x0b, 0x20, 0x00, + 0x62, 0xb8, 0x20, 0x00, 0x62, 0xf8, 0x48, 0xa7, + 0x63, 0x38, 0x48, 0xa7, 0x63, 0x78, 0x6b, 0x38, + 0xf7, 0xff, 0xff, 0x1b, 0x90, 0x00, 0x48, 0x9c, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d, + 0x06, 0xc0, 0x68, 0x80, 0x90, 0x03, 0x20, 0x00, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x01, + 0xfb, 0x07, 0x6b, 0x38, 0xf7, 0xff, 0xff, 0x09, + 0x90, 0x00, 0x9a, 0x00, 0x99, 0x01, 0x1c, 0x38, + 0xf0, 0x01, 0xfa, 0x8c, 0x98, 0x03, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0x48, 0x93, 0x68, 0x00, + 0x99, 0x05, 0x42, 0x88, 0xd1, 0x0b, 0x48, 0x8c, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x07, 0x48, 0x8d, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x98, 0x02, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x48, 0x86, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 0x48, 0x87, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, 0xb0, 0x84, + 0x98, 0x05, 0xf0, 0x0c, 0xf9, 0xe1, 0x28, 0x00, + 0xd1, 0x0e, 0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12, + 0xdd, 0x0a, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x0a, + 0xf0, 0x02, 0xf9, 0x12, 0x20, 0x92, 0x49, 0x7b, + 0x60, 0x08, 0x20, 0x00, 0xb0, 0x09, 0xe6, 0xea, + 0x49, 0x80, 0x20, 0x91, 0xf0, 0x1a, 0xfe, 0xdc, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0c, + 0xfa, 0x22, 0x20, 0x92, 0x49, 0x7b, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x7b, 0x68, 0x09, 0x60, 0x08, + 0x2d, 0x0b, 0xdb, 0x39, 0x2d, 0x12, 0xdc, 0x37, + 0xb0, 0x81, 0x24, 0x00, 0x20, 0x00, 0x90, 0x03, + 0x20, 0x01, 0x49, 0x75, 0x68, 0x09, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x6a, 0xb8, + 0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, + 0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, + 0x43, 0x08, 0x90, 0x00, 0x20, 0x00, 0x62, 0xb8, + 0x20, 0x00, 0x62, 0xf8, 0x48, 0x67, 0x63, 0x38, + 0x48, 0x67, 0x63, 0x78, 0x6b, 0x38, 0xf7, 0xff, + 0xfe, 0x9c, 0x90, 0x02, 0x48, 0x66, 0x68, 0x00, + 0x23, 0x77, 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x02, + 0x1c, 0x39, 0xf0, 0x0b, 0xfe, 0x05, 0x98, 0x00, + 0x49, 0x61, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x66, 0xc8, 0x48, 0x5e, 0x68, 0x00, + 0xf0, 0x0c, 0xf9, 0xf8, 0xb0, 0x01, 0xe1, 0x2b, + 0x24, 0x00, 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x16, + 0x2c, 0x07, 0xd2, 0x14, 0x6a, 0xf8, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, + 0x18, 0x18, 0x00, 0xc0, 0xe0, 0x00, 0xe1, 0x3c, + 0x4a, 0x53, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, + 0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe6, 0x2e, 0x00, + 0xd1, 0x13, 0x2c, 0x18, 0xd2, 0x11, 0x6a, 0xf8, + 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, + 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x48, 0x68, 0x12, + 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x40, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01, + 0xe7, 0xe9, 0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff, + 0xfe, 0x50, 0x90, 0x01, 0x2c, 0x07, 0xd2, 0x05, + 0x48, 0x3f, 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0b, + 0xfc, 0xcb, 0xe0, 0x06, 0x2c, 0x18, 0xd2, 0x04, + 0x1f, 0xe0, 0x49, 0x3b, 0x68, 0x09, 0xf0, 0x0b, + 0xfd, 0x01, 0x48, 0x3a, 0x49, 0x38, 0x68, 0x09, + 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x66, 0xc8, + 0x48, 0x36, 0x49, 0x35, 0x68, 0x09, 0x23, 0x09, + 0x01, 0xdb, 0x18, 0xc9, 0x67, 0x08, 0x48, 0x33, + 0x49, 0x31, 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, + 0x18, 0xc9, 0x66, 0x88, 0x48, 0x2f, 0x49, 0x2e, + 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, + 0x66, 0x48, 0x20, 0x00, 0x49, 0x2a, 0x68, 0x09, + 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, + 0x6b, 0x79, 0x48, 0x27, 0x68, 0x00, 0xf0, 0x0b, + 0xfd, 0x4b, 0x94, 0x02, 0x1d, 0xf8, 0x30, 0x21, + 0x99, 0x0a, 0xf0, 0x02, 0xf8, 0x4d, 0x24, 0x00, + 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x14, 0x2c, 0x07, + 0xd2, 0x12, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, 0x18, 0x18, + 0x00, 0xc0, 0x4a, 0x1b, 0x68, 0x12, 0x18, 0x80, + 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, + 0x42, 0x81, 0xda, 0x00, 0x26, 0x01, 0xe7, 0xe8, + 0x2e, 0x00, 0xd1, 0x2f, 0x2c, 0x18, 0xd2, 0x2d, + 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, + 0x34, 0x01, 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x10, + 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, 0xda, 0x1c, + 0xe0, 0x1a, 0x00, 0x00, 0x2e, 0x03, 0xa8, 0xc8, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, + 0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xbb, 0x00, 0x2e, 0x08, 0xba, 0x28, + 0x2e, 0x08, 0x9b, 0xb8, 0x00, 0x00, 0x02, 0xcf, + 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0xd1, 0xf4, + 0x2e, 0x08, 0xbb, 0x20, 0x00, 0x00, 0xff, 0xff, + 0x26, 0x01, 0xe7, 0xcd, 0x3c, 0x01, 0x6b, 0x38, + 0xf7, 0xff, 0xfd, 0xc3, 0x90, 0x01, 0x2c, 0x07, + 0xd2, 0x12, 0x48, 0x48, 0x68, 0x01, 0x1c, 0x20, + 0xf0, 0x0b, 0xfb, 0xcc, 0x00, 0xa0, 0x19, 0x00, + 0x00, 0xc0, 0x49, 0x44, 0x68, 0x09, 0x18, 0x40, + 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, 0x9a, 0x01, + 0x1c, 0x39, 0xf0, 0x0b, 0xfd, 0x21, 0xe0, 0x4a, + 0x2c, 0x18, 0xd2, 0x48, 0x1f, 0xe0, 0x49, 0x3d, + 0x68, 0x09, 0xf0, 0x0b, 0xfc, 0x0b, 0x20, 0x4c, + 0x43, 0x60, 0x49, 0x3a, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x9a, 0x01, + 0x1c, 0x39, 0xf0, 0x0b, 0xfd, 0x0d, 0x20, 0x4c, + 0x43, 0x60, 0x49, 0x34, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x82, 0x6f, 0xc0, + 0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c, 0x43, 0x60, + 0x49, 0x2e, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, + 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c, 0x43, 0x60, + 0x49, 0x28, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, + 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x0c, 0x00, + 0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02, 0x21, 0x4c, + 0x43, 0x61, 0x4a, 0x22, 0x68, 0x12, 0x18, 0x89, + 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, + 0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c, 0x43, 0x61, + 0x4a, 0x1c, 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, + 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 0x48, 0x19, + 0x68, 0x00, 0xf0, 0x0c, 0xf8, 0xcf, 0x6b, 0x79, + 0x48, 0x16, 0x68, 0x00, 0xf0, 0x0b, 0xfc, 0x36, + 0x98, 0x02, 0x42, 0x84, 0xda, 0x01, 0x1c, 0x21, + 0xe0, 0x00, 0x99, 0x02, 0x91, 0x00, 0x99, 0x00, + 0x48, 0x10, 0x68, 0x00, 0xf0, 0x0b, 0xfd, 0x46, + 0x49, 0x0f, 0x20, 0x91, 0xf0, 0x1a, 0xfd, 0x58, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x0b, + 0x68, 0x00, 0x90, 0x03, 0x48, 0x0b, 0x68, 0x00, + 0x49, 0x08, 0x60, 0x08, 0x98, 0x03, 0x49, 0x09, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, + 0xb0, 0x04, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x05, 0xe5, 0x4b, 0xb0, 0x05, + 0xe5, 0x49, 0x00, 0x00, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x24, + 0x2e, 0x08, 0xba, 0x2c, 0xb5, 0xff, 0x1c, 0x07, + 0x9d, 0x09, 0xb0, 0x89, 0x26, 0x00, 0x20, 0x00, + 0x90, 0x03, 0x99, 0x0a, 0x68, 0x4c, 0x2d, 0x13, + 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x09, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x15, + 0x60, 0x04, 0x20, 0x00, 0x60, 0xe0, 0x20, 0x00, + 0x61, 0x20, 0x69, 0x60, 0x4b, 0xf9, 0x40, 0x18, + 0x61, 0x60, 0x02, 0x00, 0x69, 0x60, 0x4b, 0xf8, + 0x40, 0x18, 0x61, 0x60, 0x04, 0x80, 0x69, 0x60, + 0x4b, 0xf6, 0x40, 0x18, 0x61, 0x60, 0x05, 0x80, + 0x69, 0x60, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x18, + 0x61, 0x60, 0x06, 0x00, 0x69, 0x60, 0x4b, 0xf2, + 0x40, 0x18, 0x61, 0x60, 0x04, 0x40, 0x69, 0x60, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x61, 0x60, + 0x06, 0x80, 0x69, 0x60, 0x09, 0x40, 0x01, 0x40, + 0x61, 0x60, 0x06, 0xc0, 0x20, 0x00, 0x61, 0xa0, + 0x20, 0x00, 0x61, 0xe0, 0x20, 0x00, 0x62, 0x20, + 0x20, 0x00, 0x62, 0x60, 0x20, 0x00, 0x63, 0xa0, + 0x20, 0x00, 0x63, 0xe0, 0x20, 0x00, 0x64, 0x60, + 0x20, 0x00, 0x64, 0x20, 0x20, 0x00, 0x60, 0x20, + 0x20, 0x00, 0x71, 0x20, 0x99, 0x0a, 0x68, 0x48, + 0x64, 0xe0, 0x99, 0x0a, 0x68, 0x08, 0x64, 0xa0, + 0x1d, 0xe0, 0x30, 0x21, 0x99, 0x13, 0xf0, 0x01, + 0xff, 0x07, 0x2d, 0x0b, 0xdb, 0x06, 0x2d, 0x12, + 0xdc, 0x04, 0x1d, 0xe0, 0x30, 0x49, 0x99, 0x13, + 0xf0, 0x01, 0xfe, 0xfe, 0x6b, 0x20, 0x6a, 0xa1, + 0x1a, 0x40, 0x30, 0x01, 0x63, 0xa0, 0x00, 0xa8, + 0x49, 0xd4, 0x58, 0x08, 0x69, 0x61, 0x09, 0x49, + 0x01, 0x49, 0x06, 0xc0, 0x0e, 0xc0, 0x43, 0x08, + 0x61, 0x60, 0x06, 0xc0, 0x0e, 0xc0, 0x6b, 0x20, + 0x6a, 0xa1, 0x1a, 0x40, 0x1c, 0x41, 0x91, 0x04, + 0x69, 0x60, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, + 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, 0x00, 0xa8, + 0x49, 0xc9, 0x58, 0x08, 0x99, 0x04, 0x43, 0x48, + 0x61, 0xe0, 0x2d, 0x13, 0xd1, 0x04, 0x20, 0x00, + 0x90, 0x14, 0x20, 0x00, 0x61, 0xa0, 0xe0, 0x13, + 0x9b, 0x0c, 0x68, 0x58, 0x90, 0x01, 0x98, 0x01, + 0x08, 0x80, 0x61, 0xa0, 0x98, 0x01, 0x64, 0x60, + 0x9b, 0x0c, 0x68, 0x18, 0x64, 0x20, 0x20, 0x00, + 0x62, 0x60, 0x9a, 0x0b, 0x63, 0xe2, 0x69, 0x60, + 0x4b, 0xb6, 0x40, 0x18, 0x61, 0x60, 0x02, 0x00, + 0x69, 0x60, 0x4b, 0xb6, 0x40, 0x18, 0x61, 0x60, + 0x05, 0x80, 0x69, 0x60, 0x23, 0x0f, 0x02, 0x9b, + 0x43, 0x18, 0x61, 0x60, 0x04, 0x80, 0x69, 0x60, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x61, 0x60, + 0x06, 0x80, 0x69, 0x60, 0x23, 0xc0, 0x43, 0x18, + 0x61, 0x60, 0x06, 0x00, 0x69, 0x60, 0x23, 0x01, + 0x03, 0x9b, 0x43, 0x18, 0x61, 0x60, 0x04, 0x40, + 0x98, 0x14, 0x60, 0xe0, 0x61, 0x25, 0x48, 0xab, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x98, 0x14, + 0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0xe0, 0x05, 0x98, 0x14, 0x28, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x09, + 0xe7, 0x35, 0x49, 0xa1, 0x20, 0x91, 0xf0, 0x1a, + 0xfc, 0x5b, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x0b, 0xf8, 0x08, 0xe7, 0xf5, 0x48, 0x9d, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x53, 0x68, 0x38, + 0x01, 0x80, 0x0f, 0xc0, 0x68, 0xa1, 0x4b, 0x9a, + 0x40, 0x19, 0x07, 0xc0, 0x09, 0x80, 0x43, 0x08, + 0x60, 0xa0, 0x01, 0x80, 0x0f, 0xc0, 0x68, 0x38, + 0x01, 0xc0, 0x0f, 0xc0, 0x68, 0xa1, 0x4b, 0x95, + 0x40, 0x19, 0x07, 0xc0, 0x09, 0xc0, 0x43, 0x08, + 0x60, 0xa0, 0x01, 0xc0, 0x0f, 0xc0, 0x68, 0x38, + 0x02, 0x00, 0x0e, 0x00, 0x68, 0xa1, 0x4b, 0x85, + 0x40, 0x19, 0x06, 0x00, 0x0e, 0x00, 0x04, 0x00, + 0x43, 0x08, 0x60, 0xa0, 0x02, 0x00, 0x0e, 0x00, + 0x48, 0x86, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x2a, + 0x2f, 0x00, 0xd0, 0x28, 0x20, 0x0d, 0x06, 0xc0, + 0x6a, 0x00, 0x1c, 0x06, 0x68, 0x38, 0x4b, 0x85, + 0x43, 0x98, 0xd0, 0x06, 0x68, 0x38, 0x02, 0x00, + 0x0e, 0x01, 0x20, 0x01, 0x40, 0x88, 0x43, 0x06, + 0xe0, 0x05, 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, + 0x21, 0x01, 0x40, 0x81, 0x43, 0x8e, 0x68, 0x38, + 0x4b, 0x7b, 0x43, 0x98, 0xd0, 0x08, 0x68, 0x38, + 0x02, 0x00, 0x0e, 0x00, 0x1d, 0xc1, 0x31, 0x01, + 0x20, 0x01, 0x40, 0x88, 0x43, 0x06, 0xe0, 0x06, + 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, 0x30, 0x08, + 0x21, 0x01, 0x40, 0x81, 0x43, 0x8e, 0x2d, 0x0b, + 0xdb, 0x0a, 0x2d, 0x12, 0xdc, 0x08, 0x48, 0x6f, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x20, 0x51, + 0x01, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x08, + 0x98, 0x14, 0x00, 0x80, 0x49, 0x6c, 0x58, 0x08, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0x83, 0x90, 0x03, + 0x2d, 0x0b, 0xdb, 0x08, 0x2d, 0x12, 0xdc, 0x06, + 0x48, 0x68, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x01, + 0x20, 0x84, 0x90, 0x03, 0xe0, 0x06, 0x9a, 0x0b, + 0x2a, 0x01, 0xd1, 0x03, 0x2d, 0x13, 0xd0, 0x01, + 0x20, 0x82, 0x90, 0x03, 0x98, 0x03, 0x28, 0x00, + 0xd0, 0x07, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, + 0x20, 0x08, 0x60, 0xe0, 0x98, 0x03, 0xb0, 0x09, + 0xe6, 0xa1, 0x98, 0x15, 0x68, 0x01, 0x98, 0x14, + 0x00, 0x80, 0x4a, 0x59, 0x50, 0x11, 0x6a, 0xa0, + 0x28, 0x00, 0xda, 0x01, 0x20, 0x00, 0x62, 0xa0, + 0x6b, 0x20, 0x28, 0x00, 0xdc, 0x01, 0x20, 0x01, + 0x63, 0x20, 0x6a, 0xe0, 0x28, 0x00, 0xda, 0x01, + 0x20, 0x00, 0x62, 0xe0, 0x6b, 0x60, 0x4b, 0x52, + 0x42, 0x98, 0xdd, 0x01, 0x48, 0x50, 0x63, 0x60, + 0x6b, 0x20, 0xf7, 0xff, 0xfb, 0x9e, 0x90, 0x00, + 0x2d, 0x13, 0xd1, 0x05, 0x6a, 0xa1, 0x9a, 0x00, + 0x48, 0x4c, 0xf0, 0x0b, 0xff, 0x99, 0xe0, 0x15, + 0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12, 0xdd, 0x03, + 0x48, 0x40, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x0d, + 0x2d, 0x0b, 0xdb, 0x06, 0x2d, 0x12, 0xdc, 0x04, + 0x48, 0x3e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x00, + 0xe0, 0x04, 0x6a, 0xa1, 0x9a, 0x00, 0x48, 0x41, + 0xf0, 0x0b, 0xff, 0x82, 0x2d, 0x0b, 0xdb, 0x5f, + 0x2d, 0x12, 0xdc, 0x5e, 0x98, 0x15, 0x68, 0x00, + 0x49, 0x3a, 0x60, 0x08, 0x99, 0x13, 0xa8, 0x05, + 0xf0, 0x01, 0xfd, 0xae, 0xa9, 0x05, 0x98, 0x15, + 0x68, 0x00, 0xf0, 0x05, 0xfc, 0x5f, 0x1d, 0xe0, + 0x30, 0x21, 0xa9, 0x05, 0xf0, 0x01, 0xfd, 0xa4, + 0x20, 0x01, 0x49, 0x35, 0x65, 0x08, 0x20, 0x02, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, + 0x20, 0x02, 0xf0, 0x04, 0xfa, 0xdd, 0x2d, 0x0b, + 0xd0, 0x05, 0x2d, 0x0f, 0xd0, 0x03, 0x2d, 0x10, + 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x03, 0x21, 0x00, + 0x20, 0x12, 0xf0, 0x04, 0xfa, 0xd1, 0x2d, 0x0c, + 0xd0, 0x01, 0x2d, 0x0f, 0xd1, 0x03, 0x21, 0x00, + 0x20, 0x04, 0xf0, 0x04, 0xfa, 0xc9, 0x2d, 0x0d, + 0xd0, 0x01, 0x2d, 0x10, 0xd1, 0x03, 0x21, 0x00, + 0x20, 0x08, 0xf0, 0x04, 0xfa, 0xc1, 0x2d, 0x0e, + 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x03, 0x21, 0x00, + 0x20, 0x01, 0xf0, 0x04, 0xfa, 0xb9, 0x48, 0x15, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 0xb0, 0x82, + 0x49, 0x1c, 0x20, 0x91, 0xf0, 0x1a, 0xfb, 0x40, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, + 0xfe, 0x86, 0x20, 0x92, 0x49, 0x17, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x17, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x15, 0x68, 0x09, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x25, + 0xe0, 0xae, 0xe0, 0xad, 0xff, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0x2e, 0x03, 0xa8, 0x78, + 0x2e, 0x03, 0xa8, 0xc8, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0x9d, 0xf0, + 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0xba, 0x28, + 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0xbb, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0x2e, 0x08, 0xd1, 0xf4, + 0x2e, 0x08, 0xbb, 0x20, 0x6a, 0xa0, 0x30, 0x01, + 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89, + 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08, + 0x90, 0x00, 0x20, 0x00, 0x62, 0xa0, 0x20, 0x00, + 0x62, 0xe0, 0x48, 0x5f, 0x63, 0x20, 0x48, 0x5f, + 0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff, 0xfa, 0xe1, + 0x90, 0x02, 0x48, 0x5d, 0x68, 0x00, 0x23, 0x77, + 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x02, 0x1c, 0x21, + 0xf0, 0x0b, 0xfa, 0x4a, 0x98, 0x00, 0x49, 0x58, + 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, + 0x66, 0xc8, 0x48, 0x55, 0x68, 0x00, 0x21, 0x00, + 0xf0, 0x0b, 0xfa, 0xc4, 0x48, 0x52, 0x68, 0x00, + 0xf0, 0x0b, 0xfe, 0x38, 0x49, 0x51, 0x20, 0x91, + 0xf0, 0x1a, 0xfa, 0xd2, 0xe0, 0x00, 0xe0, 0x11, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf6, 0x48, 0x4c, + 0x68, 0x00, 0x90, 0x01, 0x48, 0x4c, 0x68, 0x00, + 0x49, 0x49, 0x60, 0x08, 0x98, 0x01, 0x49, 0x4a, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x47, 0x60, 0x08, + 0xb0, 0x02, 0xe0, 0x40, 0x48, 0x47, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x0c, 0x6a, 0xa0, 0x30, 0x01, + 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89, + 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08, + 0x49, 0x41, 0x60, 0x08, 0xe0, 0x0c, 0x6a, 0xa0, + 0x30, 0x01, 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, + 0x02, 0x89, 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, + 0x43, 0x08, 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, + 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, + 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, + 0xf0, 0x00, 0xfe, 0x82, 0x48, 0x33, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x07, 0x20, 0x00, 0x62, 0xa0, + 0x20, 0x00, 0x62, 0xe0, 0x48, 0x2a, 0x63, 0x20, + 0x48, 0x2a, 0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff, + 0xfa, 0x78, 0x90, 0x00, 0x9a, 0x00, 0x99, 0x14, + 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xfb, 0x98, 0x02, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x05, + 0x2d, 0x13, 0xd1, 0x03, 0x20, 0x1f, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x08, 0x2d, 0x0b, 0xdb, 0x01, + 0x2d, 0x12, 0xdd, 0x1a, 0x48, 0x23, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d, 0x06, 0xc0, + 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfe, 0x50, + 0x6b, 0x20, 0xf7, 0xff, 0xfa, 0x52, 0x90, 0x00, + 0x9a, 0x00, 0x99, 0x14, 0x1c, 0x20, 0xf0, 0x00, + 0xfd, 0xd5, 0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0x88, 0x48, 0x14, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x06, 0x48, 0x14, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0x0d, 0x06, 0xc0, 0x62, 0x06, + 0x48, 0x0e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x07, + 0x48, 0x0e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x03, + 0x98, 0x14, 0x21, 0x00, 0xf0, 0x0b, 0xfd, 0x0a, + 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x09, 0xe5, 0x10, 0xb0, 0x09, 0xe5, 0x0e, + 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x3f, + 0x2e, 0x08, 0xbb, 0x20, 0x2e, 0x08, 0xd1, 0xf4, + 0x2e, 0x08, 0xbb, 0x24, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0x9b, 0xb8, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0xb5, 0xf7, 0xb0, 0x83, + 0x9f, 0x03, 0x69, 0x38, 0x90, 0x00, 0x98, 0x00, + 0x28, 0x13, 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x03, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x6c, 0x78, 0x99, 0x04, 0x60, 0x48, 0x6c, 0x38, + 0x99, 0x04, 0x60, 0x08, 0x6c, 0xf8, 0x9a, 0x05, + 0x60, 0x50, 0x6c, 0xb8, 0x9a, 0x05, 0x60, 0x10, + 0x68, 0xfd, 0x48, 0xf9, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x03, + 0xe7, 0xda, 0x49, 0xf0, 0x20, 0x91, 0xf0, 0x1a, + 0xf9, 0xf3, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x0a, 0xfd, 0xa0, 0xe7, 0xf5, 0x00, 0xa8, + 0x49, 0xeb, 0x58, 0x08, 0x99, 0x03, 0x42, 0x88, + 0xd0, 0x05, 0x20, 0x92, 0x49, 0xe7, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x03, 0xe7, 0xc4, 0x21, 0x00, + 0x00, 0xa8, 0x4a, 0xe5, 0x50, 0x11, 0x48, 0xe2, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x69, 0x38, + 0x28, 0x0b, 0xdb, 0x16, 0x69, 0x38, 0x28, 0x12, + 0xdc, 0x13, 0x48, 0xe0, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x06, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x03, + 0x69, 0x38, 0x28, 0x12, 0xdc, 0x00, 0xe0, 0x08, + 0x6b, 0x38, 0xf7, 0xff, 0xf9, 0xb6, 0x90, 0x01, + 0x6a, 0xb9, 0x9a, 0x01, 0x48, 0xd8, 0xf0, 0x0b, + 0xfd, 0x85, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x2e, + 0x69, 0x38, 0x28, 0x12, 0xdc, 0x2b, 0x48, 0xd0, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x27, 0x20, 0x00, + 0x49, 0xd2, 0x65, 0x08, 0x20, 0x01, 0x03, 0x00, + 0x49, 0xd0, 0x65, 0x48, 0x20, 0x00, 0x49, 0xcf, + 0x65, 0x88, 0x20, 0x00, 0x49, 0xcd, 0x65, 0xc8, + 0x20, 0x00, 0x49, 0xcc, 0x66, 0x08, 0x20, 0x00, + 0x49, 0xcb, 0x60, 0x08, 0x20, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, + 0xf0, 0x04, 0xf9, 0x0a, 0x48, 0xc3, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x04, 0x48, 0xc5, 0x21, 0x0d, + 0x06, 0xc9, 0x61, 0x88, 0xe0, 0x02, 0x48, 0xc3, + 0x49, 0xc3, 0x60, 0x08, 0xe0, 0x06, 0x69, 0x38, + 0x28, 0x13, 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x08, 0x48, 0xb6, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x2c, 0x20, 0x0d, 0x06, 0xc0, + 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfd, 0x64, + 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb7, + 0x18, 0xc9, 0x60, 0x08, 0x20, 0x00, 0x43, 0xc0, + 0x00, 0xe9, 0x4b, 0xb4, 0x18, 0xc9, 0x60, 0x48, + 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb1, + 0x18, 0xc9, 0x64, 0x08, 0x20, 0x00, 0x43, 0xc0, + 0x00, 0xe9, 0x4b, 0xae, 0x18, 0xc9, 0x64, 0x48, + 0x20, 0x01, 0x40, 0xa8, 0x43, 0xc0, 0x99, 0x02, + 0x40, 0x08, 0x90, 0x02, 0x98, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x9c, 0x69, 0x38, + 0x28, 0x0b, 0xdb, 0x74, 0x69, 0x38, 0x28, 0x12, + 0xdc, 0x72, 0x48, 0x9b, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x6f, 0x20, 0x00, 0x49, 0x9d, 0x65, 0x08, + 0x20, 0x01, 0x03, 0x00, 0x49, 0x9b, 0x65, 0x48, + 0x20, 0x00, 0x49, 0x9a, 0x65, 0x88, 0x20, 0x00, + 0x49, 0x98, 0x65, 0xc8, 0x20, 0x00, 0x49, 0x97, + 0x66, 0x08, 0x20, 0x00, 0x49, 0x96, 0x60, 0x08, + 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, + 0x21, 0x00, 0x20, 0x02, 0xf0, 0x04, 0xf8, 0xa0, + 0x49, 0x95, 0x20, 0x91, 0xf0, 0x1a, 0xf9, 0x2c, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, + 0xfc, 0x72, 0x20, 0x92, 0x49, 0x90, 0x60, 0x08, + 0x48, 0x90, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc0, 0x69, 0x80, 0x08, 0x40, 0x00, 0x40, + 0x49, 0x8c, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc9, 0x61, 0x88, 0x20, 0x01, 0x49, 0x89, + 0x68, 0x09, 0x60, 0x08, 0x20, 0x01, 0x49, 0x87, + 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, + 0x66, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x83, + 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, + 0x61, 0x08, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x7f, + 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, + 0x61, 0x48, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x7b, + 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, + 0x60, 0xc8, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x77, + 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, + 0x60, 0x88, 0x6b, 0x38, 0xf7, 0xff, 0xf8, 0xd9, + 0x90, 0x01, 0x48, 0x72, 0x68, 0x00, 0x23, 0x77, + 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x01, 0x1c, 0x39, + 0xf0, 0x0b, 0xf8, 0x42, 0xe0, 0x02, 0xe0, 0x23, + 0xe0, 0x22, 0xe0, 0x21, 0x48, 0x67, 0x49, 0x6b, + 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, + 0x66, 0xc8, 0x48, 0x68, 0x68, 0x00, 0x21, 0x00, + 0xf0, 0x0b, 0xf8, 0xb8, 0x48, 0x65, 0x68, 0x00, + 0xf0, 0x0b, 0xfc, 0x2c, 0x49, 0x62, 0x20, 0x91, + 0xf0, 0x1a, 0xf8, 0xc6, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x60, 0x68, 0x04, 0x48, 0x60, + 0x68, 0x00, 0x49, 0x5e, 0x60, 0x08, 0x48, 0x5e, + 0x60, 0x04, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, + 0x48, 0x52, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, + 0x48, 0x4d, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, + 0x1c, 0x28, 0xf0, 0x0b, 0xfb, 0x9d, 0x28, 0x01, + 0xd1, 0x6a, 0x98, 0x00, 0x28, 0x0b, 0xdb, 0x02, + 0x98, 0x00, 0x28, 0x12, 0xdd, 0x65, 0xb0, 0x84, + 0x49, 0x4f, 0x20, 0x91, 0xf0, 0x1a, 0xf8, 0xa0, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, + 0xfb, 0xe6, 0x48, 0x4c, 0x68, 0x00, 0x68, 0x40, + 0x28, 0x00, 0xd0, 0x06, 0x48, 0x49, 0x68, 0x00, + 0x68, 0x40, 0x38, 0x01, 0x49, 0x47, 0x68, 0x09, + 0x60, 0x48, 0x20, 0x92, 0x49, 0x44, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x44, 0x68, 0x09, 0x60, 0x08, + 0x24, 0x00, 0x20, 0x00, 0x90, 0x02, 0x98, 0x02, + 0x28, 0x00, 0xd1, 0x15, 0x2c, 0x07, 0xd2, 0x13, + 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, + 0x34, 0x01, 0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, + 0x4a, 0x3a, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, + 0xd1, 0x01, 0x20, 0x01, 0x90, 0x02, 0xe7, 0xe6, + 0x98, 0x02, 0x28, 0x00, 0xd1, 0x14, 0x2c, 0x18, + 0xd2, 0x12, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x20, 0x34, 0x01, 0x23, 0x4c, 0x43, 0x58, + 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, + 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, + 0xd1, 0x01, 0x20, 0x01, 0x90, 0x02, 0xe7, 0xe7, + 0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff, 0xf8, 0x41, + 0x90, 0x01, 0x2c, 0x07, 0xd2, 0x09, 0x48, 0x25, + 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfe, 0xbc, + 0x48, 0x22, 0x68, 0x00, 0xf0, 0x0b, 0xfb, 0xa6, + 0xe0, 0x09, 0x2c, 0x18, 0xd2, 0x07, 0xe0, 0x01, + 0xe0, 0x95, 0xe0, 0x94, 0x1f, 0xe0, 0x49, 0x1d, + 0x68, 0x09, 0xf0, 0x0a, 0xfe, 0xeb, 0x48, 0x1b, + 0x68, 0x00, 0x4b, 0x1c, 0x18, 0xc0, 0xf0, 0x0b, + 0xf8, 0x0b, 0x20, 0x00, 0x49, 0x17, 0x68, 0x09, + 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, + 0x48, 0x14, 0x68, 0x00, 0x68, 0x40, 0x28, 0x07, + 0xd3, 0x2c, 0x48, 0x12, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x23, 0xfe, + 0x43, 0x18, 0x49, 0x0e, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0xe0, 0x1c, 0x00, 0x00, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, + 0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xbb, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0xba, 0x28, 0x3f, 0xff, 0xff, 0xff, + 0x2e, 0x08, 0x9b, 0xb8, 0x68, 0x00, 0x04, 0x00, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0x00, 0x00, 0x04, 0xcc, + 0x61, 0x88, 0xe0, 0x2d, 0x26, 0x01, 0x21, 0x00, + 0x91, 0x00, 0x48, 0x2b, 0x68, 0x00, 0x68, 0x40, + 0x99, 0x00, 0x42, 0x88, 0xd8, 0x04, 0xe0, 0x06, + 0x99, 0x00, 0x31, 0x01, 0x91, 0x00, 0xe7, 0xf4, + 0x00, 0x70, 0x1c, 0x46, 0xe7, 0xf8, 0x08, 0x76, + 0x00, 0x76, 0x48, 0x23, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, + 0x0f, 0xc0, 0x49, 0x1f, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x48, 0x1c, + 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, + 0x69, 0x80, 0x43, 0x30, 0x49, 0x18, 0x68, 0x09, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, + 0x1c, 0x21, 0x48, 0x15, 0x68, 0x00, 0xf0, 0x0a, + 0xff, 0xb1, 0x6b, 0x79, 0x48, 0x12, 0x68, 0x00, + 0xf0, 0x0a, 0xfe, 0xe6, 0x1c, 0x28, 0x21, 0x00, + 0xf0, 0x0b, 0xfa, 0x88, 0x49, 0x0f, 0x20, 0x91, + 0xf0, 0x19, 0xff, 0xba, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x0b, 0x68, 0x00, 0x90, 0x03, + 0x48, 0x0b, 0x68, 0x00, 0x49, 0x08, 0x60, 0x08, + 0x98, 0x03, 0x49, 0x09, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x06, 0x60, 0x08, 0xb0, 0x04, 0x20, 0x92, + 0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, + 0xe5, 0x86, 0xb0, 0x03, 0xe5, 0x84, 0x00, 0x00, + 0x2e, 0x08, 0xbb, 0x20, 0x2e, 0x08, 0xd1, 0xf4, + 0x2e, 0x08, 0xbb, 0x24, 0x2e, 0x08, 0xba, 0x2c, + 0xb5, 0xf3, 0xb0, 0x85, 0x20, 0x00, 0x90, 0x01, + 0x9d, 0x05, 0x9f, 0x06, 0x69, 0x28, 0x90, 0x04, + 0x69, 0x3c, 0x98, 0x04, 0x28, 0x13, 0xd0, 0x01, + 0x2c, 0x13, 0xd1, 0x05, 0x20, 0xff, 0xb0, 0x05, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x68, 0xee, 0x68, 0xf9, 0x91, 0x03, 0x48, 0xdf, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x20, + 0x48, 0xd6, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, + 0x99, 0x03, 0x29, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, 0x99, 0x03, + 0x29, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x99, 0x03, + 0x60, 0xe9, 0x60, 0xfe, 0x20, 0x00, 0xb0, 0x05, + 0xe7, 0xce, 0xe1, 0x92, 0x1c, 0x3d, 0x9f, 0x05, + 0x9e, 0x03, 0x68, 0xf9, 0x91, 0x03, 0x9c, 0x04, + 0xe0, 0xaa, 0x48, 0xc6, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x06, 0x99, 0x03, 0x29, 0x19, 0xd3, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, + 0x99, 0x03, 0x29, 0x08, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd1, 0x73, + 0x49, 0xbd, 0x20, 0x91, 0xf0, 0x19, 0xff, 0x38, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, + 0xfa, 0xe5, 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0xb9, + 0x58, 0x08, 0x42, 0xa8, 0xd1, 0x05, 0x99, 0x03, + 0x00, 0x88, 0x49, 0xb6, 0x58, 0x08, 0x42, 0xb8, + 0xd0, 0x05, 0x20, 0x92, 0x49, 0xb2, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x05, 0xe7, 0x98, 0x48, 0xb2, + 0x68, 0x00, 0x42, 0xa8, 0xd0, 0x03, 0x48, 0xb0, + 0x68, 0x00, 0x42, 0xb8, 0xd1, 0x0a, 0x20, 0x0d, + 0x06, 0xc0, 0x68, 0xc0, 0x90, 0x01, 0x98, 0x01, + 0x28, 0x01, 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x99, 0x03, 0x60, 0xe9, + 0x60, 0xfe, 0x00, 0xb0, 0x49, 0xa5, 0x50, 0x0f, + 0x99, 0x03, 0x00, 0x88, 0x49, 0xa3, 0x50, 0x0d, + 0x48, 0xa0, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x55, + 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, + 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, + 0x20, 0x01, 0x40, 0xb0, 0x99, 0x02, 0x40, 0x08, + 0xd1, 0x12, 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x0b, 0x99, 0x03, + 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x99, 0x02, + 0x40, 0x08, 0x90, 0x02, 0x20, 0x01, 0x40, 0xb0, + 0x99, 0x02, 0x43, 0x08, 0x90, 0x02, 0xe0, 0x11, + 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 0x99, 0x02, + 0x40, 0x08, 0xd1, 0x0b, 0x20, 0x01, 0x40, 0xb0, + 0x43, 0xc0, 0x99, 0x02, 0x40, 0x08, 0x90, 0x02, + 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 0x99, 0x02, + 0x43, 0x08, 0x90, 0x02, 0x6b, 0x28, 0xf7, 0xfe, + 0xfe, 0xbc, 0x90, 0x00, 0x9a, 0x00, 0xe0, 0x00, + 0xe0, 0x22, 0x99, 0x03, 0x1c, 0x28, 0xf0, 0x00, + 0xfa, 0x3d, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0xb1, + 0x90, 0x00, 0x9a, 0x00, 0x1c, 0x31, 0x1c, 0x38, + 0xf0, 0x00, 0xfa, 0x34, 0x98, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0x48, 0x7c, 0x68, 0x00, + 0x42, 0xa8, 0xd0, 0x03, 0x48, 0x7a, 0x68, 0x00, + 0x42, 0xb8, 0xd1, 0x03, 0x98, 0x01, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x20, 0x92, 0x49, 0x74, + 0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x1b, + 0x49, 0x71, 0x20, 0x91, 0xf0, 0x19, 0xfe, 0xa0, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, + 0xfa, 0x4d, 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0x6d, + 0x58, 0x08, 0x42, 0xa8, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x69, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, + 0xe7, 0x06, 0x2c, 0x0b, 0xdb, 0x12, 0x2c, 0x12, + 0xdc, 0x10, 0x48, 0x67, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x09, 0x48, 0x65, 0x68, 0x00, 0x42, 0xa8, + 0xd0, 0x05, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x05, 0xe6, 0xf4, 0x48, 0x60, + 0x60, 0x07, 0xe0, 0x08, 0x6b, 0xf8, 0x28, 0x01, + 0xd1, 0x05, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x05, 0xe6, 0xe8, 0x48, 0x5a, + 0x68, 0x00, 0x42, 0xa8, 0xd1, 0x02, 0x20, 0x00, + 0x49, 0x57, 0x60, 0x08, 0x00, 0xb0, 0x49, 0x55, + 0x50, 0x0f, 0x99, 0x03, 0x60, 0xe9, 0x60, 0xfe, + 0x48, 0x50, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x73, + 0x6b, 0x28, 0xf7, 0xfe, 0xfe, 0x4e, 0x90, 0x00, + 0x6a, 0xa9, 0x9a, 0x00, 0x48, 0x4f, 0xf0, 0x0b, + 0xfa, 0x1d, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x45, + 0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00, 0x48, 0x4b, + 0xf0, 0x0b, 0xfa, 0x42, 0x48, 0x48, 0x68, 0x00, + 0x42, 0xa8, 0xd1, 0x0f, 0x20, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x2c, 0x0b, 0xdb, 0x01, + 0x2c, 0x12, 0xdd, 0x07, 0x21, 0x00, 0x20, 0x02, + 0xf0, 0x03, 0xfd, 0xae, 0x48, 0x42, 0x21, 0x0d, + 0x06, 0xc9, 0x61, 0x88, 0x2c, 0x0b, 0xdb, 0x42, + 0x2c, 0x12, 0xdc, 0x40, 0x98, 0x04, 0x42, 0xa0, + 0xd0, 0x2c, 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, 0xf0, 0x03, + 0xfd, 0x9b, 0x2c, 0x0f, 0xd0, 0x05, 0x2c, 0x10, + 0xd0, 0x03, 0x2c, 0x11, 0xd0, 0x01, 0x2c, 0x0b, + 0xd1, 0x03, 0x21, 0x00, 0x20, 0x12, 0xf0, 0x03, + 0xfd, 0x8f, 0x2c, 0x0c, 0xd0, 0x01, 0x2c, 0x0f, + 0xd1, 0x03, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x03, + 0xfd, 0x87, 0x2c, 0x0d, 0xd0, 0x01, 0x2c, 0x10, + 0xd1, 0x03, 0x21, 0x00, 0x20, 0x08, 0xf0, 0x03, + 0xfd, 0x7f, 0x2c, 0x0e, 0xd0, 0x01, 0x2c, 0x11, + 0xd1, 0x03, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x03, + 0xfd, 0x77, 0xe0, 0x03, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x6a, 0xb8, 0x30, 0x01, + 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, + 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, 0x43, 0x08, + 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, 0x20, 0x0d, + 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x00, + 0xe0, 0x1f, 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, + 0x99, 0x02, 0x40, 0x08, 0x90, 0x02, 0xf0, 0x00, + 0xf9, 0xcf, 0x6b, 0x38, 0xf7, 0xfe, 0xfd, 0xd1, + 0x90, 0x00, 0x9a, 0x00, 0x1c, 0x31, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x54, 0x98, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0x2c, 0x0b, 0xdb, 0x08, + 0x2c, 0x12, 0xdc, 0x06, 0x98, 0x04, 0x42, 0xa0, + 0xd1, 0x03, 0x20, 0x01, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0xc8, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x05, 0xe6, 0x3c, 0xb0, 0x05, + 0xe6, 0x3a, 0xe6, 0x39, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x2e, 0x08, 0xba, 0x28, 0x2e, 0x08, 0xbb, 0x00, + 0x3f, 0xff, 0xff, 0xff, 0xb5, 0xf0, 0x1c, 0x07, + 0x00, 0xb8, 0x49, 0x09, 0x58, 0x0c, 0x1c, 0x7d, + 0x60, 0xe5, 0x00, 0xa8, 0x49, 0x06, 0x50, 0x0c, + 0x6b, 0x20, 0xf7, 0xfe, 0xfd, 0x9a, 0x1c, 0x06, + 0x1c, 0x32, 0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x00, + 0xf9, 0x1d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xb9, 0xc4, 0xb5, 0xf0, 0x1c, 0x07, + 0x00, 0xb8, 0x49, 0x09, 0x58, 0x0c, 0x1e, 0x7d, + 0x60, 0xe5, 0x00, 0xa8, 0x49, 0x06, 0x50, 0x0c, + 0x6b, 0x20, 0xf7, 0xfe, 0xfd, 0x82, 0x1c, 0x06, + 0x1c, 0x32, 0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x00, + 0xf9, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xb9, 0xc4, 0xb5, 0xf3, 0x1c, 0x0f, + 0xb0, 0x86, 0x98, 0x06, 0x90, 0x05, 0x98, 0x05, + 0x68, 0xc5, 0x48, 0x77, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x20, 0xff, 0xb0, 0x06, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x05, 0x69, 0x00, 0x28, 0x13, 0xd1, 0x02, + 0x20, 0xff, 0xb0, 0x06, 0xe7, 0xf4, 0x49, 0x69, + 0x20, 0x91, 0xf0, 0x19, 0xfd, 0x5d, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, 0xf9, 0x0a, + 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x64, 0x58, 0x08, + 0x99, 0x05, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x60, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x06, + 0xe7, 0xde, 0x42, 0xbd, 0xd1, 0x05, 0x20, 0x92, + 0x49, 0x5c, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, + 0xe7, 0xd6, 0x20, 0x00, 0x00, 0xa9, 0x4a, 0x5a, + 0x50, 0x50, 0x98, 0x05, 0x60, 0xc7, 0x48, 0x59, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x0d, 0x48, 0x54, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x09, 0x99, 0x05, + 0x00, 0xb8, 0x4a, 0x53, 0x50, 0x11, 0x20, 0x92, + 0x49, 0x50, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, + 0xe7, 0xbe, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, + 0x1c, 0x04, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, + 0x4b, 0x4b, 0x18, 0xc9, 0x60, 0x08, 0x20, 0x00, + 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x48, 0x18, 0xc9, + 0x60, 0x48, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, + 0x4b, 0x45, 0x18, 0xc9, 0x64, 0x08, 0x20, 0x00, + 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x42, 0x18, 0xc9, + 0x64, 0x48, 0x20, 0x01, 0x90, 0x01, 0x20, 0x01, + 0x40, 0xa8, 0x40, 0x20, 0xd1, 0x01, 0x20, 0x00, + 0x90, 0x01, 0x20, 0x01, 0x40, 0xa8, 0x43, 0xc0, + 0x40, 0x04, 0x1c, 0x3e, 0x42, 0xbd, 0xd9, 0x23, + 0x00, 0xb0, 0x49, 0x37, 0x58, 0x08, 0x28, 0x00, + 0xd0, 0x01, 0x36, 0x01, 0xe7, 0xf8, 0x1e, 0x70, + 0x90, 0x04, 0x98, 0x04, 0x42, 0xb8, 0xda, 0x04, + 0xe0, 0x07, 0x98, 0x04, 0x38, 0x01, 0x90, 0x04, + 0xe7, 0xf7, 0x98, 0x04, 0xf7, 0xff, 0xff, 0x32, + 0xe7, 0xf7, 0x20, 0xff, 0x40, 0xb8, 0x90, 0x03, + 0x20, 0xff, 0x40, 0xb0, 0x43, 0xc0, 0x99, 0x03, + 0x40, 0x08, 0x90, 0x03, 0x98, 0x03, 0x00, 0x40, + 0x90, 0x03, 0x00, 0x60, 0x90, 0x00, 0xe0, 0x1f, + 0x00, 0xb0, 0x49, 0x25, 0x58, 0x08, 0x28, 0x00, + 0xd0, 0x01, 0x3e, 0x01, 0xe7, 0xf8, 0x1c, 0x70, + 0x90, 0x04, 0x98, 0x04, 0x42, 0xb8, 0xd9, 0x04, + 0xe0, 0x07, 0x98, 0x04, 0x30, 0x01, 0x90, 0x04, + 0xe7, 0xf7, 0x98, 0x04, 0xf7, 0xff, 0xff, 0x26, + 0xe7, 0xf7, 0x20, 0xff, 0x40, 0xb0, 0x90, 0x03, + 0x20, 0xff, 0x40, 0xb8, 0x43, 0xc0, 0x99, 0x03, + 0x40, 0x08, 0x90, 0x03, 0x08, 0x60, 0x90, 0x00, + 0x98, 0x00, 0x99, 0x03, 0x40, 0x08, 0x90, 0x00, + 0x98, 0x03, 0x43, 0x84, 0x98, 0x00, 0x43, 0x04, + 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 0x40, 0x04, + 0x98, 0x01, 0x40, 0xb8, 0x43, 0x04, 0x99, 0x05, + 0x00, 0xb8, 0x4a, 0x0d, 0x50, 0x11, 0x98, 0x05, + 0x6b, 0x00, 0xf7, 0xfe, 0xfc, 0x92, 0x90, 0x02, + 0x9a, 0x02, 0x1c, 0x39, 0x98, 0x05, 0xf0, 0x00, + 0xf8, 0x15, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0x84, + 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x06, 0xe7, 0x25, 0xb0, 0x06, 0xe7, 0x23, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, + 0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0x9d, 0xf0, + 0x68, 0x00, 0x04, 0x00, 0xb5, 0xf7, 0x1c, 0x04, + 0x1c, 0x0f, 0x01, 0x3d, 0x4b, 0x2f, 0x18, 0xe9, + 0x1d, 0xe2, 0x32, 0x0d, 0x20, 0x00, 0x28, 0x03, + 0xd3, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xca, 0x20, 0xc1, 0x20, 0xe7, 0xfa, 0x6a, 0xe3, + 0x05, 0x9d, 0x0d, 0xad, 0x00, 0xfe, 0x4b, 0x28, + 0x18, 0xf3, 0x60, 0x1d, 0x6b, 0x63, 0x33, 0x01, + 0x05, 0x9d, 0x0d, 0xad, 0x00, 0xfe, 0x4b, 0x24, + 0x18, 0xf3, 0x60, 0x5d, 0x6a, 0xa5, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x1d, 0x00, 0xfe, 0x4b, 0x20, + 0x18, 0xf3, 0x64, 0x1d, 0x9d, 0x02, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x1d, 0x00, 0xfe, 0x4b, 0x1c, + 0x18, 0xf3, 0x64, 0x5d, 0x4b, 0x1b, 0x68, 0x1b, + 0x2b, 0x01, 0xd1, 0x2a, 0x2f, 0x00, 0xd1, 0x28, + 0x4b, 0x17, 0x68, 0x5d, 0x23, 0x8f, 0x00, 0x9b, + 0x42, 0x9d, 0xd3, 0x03, 0x23, 0x8f, 0x00, 0x9b, + 0x4d, 0x13, 0x60, 0x6b, 0x4b, 0x12, 0x68, 0x1d, + 0x4b, 0x13, 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x12, + 0x4d, 0x0f, 0x60, 0x2b, 0x4b, 0x0e, 0x6c, 0x5d, + 0x23, 0x01, 0x02, 0x9b, 0x1a, 0xed, 0x23, 0xb3, + 0x00, 0x9b, 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x0d, + 0x4d, 0x09, 0x64, 0x6b, 0x4b, 0x08, 0x6c, 0x1d, + 0x23, 0x01, 0x02, 0x9b, 0x1a, 0xed, 0x4b, 0x0a, + 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x09, 0x4d, 0x04, + 0x64, 0x2b, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x68, 0x00, 0x0c, 0x00, + 0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x00, 0x00, 0x02, 0x3a, 0x00, 0x00, 0x06, 0xcc, + 0x00, 0x00, 0x02, 0xca, 0x00, 0x00, 0x06, 0xca, + 0xb4, 0xf0, 0x4f, 0x15, 0x4c, 0x15, 0x20, 0x00, + 0x21, 0x00, 0x22, 0x00, 0x43, 0xd2, 0x4d, 0x14, + 0x68, 0x6d, 0x42, 0x85, 0xdd, 0x1b, 0x1c, 0x05, + 0x30, 0x01, 0x00, 0xad, 0x59, 0x7b, 0x42, 0x93, + 0xd0, 0xf9, 0x4d, 0x0f, 0x68, 0x6d, 0x42, 0x85, + 0xda, 0x00, 0xe0, 0x10, 0x31, 0x01, 0x1c, 0x05, + 0x30, 0x01, 0x00, 0xad, 0x59, 0x7a, 0x42, 0x93, + 0xd0, 0xf9, 0x02, 0x95, 0x43, 0x1d, 0x1c, 0x2e, + 0xc4, 0x40, 0x4d, 0x07, 0x68, 0x6d, 0x42, 0x85, + 0xdb, 0x00, 0x31, 0x01, 0xe7, 0xdf, 0x25, 0x0d, + 0x06, 0xed, 0x61, 0x29, 0xbc, 0xf0, 0x47, 0x70, + 0x2e, 0x08, 0xba, 0x38, 0x68, 0x00, 0x0d, 0x40, + 0x2e, 0x08, 0xbb, 0x00, 0xb5, 0xf3, 0xb0, 0x82, + 0x9d, 0x02, 0x69, 0x2c, 0x2c, 0x13, 0xd1, 0x05, + 0x20, 0x75, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x68, 0xee, 0x48, 0xf8, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, + 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, 0x49, 0xef, + 0x20, 0x91, 0xf0, 0x19, 0xfb, 0xbd, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xff, 0x6a, + 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0xea, 0x58, 0x08, + 0x99, 0x02, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0xe6, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x02, + 0xe7, 0xd0, 0x48, 0xe3, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x16, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, + 0x90, 0x01, 0x99, 0x03, 0x29, 0x01, 0xd1, 0x05, + 0x20, 0x01, 0x40, 0xb0, 0x99, 0x01, 0x43, 0x08, + 0x90, 0x01, 0xe0, 0x05, 0x20, 0x01, 0x40, 0xb0, + 0x43, 0xc0, 0x99, 0x01, 0x40, 0x08, 0x90, 0x01, + 0x98, 0x01, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, + 0x48, 0xd8, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, + 0x48, 0xd3, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, + 0x99, 0x03, 0x29, 0x01, 0xd1, 0x6c, 0xb0, 0x83, + 0x1c, 0x30, 0xf0, 0x0a, 0xfe, 0x71, 0x28, 0x01, + 0xd1, 0x05, 0x20, 0x92, 0x49, 0xcd, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x9e, 0x49, 0xce, + 0x20, 0x91, 0xf0, 0x19, 0xfb, 0x75, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfe, 0xbb, + 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x06, + 0x48, 0xc8, 0x68, 0x00, 0x68, 0x40, 0x30, 0x01, + 0x49, 0xc6, 0x68, 0x09, 0x60, 0x48, 0x20, 0x92, + 0x49, 0xc3, 0x60, 0x08, 0x20, 0x01, 0x49, 0xc3, + 0x68, 0x09, 0x60, 0x08, 0x2c, 0x0b, 0xdb, 0x11, + 0x2c, 0x12, 0xdc, 0x0f, 0x48, 0xbf, 0x68, 0x00, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, + 0x23, 0x01, 0x43, 0x18, 0x49, 0xbb, 0x68, 0x09, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, + 0x27, 0x00, 0xe0, 0xbc, 0x27, 0x00, 0x20, 0x00, + 0x90, 0x01, 0x98, 0x01, 0x28, 0x00, 0xd1, 0x15, + 0x2f, 0x07, 0xd2, 0x13, 0x6a, 0xe8, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, + 0x18, 0x18, 0x00, 0xc0, 0x4a, 0xaf, 0x68, 0x12, + 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, + 0x6f, 0xc0, 0x42, 0x81, 0xda, 0x01, 0x20, 0x01, + 0x90, 0x01, 0xe7, 0xe6, 0x98, 0x01, 0x28, 0x00, + 0xd1, 0x16, 0x2f, 0x18, 0xd2, 0x14, 0x6a, 0xe8, + 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, + 0x23, 0x4c, 0x43, 0x58, 0x4a, 0xa3, 0x68, 0x12, + 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x40, 0x42, 0x81, 0xda, 0x03, 0xe0, 0x00, + 0xe0, 0xb0, 0x20, 0x01, 0x90, 0x01, 0xe7, 0xe5, + 0x3f, 0x01, 0x6b, 0x28, 0xf7, 0xfe, 0xfb, 0x01, + 0x90, 0x00, 0x2f, 0x07, 0xd2, 0x16, 0x48, 0x99, + 0x68, 0x01, 0x1c, 0x38, 0xf0, 0x0a, 0xf9, 0x0a, + 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x95, + 0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b, + 0x18, 0xc0, 0x9a, 0x00, 0x1c, 0x29, 0xf0, 0x0a, + 0xfa, 0x5f, 0x48, 0x90, 0x68, 0x00, 0xf0, 0x0a, + 0xfe, 0x59, 0xe0, 0x4a, 0x2f, 0x18, 0xd2, 0x48, + 0x1f, 0xf8, 0x49, 0x8c, 0x68, 0x09, 0xf0, 0x0a, + 0xf9, 0x45, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x89, + 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x0a, 0x9a, 0x00, 0x1c, 0x29, 0xf0, 0x0a, + 0xfa, 0x47, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x83, + 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x82, 0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17, + 0x20, 0x4c, 0x43, 0x78, 0x49, 0x7d, 0x68, 0x09, + 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b, + 0x20, 0x4c, 0x43, 0x78, 0x49, 0x77, 0x68, 0x09, + 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x68, 0x00, 0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a, + 0x20, 0x02, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x71, + 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, + 0x39, 0x82, 0x67, 0x48, 0xe0, 0x09, 0x20, 0x03, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x6b, 0x68, 0x12, + 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, + 0x67, 0x48, 0x48, 0x68, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x00, 0x40, + 0x90, 0x03, 0x98, 0x03, 0x23, 0x02, 0x43, 0x18, + 0x90, 0x03, 0x48, 0x62, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, + 0x0f, 0xc0, 0x99, 0x03, 0x18, 0x40, 0x90, 0x03, + 0x98, 0x03, 0x49, 0x5c, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x1c, 0x39, + 0x48, 0x58, 0x68, 0x00, 0xf0, 0x0a, 0xfa, 0x72, + 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x04, + 0x6b, 0x69, 0x48, 0x54, 0x68, 0x00, 0xf0, 0x0a, + 0xf9, 0x4d, 0x1c, 0x30, 0x21, 0x01, 0xf0, 0x0a, + 0xfd, 0x45, 0x49, 0x4f, 0x20, 0x91, 0xf0, 0x19, + 0xfa, 0x77, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0x48, 0x4c, 0x68, 0x00, 0x90, 0x02, 0x48, 0x4c, + 0x68, 0x00, 0x49, 0x4a, 0x60, 0x08, 0x98, 0x02, + 0x49, 0x49, 0x60, 0x08, 0x20, 0x92, 0x49, 0x46, + 0x60, 0x08, 0xb0, 0x03, 0x48, 0x43, 0x68, 0x00, + 0x28, 0x01, 0xd1, 0x75, 0x48, 0x3e, 0x68, 0x00, + 0x28, 0x01, 0xd1, 0x71, 0x99, 0x03, 0x29, 0x00, + 0xd1, 0x6e, 0xb0, 0x85, 0x1c, 0x30, 0xf0, 0x0a, + 0xfd, 0x47, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, + 0x49, 0x38, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x07, + 0xe6, 0x74, 0x49, 0x39, 0x20, 0x91, 0xf0, 0x19, + 0xfa, 0x4b, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0xf0, 0x0a, 0xfd, 0x91, 0x2c, 0x0b, 0xdb, 0x01, + 0x2c, 0x12, 0xdd, 0x0b, 0x48, 0x33, 0x68, 0x00, + 0x68, 0x40, 0x28, 0x00, 0xd0, 0x06, 0x48, 0x31, + 0x68, 0x00, 0x68, 0x40, 0x38, 0x01, 0x49, 0x2f, + 0x68, 0x09, 0x60, 0x48, 0x20, 0x92, 0x49, 0x2c, + 0x60, 0x08, 0x20, 0x01, 0x49, 0x2b, 0x68, 0x09, + 0x60, 0x08, 0x2c, 0x0b, 0xdb, 0x11, 0x2c, 0x12, + 0xdc, 0x0f, 0x48, 0x28, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x08, 0x40, + 0x00, 0x40, 0x49, 0x24, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x27, 0x00, + 0xe0, 0xb2, 0x27, 0x00, 0x20, 0x00, 0x90, 0x03, + 0x98, 0x03, 0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07, + 0xd2, 0x13, 0x6a, 0xe8, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 0x18, 0x18, + 0x00, 0xc0, 0x4a, 0x18, 0x68, 0x12, 0x18, 0x80, + 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, + 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x03, + 0xe7, 0xe6, 0x98, 0x03, 0x28, 0x00, 0xd1, 0x26, + 0x2f, 0x18, 0xd2, 0x24, 0x6a, 0xe8, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, + 0x43, 0x58, 0x4a, 0x0c, 0x68, 0x12, 0x18, 0x80, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0xe0, 0x00, + 0xe0, 0xa9, 0x69, 0x40, 0x42, 0x81, 0xd1, 0x11, + 0x20, 0x01, 0x90, 0x03, 0xe0, 0x0e, 0x00, 0x00, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, + 0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0xe7, 0xd5, 0x3f, 0x01, + 0x6b, 0x28, 0xf7, 0xfe, 0xf9, 0xc2, 0x90, 0x01, + 0x2f, 0x07, 0xd2, 0x09, 0x48, 0x4a, 0x68, 0x01, + 0x1c, 0x38, 0xf0, 0x0a, 0xf8, 0x3d, 0x48, 0x48, + 0x68, 0x00, 0xf0, 0x0a, 0xfd, 0x27, 0xe0, 0x06, + 0x2f, 0x18, 0xd2, 0x04, 0x1f, 0xf8, 0x49, 0x44, + 0x68, 0x09, 0xf0, 0x0a, 0xf8, 0x6f, 0x48, 0x42, + 0x68, 0x00, 0x4b, 0x42, 0x18, 0xc0, 0xf0, 0x0a, + 0xf9, 0x8f, 0x20, 0x00, 0x49, 0x3e, 0x68, 0x09, + 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, + 0x48, 0x3b, 0x68, 0x00, 0x68, 0x40, 0x28, 0x07, + 0xd3, 0x0e, 0x48, 0x39, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x23, 0xfe, + 0x43, 0x18, 0x49, 0x35, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0xe0, 0x33, + 0x20, 0x01, 0x90, 0x00, 0x21, 0x00, 0x91, 0x02, + 0x48, 0x2f, 0x68, 0x00, 0x68, 0x40, 0x99, 0x02, + 0x42, 0x88, 0xd8, 0x04, 0xe0, 0x08, 0x99, 0x02, + 0x31, 0x01, 0x91, 0x02, 0xe7, 0xf4, 0x98, 0x00, + 0x00, 0x40, 0x30, 0x01, 0x90, 0x00, 0xe7, 0xf6, + 0x98, 0x00, 0x08, 0x40, 0x00, 0x40, 0x90, 0x00, + 0x48, 0x25, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, + 0x49, 0x21, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc9, 0x61, 0x88, 0x48, 0x1e, 0x68, 0x00, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, + 0x99, 0x00, 0x43, 0x08, 0x49, 0x1a, 0x68, 0x09, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, + 0x1c, 0x39, 0x48, 0x17, 0x68, 0x00, 0xf0, 0x0a, + 0xf9, 0x4d, 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, + 0xdd, 0x04, 0x6b, 0x69, 0x48, 0x12, 0x68, 0x00, + 0xf0, 0x0a, 0xf8, 0x7e, 0x1c, 0x30, 0x21, 0x00, + 0xf0, 0x0a, 0xfc, 0x20, 0x49, 0x10, 0x20, 0x91, + 0xf0, 0x19, 0xf9, 0x52, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x0b, 0x68, 0x00, 0x90, 0x04, + 0x48, 0x0c, 0x68, 0x00, 0x49, 0x08, 0x60, 0x08, + 0x98, 0x04, 0x49, 0x0a, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x07, 0x60, 0x08, 0xb0, 0x05, 0x20, 0x92, + 0x49, 0x07, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, + 0xe5, 0x60, 0xb0, 0x02, 0xe5, 0x5e, 0x00, 0x00, + 0x2e, 0x08, 0xbb, 0x20, 0x00, 0x00, 0x04, 0xcc, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x24, + 0x2e, 0x08, 0xba, 0x2c, 0xb5, 0xf3, 0x1c, 0x07, + 0x1c, 0x3e, 0x69, 0x30, 0x28, 0x13, 0xd1, 0x04, + 0x20, 0x75, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0xf4, 0x48, 0x1e, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x2c, 0x19, 0xd3, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, + 0x2c, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, + 0xe7, 0xe7, 0x49, 0x16, 0x20, 0x91, 0xf0, 0x19, + 0xf9, 0x0b, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x09, 0xfc, 0xb8, 0xe7, 0xf5, 0x00, 0xa0, + 0x49, 0x11, 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x04, + 0x20, 0x92, 0x49, 0x0e, 0x60, 0x08, 0x20, 0xff, + 0xe7, 0xd3, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, + 0x1c, 0x05, 0x20, 0x01, 0x40, 0xa0, 0x40, 0x05, + 0x2d, 0x00, 0xd1, 0x03, 0x20, 0x00, 0x99, 0x01, + 0x60, 0x08, 0xe0, 0x02, 0x20, 0x01, 0x99, 0x01, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x03, 0x60, 0x08, + 0x20, 0x00, 0xe7, 0xbe, 0xe7, 0xbd, 0x00, 0x00, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, + 0x2e, 0x08, 0xb9, 0xc4, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x81, 0x1c, 0x3c, 0x68, 0xe5, 0x69, 0x60, + 0x4b, 0x49, 0x40, 0x18, 0x99, 0x02, 0x07, 0x89, + 0x0f, 0x89, 0x02, 0x09, 0x43, 0x08, 0x61, 0x60, + 0x05, 0x80, 0x48, 0x46, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0xb0, 0x01, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x49, 0x3b, 0x20, 0x91, 0xf0, 0x19, 0xf8, 0xb4, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, + 0xfc, 0x61, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, + 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x01, + 0xe7, 0xe6, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0c, + 0x69, 0x20, 0x28, 0x12, 0xdc, 0x09, 0x01, 0x28, + 0x4b, 0x2d, 0x18, 0xc1, 0x91, 0x00, 0x1d, 0xe6, + 0x36, 0x0d, 0x68, 0x30, 0x99, 0x00, 0x60, 0x08, + 0xe0, 0x41, 0x48, 0x26, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x3d, 0x48, 0x28, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a, + 0xfb, 0x73, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, + 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, + 0xe7, 0xbe, 0x49, 0x21, 0x20, 0x91, 0xf0, 0x19, + 0xf8, 0x77, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0xf0, 0x0a, 0xfb, 0xbd, 0x20, 0x92, 0x49, 0x1c, + 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 0x68, 0x09, + 0x60, 0x08, 0x48, 0x1a, 0x68, 0x01, 0x1c, 0x20, + 0xf0, 0x0a, 0xfb, 0x6e, 0x90, 0x00, 0x69, 0x60, + 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 0x20, 0x91, + 0xf0, 0x19, 0xf8, 0x5e, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x12, 0x68, 0x00, 0x90, 0x01, + 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 0x60, 0x08, + 0x98, 0x01, 0x49, 0x0f, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, + 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, + 0xe7, 0x8a, 0xb0, 0x01, 0xe7, 0x88, 0x00, 0x00, + 0xff, 0xff, 0xfc, 0xff, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x81, 0x1c, 0x3c, 0x68, 0xe5, 0x69, 0x60, + 0x4b, 0x49, 0x40, 0x18, 0x99, 0x02, 0x07, 0x09, + 0x0f, 0x09, 0x02, 0x89, 0x43, 0x08, 0x61, 0x60, + 0x04, 0x80, 0x48, 0x46, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0xb0, 0x01, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x49, 0x3b, 0x20, 0x91, 0xf0, 0x19, 0xf8, 0x08, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, + 0xfb, 0xb5, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, + 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x01, + 0xe7, 0xe6, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0c, + 0x69, 0x20, 0x28, 0x12, 0xdc, 0x09, 0x01, 0x28, + 0x4b, 0x2d, 0x18, 0xc6, 0x1d, 0xe0, 0x30, 0x0d, + 0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 0x60, 0x30, + 0xe0, 0x41, 0x48, 0x26, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x3d, 0x48, 0x28, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a, + 0xfa, 0xc7, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, + 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, + 0xe7, 0xbe, 0x49, 0x21, 0x20, 0x91, 0xf0, 0x18, + 0xff, 0xcb, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0xf0, 0x0a, 0xfb, 0x11, 0x20, 0x92, 0x49, 0x1c, + 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 0x68, 0x09, + 0x60, 0x08, 0x48, 0x1a, 0x68, 0x01, 0x1c, 0x20, + 0xf0, 0x0a, 0xfa, 0xc2, 0x90, 0x00, 0x69, 0x60, + 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 0x20, 0x91, + 0xf0, 0x18, 0xff, 0xb2, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x12, 0x68, 0x00, 0x90, 0x01, + 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 0x60, 0x08, + 0x98, 0x01, 0x49, 0x0f, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, + 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, + 0xe7, 0x8a, 0xb0, 0x01, 0xe7, 0x88, 0x00, 0x00, + 0xff, 0xff, 0xc3, 0xff, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x82, 0x1c, 0x3c, 0x68, 0xe5, 0x26, 0x00, + 0x99, 0x03, 0x29, 0x01, 0xd1, 0x00, 0x26, 0x01, + 0x69, 0x60, 0x06, 0x80, 0x0f, 0xc0, 0x42, 0xb0, + 0xd1, 0x05, 0x20, 0x00, 0xb0, 0x02, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x69, 0x60, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x07, 0xf1, + 0x0e, 0x89, 0x43, 0x08, 0x61, 0x60, 0x06, 0x80, + 0x48, 0x44, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, + 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xde, + 0x49, 0x3b, 0x20, 0x91, 0xf0, 0x18, 0xff, 0x50, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, + 0xfa, 0xfd, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, + 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x02, + 0xe7, 0xc9, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0e, + 0x69, 0x20, 0x28, 0x12, 0xdc, 0x0b, 0x01, 0x28, + 0x4b, 0x2d, 0x18, 0xc1, 0x91, 0x01, 0x1d, 0xe0, + 0x30, 0x0d, 0x90, 0x00, 0x98, 0x00, 0x68, 0x00, + 0x99, 0x01, 0x60, 0x08, 0xe0, 0x41, 0x48, 0x25, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, + 0x1c, 0x28, 0xf0, 0x0a, 0xfa, 0x0d, 0x28, 0x00, + 0xd1, 0x05, 0x20, 0x92, 0x49, 0x1e, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x04, 0xe7, 0x9f, 0x49, 0x20, + 0x20, 0x91, 0xf0, 0x18, 0xff, 0x11, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfa, 0x57, + 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, + 0x49, 0x1a, 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, + 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfa, 0x08, + 0x90, 0x00, 0x69, 0x60, 0x99, 0x00, 0x60, 0xc8, + 0x49, 0x13, 0x20, 0x91, 0xf0, 0x18, 0xfe, 0xf8, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, + 0x68, 0x00, 0x90, 0x01, 0x48, 0x10, 0x68, 0x00, + 0x49, 0x0e, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 0x60, 0x08, + 0xb0, 0x02, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x6b, 0xb0, 0x02, + 0xe7, 0x69, 0x00, 0x00, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x0f, 0xb0, 0x83, 0x1c, 0x25, 0x69, 0x28, + 0x28, 0x13, 0xd1, 0x04, 0x20, 0x75, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xee, + 0x20, 0x04, 0x40, 0x38, 0x08, 0x81, 0x91, 0x02, + 0x69, 0x68, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x18, + 0x07, 0xb9, 0x0f, 0x89, 0x01, 0x89, 0x43, 0x08, + 0x61, 0x68, 0x06, 0x00, 0x69, 0x68, 0x4b, 0x48, + 0x40, 0x18, 0x99, 0x02, 0x07, 0xc9, 0x0c, 0x49, + 0x43, 0x08, 0x61, 0x68, 0x04, 0x40, 0x48, 0x45, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, + 0x20, 0x00, 0xb0, 0x03, 0xe7, 0xd0, 0x49, 0x3c, + 0x20, 0x91, 0xf0, 0x18, 0xfe, 0x91, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xfa, 0x3e, + 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0x37, 0x58, 0x08, + 0x42, 0xa0, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x34, + 0x60, 0x08, 0x20, 0xff, 0xb0, 0x03, 0xe7, 0xbb, + 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, + 0x69, 0x28, 0x28, 0x0b, 0xdb, 0x0e, 0x69, 0x28, + 0x28, 0x12, 0xdc, 0x0b, 0x01, 0x30, 0x4b, 0x2e, + 0x18, 0xc0, 0x90, 0x01, 0x1d, 0xe8, 0x30, 0x0d, + 0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 0x99, 0x01, + 0x60, 0x08, 0xe0, 0x41, 0x48, 0x25, 0x68, 0x00, + 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, 0x68, 0x00, + 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x30, + 0xf0, 0x0a, 0xf9, 0x4e, 0x28, 0x00, 0xd1, 0x05, + 0x20, 0x92, 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x05, 0xe7, 0x91, 0x49, 0x20, 0x20, 0x91, + 0xf0, 0x18, 0xfe, 0x52, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0xf0, 0x0a, 0xf9, 0x98, 0x20, 0x92, + 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, + 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, 0x68, 0x01, + 0x1c, 0x28, 0xf0, 0x0a, 0xf9, 0x49, 0x90, 0x00, + 0x69, 0x68, 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, + 0x20, 0x91, 0xf0, 0x18, 0xfe, 0x39, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, 0x68, 0x00, + 0x90, 0x01, 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, + 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, 0x60, 0x08, + 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, + 0x20, 0x92, 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x03, 0xe7, 0x5d, 0xb0, 0x03, 0xe7, 0x5b, + 0xff, 0xff, 0xbf, 0xff, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0x1c, 0x01, 0x20, 0x0d, + 0x06, 0xc0, 0x60, 0x41, 0x48, 0x02, 0x63, 0x81, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, + 0x68, 0x00, 0x0d, 0x00, 0x20, 0x0d, 0x06, 0xc0, + 0x68, 0x40, 0x02, 0x00, 0x0a, 0x00, 0x47, 0x70, + 0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, 0x68, 0xd0, + 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x03, 0x1c, 0x0a, + 0x1c, 0x19, 0x69, 0x08, 0x28, 0x13, 0xd1, 0x01, + 0x20, 0x75, 0x47, 0x70, 0x69, 0x08, 0x28, 0x0b, + 0xdb, 0x0b, 0x69, 0x08, 0x28, 0x12, 0xdc, 0x08, + 0x6d, 0x08, 0x60, 0x10, 0x6d, 0x88, 0x60, 0x90, + 0x6d, 0x48, 0x60, 0x50, 0x6d, 0xc8, 0x60, 0xd0, + 0xe0, 0x07, 0x6a, 0x88, 0x60, 0x10, 0x6b, 0x08, + 0x60, 0x90, 0x6a, 0xc8, 0x60, 0x50, 0x6b, 0x48, + 0x60, 0xd0, 0x20, 0x00, 0xe7, 0xe5, 0xe7, 0xe4, + 0x1c, 0x03, 0x1c, 0x0a, 0x68, 0x10, 0x60, 0x18, + 0x68, 0x90, 0x60, 0x98, 0x68, 0x50, 0x60, 0x58, + 0x68, 0xd0, 0x60, 0xd8, 0x47, 0x70, 0xe7, 0xfd, + 0x1c, 0x01, 0x1c, 0x0a, 0x69, 0x50, 0x05, 0x80, + 0x0f, 0x80, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, + 0x1c, 0x0a, 0x69, 0x50, 0x12, 0x80, 0x07, 0x00, + 0x0f, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x80, + 0x1c, 0x01, 0x1c, 0x0f, 0x22, 0x01, 0x69, 0x78, + 0x23, 0x20, 0x40, 0x18, 0xd1, 0x00, 0x22, 0x00, + 0x1c, 0x10, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, + 0x1c, 0x01, 0x1c, 0x0b, 0x69, 0x18, 0x28, 0x13, + 0xd1, 0x01, 0x20, 0x75, 0x47, 0x70, 0x69, 0x58, + 0x06, 0x00, 0x0f, 0x82, 0x69, 0x58, 0x04, 0x40, + 0x0f, 0xc0, 0x00, 0x80, 0x43, 0x02, 0x1c, 0x10, + 0xe7, 0xf4, 0xe7, 0xf3, 0x1c, 0x01, 0x20, 0x0d, + 0x06, 0xc0, 0x61, 0x41, 0x20, 0x00, 0x47, 0x70, + 0xe7, 0xfd, 0x20, 0x0d, 0x06, 0xc0, 0x69, 0x40, + 0x1c, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, + 0x1c, 0x01, 0x22, 0x00, 0x29, 0x01, 0xd1, 0x00, + 0x22, 0x01, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, + 0x1c, 0x03, 0x2b, 0x02, 0xd1, 0x01, 0x29, 0x00, + 0xd1, 0x02, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0xc2, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x21, 0x01, + 0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, 0x1c, 0x02, + 0x2a, 0x00, 0xd1, 0x00, 0x21, 0x00, 0x1c, 0x08, + 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, + 0x69, 0x10, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x90, + 0x1c, 0x07, 0x1c, 0x0a, 0x1c, 0x39, 0x69, 0x08, + 0x28, 0x13, 0xd0, 0x05, 0x69, 0x08, 0x28, 0x0b, + 0xdb, 0x05, 0x69, 0x08, 0x28, 0x12, 0xdc, 0x02, + 0x20, 0x86, 0xbc, 0x90, 0x47, 0x70, 0x6b, 0x8c, + 0x69, 0x48, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, + 0x08, 0x64, 0x69, 0x08, 0x00, 0x80, 0x4b, 0x03, + 0x58, 0x18, 0x43, 0x60, 0x60, 0x10, 0x20, 0x00, + 0xe7, 0xef, 0xe7, 0xee, 0x2e, 0x03, 0xa8, 0xc8, + 0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x9c, 0x02, + 0x69, 0x20, 0x28, 0x13, 0xd0, 0x05, 0x69, 0x20, + 0x28, 0x0b, 0xdb, 0x08, 0x69, 0x20, 0x28, 0x12, + 0xdc, 0x05, 0x20, 0x86, 0xb0, 0x01, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xe5, + 0x68, 0x38, 0x64, 0x20, 0x68, 0x7e, 0x64, 0x66, + 0x08, 0xb6, 0x61, 0xa6, 0x48, 0x3f, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, + 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, + 0xb0, 0x01, 0xe7, 0xe0, 0x49, 0x36, 0x20, 0x91, + 0xf0, 0x18, 0xfd, 0x16, 0x28, 0x92, 0xd0, 0x03, + 0x20, 0x01, 0xf0, 0x09, 0xf8, 0xc3, 0xe7, 0xf5, + 0x00, 0xa8, 0x49, 0x32, 0x58, 0x08, 0x99, 0x02, + 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x2e, + 0x60, 0x08, 0x20, 0x86, 0xb0, 0x01, 0xe7, 0xca, + 0x48, 0x2a, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x06, + 0x01, 0x28, 0x4b, 0x2b, 0x18, 0xc0, 0x90, 0x00, + 0x98, 0x00, 0x60, 0x06, 0xe0, 0x41, 0x48, 0x25, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, + 0x1c, 0x28, 0xf0, 0x09, 0xff, 0xdd, 0x28, 0x00, + 0xd1, 0x05, 0x20, 0x92, 0x49, 0x1e, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x03, 0xe7, 0xab, 0x49, 0x20, + 0x20, 0x91, 0xf0, 0x18, 0xfc, 0xe1, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xf8, 0x27, + 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, + 0x49, 0x1a, 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, + 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x09, 0xff, 0xd8, + 0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x61, 0x08, + 0x49, 0x13, 0x20, 0x91, 0xf0, 0x18, 0xfc, 0xc8, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, + 0x68, 0x00, 0x90, 0x01, 0x48, 0x10, 0x68, 0x00, + 0x49, 0x0e, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 0x60, 0x08, + 0xb0, 0x02, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x01, 0xe7, 0x77, 0xb0, 0x01, + 0xe7, 0x75, 0x00, 0x00, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x68, 0x00, 0x0c, 0x04, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0xb4, 0x80, 0x1c, 0x01, + 0x06, 0x0b, 0x0e, 0x1b, 0x22, 0x01, 0x2a, 0x19, + 0xd3, 0x02, 0xe0, 0x0f, 0x32, 0x01, 0xe7, 0xfa, + 0x00, 0x90, 0x4f, 0x08, 0x58, 0x38, 0x68, 0x80, + 0x02, 0x00, 0x0e, 0x00, 0x42, 0x98, 0xd1, 0x04, + 0x00, 0x90, 0x4f, 0x04, 0x58, 0x38, 0xbc, 0x80, + 0x47, 0x70, 0xe7, 0xef, 0x20, 0x00, 0xe7, 0xfa, + 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xc4, + 0xb4, 0x90, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x38, + 0x16, 0x01, 0x48, 0x20, 0x60, 0x02, 0x48, 0x20, + 0x68, 0x80, 0x23, 0x33, 0x06, 0x5b, 0x65, 0xd8, + 0x48, 0x1d, 0x68, 0xc0, 0x23, 0x33, 0x06, 0x5b, + 0x66, 0x18, 0x48, 0x1c, 0x4b, 0x1a, 0x60, 0x98, + 0x48, 0x1b, 0x4b, 0x19, 0x60, 0xd8, 0x20, 0x01, + 0x23, 0x33, 0x06, 0x5b, 0x66, 0xd8, 0x48, 0x19, + 0x68, 0x04, 0x23, 0x01, 0x04, 0xdb, 0x43, 0x23, + 0x60, 0x03, 0x48, 0x16, 0x68, 0x04, 0x23, 0x01, + 0x04, 0xdb, 0x43, 0x9c, 0x1c, 0x23, 0x60, 0x03, + 0x29, 0x00, 0xd1, 0x10, 0x20, 0xff, 0x30, 0x14, + 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 0x48, 0x10, + 0x68, 0x04, 0x23, 0xff, 0x33, 0x01, 0x43, 0x9c, + 0x1c, 0x23, 0x60, 0x03, 0x48, 0x0d, 0x23, 0x1b, + 0x06, 0x9b, 0x64, 0x18, 0xe0, 0x08, 0x20, 0xff, + 0x30, 0x14, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, + 0x48, 0x02, 0x68, 0x00, 0x4b, 0x08, 0x60, 0x18, + 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x9b, 0xbc, + 0x2e, 0x08, 0xb9, 0x88, 0xcc, 0x1f, 0xe0, 0x00, + 0xcc, 0x1f, 0xfe, 0x00, 0x6c, 0x00, 0x00, 0x40, + 0x6c, 0x00, 0x00, 0x20, 0x00, 0x00, 0x82, 0x18, + 0x6c, 0x00, 0x00, 0x80, 0xb4, 0xf0, 0x1c, 0x01, + 0xb0, 0x82, 0x23, 0x1b, 0x06, 0x9b, 0x6a, 0x1b, + 0x1c, 0x18, 0x27, 0x00, 0x22, 0x00, 0x08, 0x40, + 0x00, 0x40, 0x4b, 0xaf, 0x68, 0x1c, 0x08, 0x64, + 0x00, 0x64, 0x60, 0x1c, 0x4b, 0xad, 0x68, 0x1b, + 0x1c, 0x1d, 0x23, 0x1b, 0x06, 0x9b, 0x6c, 0x1b, + 0x93, 0x01, 0x23, 0xff, 0x33, 0x01, 0x40, 0x03, + 0xd0, 0x00, 0x22, 0xff, 0x23, 0x01, 0x04, 0x9b, + 0x40, 0x03, 0xd0, 0x1b, 0x4c, 0xa4, 0x68, 0x26, + 0x23, 0x01, 0x04, 0x9b, 0x43, 0x9e, 0x1c, 0x33, + 0x60, 0x23, 0x4c, 0xa1, 0x68, 0x26, 0x23, 0x01, + 0x43, 0x33, 0x60, 0x23, 0x23, 0x00, 0x93, 0x00, + 0x9b, 0x00, 0x2b, 0x0a, 0xdb, 0x04, 0xe0, 0x04, + 0x9b, 0x00, 0x33, 0x01, 0x93, 0x00, 0xe7, 0xf7, + 0xe7, 0xfa, 0x4b, 0x99, 0x68, 0x1c, 0x08, 0x64, + 0x00, 0x64, 0x60, 0x1c, 0x23, 0x01, 0x02, 0x9b, + 0x40, 0x0b, 0xd0, 0x29, 0x23, 0x01, 0x02, 0xdb, + 0x40, 0x0b, 0xd0, 0x01, 0x4b, 0x94, 0x40, 0x18, + 0x23, 0x01, 0x03, 0x1b, 0x40, 0x0b, 0xd0, 0x02, + 0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, 0x4b, 0x91, + 0x40, 0x18, 0x02, 0x4c, 0x23, 0x7f, 0x02, 0x5b, + 0x40, 0x23, 0x43, 0x18, 0x23, 0x40, 0x40, 0x0b, + 0xd0, 0x03, 0x23, 0x01, 0x04, 0x5b, 0x43, 0x18, + 0xe0, 0x0a, 0x4b, 0x8b, 0x40, 0x18, 0x23, 0x20, + 0x40, 0x0b, 0xd0, 0x03, 0x23, 0x01, 0x04, 0x1b, + 0x43, 0x18, 0xe0, 0x01, 0x4b, 0x87, 0x40, 0x18, + 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 0xe0, 0xfc, + 0x23, 0x04, 0x40, 0x0b, 0xd0, 0x0f, 0x4c, 0x7e, + 0x68, 0x26, 0x23, 0x01, 0x43, 0x33, 0x60, 0x23, + 0x4b, 0x81, 0x68, 0x9b, 0x24, 0x33, 0x06, 0x64, + 0x65, 0xe3, 0x4b, 0x7f, 0x68, 0xdb, 0x24, 0x33, + 0x06, 0x64, 0x66, 0x23, 0xe0, 0xe9, 0x23, 0x01, + 0x03, 0x5b, 0x40, 0x0b, 0xd0, 0x13, 0x4b, 0x7a, + 0x68, 0x9b, 0x24, 0x33, 0x06, 0x64, 0x65, 0xe3, + 0x4b, 0x77, 0x68, 0xdb, 0x24, 0x33, 0x06, 0x64, + 0x66, 0x23, 0x23, 0x01, 0x24, 0x33, 0x06, 0x64, + 0x66, 0xe3, 0x4c, 0x6d, 0x68, 0x26, 0x23, 0x01, + 0x43, 0x33, 0x60, 0x23, 0xe0, 0xd1, 0x07, 0xcb, + 0x0f, 0xdb, 0xd0, 0x02, 0x23, 0x02, 0x43, 0x18, + 0xe0, 0x05, 0x23, 0x02, 0x40, 0x0b, 0xd0, 0x02, + 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0x23, 0x07, + 0x01, 0xdb, 0x40, 0x0b, 0xd0, 0x0f, 0x23, 0x0c, + 0x43, 0xdb, 0x40, 0x18, 0x23, 0xff, 0x33, 0x01, + 0x40, 0x0b, 0xd0, 0x02, 0x23, 0x04, 0x43, 0x18, + 0xe0, 0x05, 0x23, 0x01, 0x02, 0x5b, 0x40, 0x0b, + 0xd0, 0x01, 0x23, 0x08, 0x43, 0x18, 0x23, 0x01, + 0x04, 0x1b, 0x40, 0x0b, 0xd0, 0x08, 0x23, 0x01, + 0x04, 0x9b, 0x43, 0x98, 0x1c, 0x04, 0x20, 0x01, + 0x04, 0xc0, 0x43, 0x20, 0x23, 0x01, 0x43, 0x18, + 0x23, 0x78, 0x40, 0x0b, 0xd0, 0x73, 0x23, 0x30, + 0x40, 0x03, 0xd0, 0x06, 0x2b, 0x10, 0xd0, 0x04, + 0x2b, 0x20, 0xd0, 0x42, 0x2b, 0x30, 0xd0, 0x40, + 0xe0, 0x81, 0x23, 0x10, 0x40, 0x0b, 0xd1, 0x02, + 0x23, 0x08, 0x40, 0x0b, 0xd0, 0x08, 0x23, 0x30, + 0x43, 0xdb, 0x40, 0x18, 0x23, 0x10, 0x40, 0x0b, + 0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0xe0, 0x2f, + 0x23, 0x30, 0x43, 0xdb, 0x40, 0x18, 0x23, 0x20, + 0x40, 0x0b, 0xd0, 0x02, 0x23, 0x20, 0x43, 0x18, + 0xe0, 0x01, 0x23, 0x30, 0x43, 0x18, 0x23, 0x01, + 0x43, 0x18, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, + 0x27, 0xff, 0x2a, 0x00, 0xd0, 0x04, 0x4b, 0x43, + 0x68, 0x1b, 0x4c, 0x43, 0x60, 0x23, 0xe0, 0x17, + 0x07, 0xab, 0x0f, 0x9b, 0xd0, 0x09, 0x2b, 0x01, + 0xd0, 0x02, 0x2b, 0x02, 0xd0, 0x0a, 0xe0, 0x0e, + 0x4b, 0x3e, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, + 0xe0, 0x0a, 0x4b, 0x3d, 0x24, 0x1b, 0x06, 0xa4, + 0x64, 0x23, 0xe0, 0x05, 0x4b, 0x3b, 0x24, 0x1b, + 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x00, 0xe7, 0xff, + 0xe0, 0x42, 0x23, 0x40, 0x40, 0x0b, 0xd1, 0x02, + 0x23, 0x20, 0x40, 0x0b, 0xd0, 0x0b, 0x23, 0x30, + 0x43, 0xdb, 0x40, 0x18, 0x23, 0x20, 0x40, 0x0b, + 0xd0, 0x02, 0x23, 0x20, 0x43, 0x18, 0xe0, 0x01, + 0x23, 0x30, 0x43, 0x18, 0xe0, 0x2e, 0x23, 0x30, + 0x43, 0xdb, 0x40, 0x18, 0x23, 0x10, 0x40, 0x0b, + 0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0x23, 0x01, + 0x43, 0x18, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, + 0x27, 0xff, 0x2a, 0x00, 0xd0, 0x04, 0x4b, 0x23, + 0x68, 0x1b, 0x4c, 0x23, 0x60, 0x23, 0xe0, 0x19, + 0x07, 0xab, 0x0f, 0x9b, 0xe0, 0x00, 0xe0, 0x17, + 0xd0, 0x09, 0x2b, 0x01, 0xd0, 0x02, 0x2b, 0x02, + 0xd0, 0x0a, 0xe0, 0x0e, 0x4b, 0x20, 0x24, 0x1b, + 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x0a, 0x4b, 0x1f, + 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x05, + 0x4b, 0x1d, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, + 0xe0, 0x00, 0xe7, 0xff, 0xe0, 0x00, 0xe7, 0xff, + 0x2f, 0x00, 0xd1, 0x12, 0x23, 0x1b, 0x06, 0x9b, + 0x62, 0x18, 0x23, 0x00, 0x93, 0x00, 0x9b, 0x00, + 0x2b, 0x0a, 0xdb, 0x04, 0xe0, 0x04, 0x9b, 0x00, + 0x33, 0x01, 0x93, 0x00, 0xe7, 0xf7, 0xe7, 0xfa, + 0x4b, 0x03, 0x68, 0x1c, 0x08, 0x64, 0x00, 0x64, + 0x60, 0x1c, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x6c, 0x00, 0x00, 0x20, 0x6c, 0x00, 0x68, 0x00, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x01, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0x2e, 0x08, 0xb9, 0x88, 0x2e, 0x08, 0x9b, 0xbc, + 0x6c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x98, 0x60, + 0x00, 0x01, 0x58, 0x60, 0x00, 0x02, 0x54, 0x28, + 0x00, 0x00, 0x82, 0x18, 0x00, 0x01, 0x42, 0x18, + 0x00, 0x02, 0x42, 0x18, 0xb5, 0xf3, 0x1c, 0x0f, + 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x00, 0x98, 0x00, 0x28, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x33, 0x06, 0x40, + 0x6e, 0x00, 0x21, 0x33, 0x06, 0x49, 0x6d, 0xc9, + 0x1a, 0x46, 0x48, 0x12, 0x6c, 0x80, 0x1c, 0x04, + 0x48, 0x10, 0x6c, 0xc0, 0x1c, 0x05, 0x42, 0xac, + 0xd9, 0x09, 0x1b, 0x60, 0x21, 0x64, 0x43, 0x41, + 0x1c, 0x30, 0xf0, 0x09, 0xff, 0xcb, 0x21, 0x64, + 0x1a, 0x08, 0x60, 0x38, 0xe0, 0x06, 0x1b, 0x28, + 0x21, 0x64, 0x43, 0x41, 0x1c, 0x30, 0xf0, 0x09, + 0xff, 0xc1, 0x60, 0x38, 0x42, 0xac, 0xd1, 0x03, + 0x20, 0x31, 0xb0, 0x01, 0xe7, 0xd6, 0xe0, 0x02, + 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xd2, 0xb0, 0x01, + 0xe7, 0xd0, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, + 0xb5, 0xff, 0x1c, 0x14, 0x1c, 0x1f, 0xb0, 0x82, + 0x98, 0x02, 0x06, 0x01, 0x0e, 0x09, 0x91, 0x00, + 0x98, 0x0b, 0x06, 0x03, 0x16, 0x1b, 0x93, 0x01, + 0xb0, 0x84, 0x99, 0x04, 0x29, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x9b, 0x05, 0x2b, 0x1f, + 0xdd, 0x02, 0x20, 0xaf, 0xb0, 0x06, 0xe7, 0xf5, + 0x98, 0x07, 0x90, 0x01, 0x2f, 0x00, 0xd0, 0x47, + 0xb0, 0x81, 0x98, 0x08, 0x22, 0x00, 0x92, 0x00, + 0x22, 0x1b, 0x06, 0x92, 0x6a, 0x12, 0x23, 0x01, + 0x05, 0x1b, 0x40, 0x1a, 0xd0, 0x01, 0x22, 0xff, + 0x92, 0x00, 0x25, 0x00, 0x08, 0x62, 0x42, 0xaa, + 0xd8, 0x02, 0xe0, 0x34, 0x35, 0x01, 0xe7, 0xf9, + 0x9a, 0x00, 0x2a, 0x00, 0xd0, 0x1e, 0x88, 0x02, + 0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, 0x12, 0x12, + 0x88, 0x03, 0x02, 0x1b, 0x43, 0x1a, 0x04, 0x11, + 0x0c, 0x09, 0x2f, 0x00, 0xda, 0x05, 0x42, 0x7a, + 0x41, 0x11, 0x1c, 0x0b, 0x04, 0x19, 0x0c, 0x09, + 0xe0, 0x03, 0x40, 0xb9, 0x1c, 0x0a, 0x04, 0x11, + 0x0c, 0x09, 0x22, 0xff, 0x02, 0x12, 0x40, 0x0a, + 0x12, 0x12, 0x02, 0x0b, 0x43, 0x13, 0x80, 0x03, + 0x30, 0x02, 0xe0, 0x0f, 0x2f, 0x00, 0xda, 0x07, + 0x88, 0x02, 0x42, 0x7e, 0x41, 0x32, 0x04, 0x12, + 0x0c, 0x12, 0x80, 0x02, 0x30, 0x02, 0xe0, 0x05, + 0x88, 0x02, 0x40, 0xba, 0x04, 0x12, 0x0c, 0x12, + 0x80, 0x02, 0x30, 0x02, 0xe7, 0xca, 0xb0, 0x01, + 0x49, 0x23, 0x91, 0x03, 0x20, 0x01, 0x06, 0x00, + 0x99, 0x03, 0x60, 0x08, 0x48, 0x21, 0x6c, 0x80, + 0x49, 0x20, 0x6c, 0xc9, 0x1a, 0x40, 0x90, 0x00, + 0x98, 0x00, 0x28, 0x00, 0xdc, 0x09, 0x20, 0x33, + 0x06, 0x40, 0x6e, 0x00, 0x21, 0x33, 0x06, 0x49, + 0x6d, 0xc9, 0x1a, 0x40, 0x99, 0x00, 0x18, 0x40, + 0x90, 0x00, 0x98, 0x00, 0x23, 0x3b, 0x01, 0xdb, + 0x42, 0x98, 0xda, 0x02, 0x20, 0x06, 0xf0, 0x08, + 0xfd, 0x8d, 0x98, 0x00, 0x23, 0x3b, 0x01, 0xdb, + 0x42, 0x98, 0xdb, 0xdf, 0x98, 0x00, 0x42, 0x84, + 0xd9, 0x02, 0x98, 0x00, 0x90, 0x02, 0xe0, 0x00, + 0x94, 0x02, 0x22, 0x04, 0x99, 0x03, 0xb4, 0x06, + 0x9b, 0x07, 0x9a, 0x04, 0x99, 0x06, 0x98, 0x03, + 0xf0, 0x04, 0xfb, 0x8c, 0xb0, 0x02, 0x98, 0x02, + 0x1a, 0x24, 0x98, 0x01, 0x99, 0x02, 0x18, 0x40, + 0x90, 0x01, 0x20, 0x00, 0x90, 0x00, 0x2c, 0x00, + 0xd1, 0xc4, 0x20, 0x00, 0xb0, 0x06, 0xe7, 0x65, + 0xb0, 0x04, 0xb0, 0x02, 0xe7, 0x62, 0x00, 0x00, + 0x9e, 0x00, 0x08, 0x00, 0x66, 0x00, 0x00, 0x80, + 0x20, 0x1b, 0x06, 0x80, 0x6a, 0x00, 0x07, 0xc0, + 0x0f, 0xc0, 0x4a, 0x03, 0x68, 0x12, 0x1c, 0x01, + 0x43, 0x11, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, + 0x6c, 0x00, 0x08, 0x00, 0xb4, 0x90, 0x1c, 0x01, + 0x20, 0x1b, 0x06, 0x80, 0x6a, 0x00, 0x1c, 0x04, + 0x48, 0x1b, 0x68, 0x00, 0x1c, 0x07, 0x20, 0x30, + 0x40, 0x20, 0xd0, 0x06, 0x28, 0x10, 0xd0, 0x06, + 0x28, 0x20, 0xd0, 0x06, 0x28, 0x30, 0xd0, 0x06, + 0xe0, 0x07, 0x22, 0x01, 0xe0, 0x08, 0x22, 0x02, + 0xe0, 0x06, 0x22, 0x04, 0xe0, 0x04, 0x22, 0x08, + 0xe0, 0x02, 0x20, 0x30, 0xbc, 0x90, 0x47, 0x70, + 0x20, 0x03, 0x07, 0x40, 0x40, 0x38, 0x0f, 0x40, + 0xd0, 0x04, 0x28, 0x01, 0xd0, 0x05, 0x28, 0x02, + 0xd0, 0x06, 0xe0, 0x08, 0x23, 0x10, 0x43, 0x1a, + 0xe0, 0x07, 0x23, 0x20, 0x43, 0x1a, 0xe0, 0x04, + 0x23, 0x40, 0x43, 0x1a, 0xe0, 0x01, 0x20, 0x30, + 0xe7, 0xe8, 0x20, 0x01, 0x05, 0xc0, 0x40, 0x38, + 0xd1, 0x01, 0x23, 0x80, 0x43, 0x1a, 0x60, 0x0a, + 0x20, 0x00, 0xe7, 0xdf, 0xe7, 0xde, 0x00, 0x00, + 0x6c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0x48, 0x01, + 0x60, 0x01, 0x47, 0x70, 0x6c, 0x00, 0x00, 0x80, + 0x1c, 0x01, 0x29, 0x1f, 0xdd, 0x01, 0x20, 0xaf, + 0x47, 0x70, 0x20, 0x80, 0x6c, 0x00, 0x60, 0x01, + 0x20, 0x00, 0xe7, 0xf9, 0xe7, 0xf8, 0xb5, 0xf3, + 0x1c, 0x0a, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x03, + 0x0e, 0x1b, 0x93, 0x00, 0xb0, 0x81, 0x20, 0x1b, + 0x06, 0x80, 0x6a, 0x00, 0x1c, 0x01, 0x25, 0x00, + 0x20, 0x00, 0x90, 0x00, 0x20, 0x1b, 0x06, 0x80, + 0x6c, 0x00, 0x1c, 0x04, 0x27, 0x00, 0x9b, 0x01, + 0x2b, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d, + 0x06, 0x9b, 0x1a, 0xc0, 0x9b, 0x01, 0x00, 0xdb, + 0x4e, 0x5f, 0x68, 0x36, 0x19, 0x9b, 0x60, 0x58, + 0x20, 0xff, 0x30, 0x01, 0x40, 0x08, 0xd0, 0x01, + 0x20, 0xff, 0x90, 0x00, 0x23, 0x01, 0x04, 0xdb, + 0x43, 0x99, 0x1c, 0x08, 0x21, 0x01, 0x04, 0x89, + 0x43, 0x01, 0x20, 0x01, 0x03, 0x00, 0x40, 0x10, + 0xd0, 0x05, 0x06, 0x90, 0x0e, 0x80, 0xd0, 0x02, + 0x23, 0x01, 0x05, 0x1b, 0x43, 0x19, 0x23, 0x30, + 0x43, 0xdb, 0x40, 0x19, 0x05, 0x10, 0x0d, 0x00, + 0x28, 0x40, 0xd0, 0x48, 0xdc, 0x0e, 0x28, 0x08, + 0xd0, 0x32, 0xdc, 0x06, 0x28, 0x01, 0xd0, 0x1e, + 0x28, 0x02, 0xd0, 0x21, 0x28, 0x04, 0xd0, 0x26, + 0xe0, 0x67, 0x28, 0x10, 0xd0, 0x2f, 0x28, 0x20, + 0xd0, 0x32, 0xe0, 0x62, 0x23, 0x01, 0x02, 0x5b, + 0x42, 0x98, 0xd0, 0x49, 0xdc, 0x06, 0x28, 0x80, + 0xd0, 0x38, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, + 0xd0, 0x3b, 0xe0, 0x56, 0x23, 0x01, 0x02, 0x9b, + 0x42, 0x98, 0xd0, 0x44, 0x23, 0x01, 0x02, 0xdb, + 0x42, 0x98, 0xd0, 0x47, 0xe0, 0x4d, 0x4b, 0x3d, + 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x3b, 0xe0, 0x49, + 0x23, 0x10, 0x43, 0x19, 0x4b, 0x39, 0x42, 0x9c, + 0xd0, 0x00, 0x4f, 0x38, 0xe0, 0x42, 0x4b, 0x38, + 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x36, 0xe0, 0x3d, + 0x23, 0x10, 0x43, 0x19, 0x4b, 0x34, 0x42, 0x9c, + 0xd0, 0x00, 0x4f, 0x33, 0xe0, 0x36, 0x4b, 0x33, + 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x31, 0xe0, 0x31, + 0x23, 0x10, 0x43, 0x19, 0x4b, 0x2f, 0x42, 0x9c, + 0xd0, 0x00, 0x4f, 0x2e, 0xe0, 0x2a, 0x23, 0x20, + 0x43, 0x19, 0x4b, 0x2d, 0x42, 0x9c, 0xd0, 0x00, + 0x4f, 0x2b, 0xe0, 0x23, 0x23, 0x30, 0x43, 0x19, + 0x4b, 0x29, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x28, + 0xe0, 0x1c, 0x23, 0x20, 0x43, 0x19, 0x4b, 0x27, + 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x25, 0xe0, 0x15, + 0x23, 0x30, 0x43, 0x19, 0x4b, 0x23, 0x42, 0x9c, + 0xd0, 0x00, 0x4f, 0x22, 0xe0, 0x0e, 0x23, 0x20, + 0x43, 0x19, 0x4b, 0x21, 0x42, 0x9c, 0xd0, 0x00, + 0x4f, 0x1f, 0xe0, 0x07, 0x23, 0x30, 0x43, 0x19, + 0x4b, 0x1d, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x1c, + 0xe0, 0x00, 0xe7, 0xff, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x0a, 0x23, 0x01, 0x43, 0x19, 0x20, 0x1b, + 0x06, 0x80, 0x62, 0x01, 0x48, 0x17, 0x68, 0x00, + 0x4b, 0x17, 0x60, 0x18, 0x25, 0xff, 0xe0, 0x0e, + 0x23, 0x01, 0x43, 0x19, 0x2f, 0x00, 0xd0, 0x07, + 0x20, 0x1b, 0x06, 0x80, 0x62, 0x01, 0x20, 0x1b, + 0x06, 0x80, 0x64, 0x07, 0x25, 0xff, 0xe0, 0x02, + 0x20, 0x1b, 0x06, 0x80, 0x62, 0x01, 0x2d, 0x00, + 0xd1, 0x04, 0x48, 0x0e, 0x68, 0x03, 0x08, 0x5b, + 0x00, 0x5b, 0x60, 0x03, 0x20, 0x00, 0xb0, 0x02, + 0xe7, 0x36, 0xb0, 0x01, 0xb0, 0x01, 0xe7, 0x33, + 0x2e, 0x08, 0x9b, 0x40, 0x00, 0x00, 0x82, 0x18, + 0x00, 0x01, 0x42, 0x18, 0x00, 0x02, 0x42, 0x18, + 0x00, 0x00, 0x98, 0x60, 0x00, 0x01, 0x58, 0x60, + 0x00, 0x02, 0x54, 0x28, 0x2e, 0x08, 0x9b, 0xbc, + 0x6c, 0x00, 0x00, 0x80, 0x6c, 0x00, 0x00, 0x20, + 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x82, 0x49, 0x2c, + 0x46, 0x68, 0x22, 0x08, 0xf0, 0x09, 0xfd, 0xca, + 0x20, 0x04, 0xf7, 0xff, 0xfc, 0x23, 0x48, 0x29, + 0x68, 0x80, 0x21, 0x33, 0x06, 0x49, 0x65, 0xc8, + 0x48, 0x26, 0x68, 0xc0, 0x21, 0x33, 0x06, 0x49, + 0x66, 0x08, 0x48, 0x25, 0x68, 0x01, 0x23, 0x02, + 0x43, 0x19, 0x60, 0x01, 0x20, 0x01, 0x21, 0x33, + 0x06, 0x49, 0x67, 0xc8, 0x48, 0x21, 0x68, 0x01, + 0x31, 0xff, 0x31, 0xff, 0x31, 0x02, 0x60, 0x01, + 0x1c, 0x78, 0x12, 0x00, 0xab, 0x01, 0x70, 0x18, + 0x1c, 0x78, 0xab, 0x01, 0x70, 0x58, 0x20, 0x33, + 0x06, 0x40, 0x6d, 0xc5, 0x4b, 0x1a, 0x43, 0x1d, + 0x26, 0x00, 0x2e, 0x10, 0xdb, 0x02, 0xe0, 0x18, + 0x36, 0x01, 0xe7, 0xfa, 0x24, 0x00, 0x2c, 0x07, + 0xd3, 0x02, 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xfa, + 0x46, 0x68, 0x5d, 0x01, 0x70, 0x29, 0x35, 0x01, + 0xe7, 0xf8, 0x24, 0x00, 0x42, 0xbc, 0xdb, 0x02, + 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x02, + 0x5d, 0x01, 0x70, 0x29, 0x35, 0x01, 0xe7, 0xf8, + 0xe7, 0xe6, 0x20, 0x33, 0x06, 0x40, 0x66, 0x05, + 0x48, 0x0a, 0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, + 0x43, 0x19, 0x60, 0x01, 0xb0, 0x02, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x03, 0xa8, 0x70, 0x2e, 0x08, 0xb9, 0x88, + 0x66, 0x00, 0x00, 0x70, 0x66, 0x00, 0x00, 0x5c, + 0xcc, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x20, + 0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x20, + 0x0e, 0x00, 0x06, 0x3d, 0x0e, 0x2d, 0x99, 0x02, + 0x06, 0x0a, 0x0e, 0x12, 0x21, 0x02, 0x40, 0x01, + 0xd0, 0x04, 0x21, 0xff, 0x4b, 0x2f, 0x68, 0x1b, + 0x72, 0x19, 0xe0, 0x0c, 0x49, 0x2d, 0x68, 0x09, + 0x7a, 0x09, 0x29, 0xff, 0xd1, 0x03, 0x21, 0x00, + 0x4b, 0x2a, 0x68, 0x1b, 0x60, 0x19, 0x21, 0x00, + 0x4b, 0x28, 0x68, 0x1b, 0x72, 0x19, 0x07, 0xc1, + 0x0f, 0xc9, 0xd0, 0x04, 0x21, 0xff, 0x4b, 0x25, + 0x68, 0x1b, 0x72, 0x59, 0xe0, 0x0c, 0x49, 0x23, + 0x68, 0x09, 0x7a, 0x49, 0x29, 0xff, 0xd1, 0x03, + 0x21, 0x00, 0x4b, 0x20, 0x68, 0x1b, 0x60, 0x59, + 0x21, 0x00, 0x4b, 0x1e, 0x68, 0x1b, 0x72, 0x59, + 0x2d, 0x01, 0xd1, 0x0f, 0x49, 0x1c, 0x68, 0x0e, + 0x23, 0x01, 0x05, 0x5b, 0x43, 0x9e, 0x1c, 0x33, + 0x60, 0x0b, 0x49, 0x1a, 0x68, 0x09, 0x78, 0x09, + 0x23, 0x02, 0x43, 0x19, 0x4b, 0x17, 0x68, 0x1b, + 0x70, 0x19, 0xe0, 0x0e, 0x49, 0x14, 0x68, 0x0e, + 0x23, 0x01, 0x05, 0x5b, 0x43, 0x33, 0x60, 0x0b, + 0x49, 0x12, 0x68, 0x09, 0x78, 0x09, 0x23, 0x02, + 0x43, 0xdb, 0x40, 0x19, 0x4b, 0x0f, 0x68, 0x1b, + 0x70, 0x19, 0x49, 0x0f, 0x62, 0x4a, 0x2a, 0x01, + 0xd1, 0x08, 0x49, 0x0c, 0x68, 0x09, 0x78, 0x09, + 0x23, 0x01, 0x43, 0x19, 0x4b, 0x09, 0x68, 0x1b, + 0x70, 0x19, 0xe0, 0x07, 0x49, 0x07, 0x68, 0x09, + 0x78, 0x09, 0x08, 0x49, 0x00, 0x49, 0x4b, 0x05, + 0x68, 0x1b, 0x70, 0x19, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x9b, 0xc0, + 0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x9b, 0xc4, + 0xcc, 0x00, 0x0f, 0x80, 0xb4, 0x80, 0x1c, 0x07, + 0x1c, 0x0a, 0x68, 0x38, 0x49, 0x23, 0x68, 0x09, + 0x60, 0xc8, 0x68, 0x78, 0x49, 0x21, 0x68, 0x09, + 0x61, 0x08, 0x68, 0xb8, 0x49, 0x1f, 0x68, 0x09, + 0x61, 0x48, 0x68, 0xf8, 0x49, 0x1d, 0x68, 0x09, + 0x61, 0x88, 0x7d, 0x38, 0x49, 0x1b, 0x68, 0x09, + 0x31, 0x20, 0x70, 0x08, 0x7d, 0x78, 0x49, 0x19, + 0x68, 0x09, 0x31, 0x20, 0x70, 0x48, 0x69, 0x38, + 0x49, 0x16, 0x68, 0x09, 0x61, 0xc8, 0x7d, 0xb8, + 0x49, 0x14, 0x68, 0x09, 0x31, 0x20, 0x70, 0x88, + 0x68, 0x10, 0x49, 0x12, 0x68, 0x09, 0x62, 0x48, + 0x68, 0x50, 0x49, 0x10, 0x68, 0x09, 0x62, 0x88, + 0x68, 0x90, 0x49, 0x0e, 0x68, 0x09, 0x62, 0xc8, + 0x68, 0xd0, 0x49, 0x0c, 0x68, 0x09, 0x63, 0x08, + 0x7d, 0x10, 0x49, 0x0a, 0x68, 0x09, 0x31, 0x20, + 0x76, 0x08, 0x7d, 0x50, 0x49, 0x07, 0x68, 0x09, + 0x31, 0x20, 0x76, 0x48, 0x69, 0x10, 0x49, 0x05, + 0x68, 0x09, 0x63, 0x48, 0x7d, 0x90, 0x49, 0x03, + 0x68, 0x09, 0x31, 0x20, 0x76, 0x88, 0xbc, 0x80, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xc0, + 0x1c, 0x02, 0x1c, 0x0b, 0x48, 0x03, 0x68, 0x00, + 0x60, 0x02, 0x48, 0x02, 0x68, 0x00, 0x60, 0x43, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xc0, + 0xb5, 0xf3, 0xb0, 0x88, 0x98, 0x08, 0x68, 0x04, + 0x20, 0x01, 0x90, 0x06, 0x20, 0x01, 0x90, 0x05, + 0x48, 0x8c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x19, + 0x48, 0x8a, 0x68, 0x00, 0x38, 0x01, 0x49, 0x89, + 0x60, 0x08, 0x48, 0x88, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x10, 0x48, 0x87, 0x78, 0x80, 0x90, 0x00, + 0x98, 0x00, 0x00, 0xc0, 0x49, 0x85, 0x68, 0x09, + 0x58, 0x08, 0x23, 0xff, 0x33, 0x01, 0x43, 0x98, + 0x1c, 0x01, 0x98, 0x00, 0x00, 0xc0, 0x4a, 0x81, + 0x68, 0x12, 0x50, 0x11, 0x20, 0x33, 0x06, 0x40, + 0x6e, 0x00, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc1, + 0x91, 0x02, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, + 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x90, 0x01, + 0x48, 0x79, 0x68, 0x00, 0x42, 0x84, 0xd1, 0x73, + 0x98, 0x01, 0x1d, 0xc7, 0x37, 0x01, 0x78, 0x38, + 0x18, 0x38, 0x1c, 0x47, 0x48, 0x75, 0x6c, 0xc0, + 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x42, 0xb8, + 0xd9, 0x19, 0x78, 0x38, 0x28, 0xff, 0xd1, 0x12, + 0x78, 0x78, 0x23, 0xf0, 0x40, 0x18, 0x28, 0xf0, + 0xd1, 0x0d, 0x78, 0xb8, 0x10, 0x80, 0x07, 0x80, + 0x0f, 0x80, 0x06, 0x00, 0x16, 0x00, 0x90, 0x06, + 0x78, 0x78, 0x10, 0xc0, 0x07, 0xc0, 0x09, 0xc0, + 0x16, 0x00, 0x90, 0x05, 0xe0, 0x03, 0x21, 0x01, + 0x70, 0x39, 0x18, 0x7f, 0xe7, 0xde, 0x21, 0x40, + 0x91, 0x03, 0x25, 0x20, 0x21, 0x14, 0x91, 0x07, + 0x98, 0x06, 0x28, 0x00, 0xd1, 0x02, 0x25, 0x23, + 0x21, 0x12, 0x91, 0x07, 0x98, 0x06, 0x28, 0x02, + 0xd1, 0x02, 0x25, 0x30, 0x21, 0x18, 0x91, 0x07, + 0x98, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x00, 0x6d, + 0x21, 0x70, 0x91, 0x03, 0x99, 0x03, 0x00, 0x48, + 0x99, 0x02, 0x1a, 0x08, 0x90, 0x04, 0x98, 0x04, + 0x99, 0x02, 0x42, 0x88, 0xd3, 0x05, 0xe0, 0x4e, + 0x98, 0x04, 0x99, 0x03, 0x18, 0x40, 0x90, 0x04, + 0xe7, 0xf5, 0x9f, 0x04, 0x21, 0x00, 0x70, 0x39, + 0x37, 0x01, 0x21, 0x00, 0x70, 0x39, 0x37, 0x01, + 0x21, 0x01, 0x70, 0x39, 0x18, 0x7f, 0x21, 0xc0, + 0x70, 0x39, 0x37, 0x01, 0x21, 0x00, 0x70, 0x39, + 0x37, 0x01, 0x21, 0x3a, 0x70, 0x39, 0x37, 0x01, + 0x21, 0x80, 0x70, 0x39, 0x37, 0x01, 0x21, 0x00, + 0x70, 0x39, 0x37, 0x01, 0x99, 0x03, 0x1f, 0xc8, + 0x38, 0x02, 0x1b, 0x41, 0x70, 0x39, 0x37, 0x01, + 0x26, 0x00, 0x99, 0x03, 0x1f, 0xc8, 0x38, 0x02, + 0x1b, 0x40, 0x42, 0xb0, 0xdc, 0x04, 0xe0, 0x00, + 0xe0, 0x34, 0xe0, 0x05, 0x36, 0x01, 0xe7, 0xf4, + 0x21, 0xff, 0x70, 0x39, 0x37, 0x01, 0xe7, 0xf9, + 0x21, 0xff, 0x70, 0x39, 0x37, 0x01, 0x98, 0x05, + 0x00, 0xc0, 0x21, 0xf7, 0x43, 0x01, 0x70, 0x39, + 0x37, 0x01, 0x99, 0x07, 0x70, 0x39, 0x37, 0x01, + 0x21, 0xc0, 0x70, 0x39, 0x37, 0x01, 0x26, 0x00, + 0x1f, 0x28, 0x42, 0xb0, 0xdc, 0x02, 0xe0, 0x05, + 0x36, 0x01, 0xe7, 0xf9, 0x21, 0x00, 0x70, 0x39, + 0x37, 0x01, 0xe7, 0xf9, 0xe7, 0xb0, 0x99, 0x03, + 0x00, 0x48, 0x99, 0x02, 0x1a, 0x08, 0x23, 0x0d, + 0x06, 0x9b, 0x18, 0xc0, 0x49, 0x29, 0x64, 0x88, + 0x99, 0x09, 0x20, 0x78, 0x40, 0x08, 0x23, 0x02, + 0x43, 0x18, 0xf7, 0xff, 0xfa, 0x17, 0x20, 0x01, + 0xf7, 0xff, 0xfa, 0x14, 0x48, 0x22, 0x68, 0x00, + 0x38, 0x02, 0x42, 0xa0, 0xd1, 0x09, 0x48, 0x22, + 0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, + 0x60, 0x01, 0x20, 0xff, 0x49, 0x1f, 0x68, 0x09, + 0x70, 0x08, 0x48, 0x1b, 0x68, 0x00, 0x38, 0x02, + 0x42, 0xa0, 0xd3, 0x0f, 0x48, 0x1c, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x48, 0x1a, 0x68, 0x00, + 0x23, 0x01, 0x06, 0x9b, 0x40, 0x18, 0xd0, 0x05, + 0x20, 0x32, 0x49, 0x13, 0x60, 0x08, 0x48, 0x12, + 0x68, 0x00, 0x1e, 0x84, 0x2c, 0x01, 0xd1, 0x02, + 0x20, 0x02, 0xf7, 0xff, 0xf9, 0xeb, 0x2c, 0xff, + 0xd1, 0x08, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, + 0x30, 0xbc, 0x49, 0x0c, 0x6c, 0xc9, 0x42, 0x88, + 0xd2, 0x00, 0x24, 0x18, 0x2c, 0x00, 0xd0, 0x02, + 0x2c, 0xff, 0xd0, 0x00, 0x3c, 0x01, 0x98, 0x08, + 0x60, 0x04, 0xb0, 0x08, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x9b, 0xb0, + 0x2e, 0x08, 0x9b, 0x9c, 0x2e, 0x08, 0x9b, 0x3c, + 0x2e, 0x08, 0x1f, 0x98, 0x66, 0x00, 0x00, 0x80, + 0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x9b, 0x98, + 0x6c, 0x00, 0x08, 0x00, 0xb5, 0xff, 0x1c, 0x04, + 0x1c, 0x0f, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, + 0x9b, 0x03, 0x06, 0x1e, 0x0e, 0x36, 0x2e, 0x20, + 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x1f, 0xdb, 0x01, + 0x20, 0xaf, 0xe7, 0xf7, 0x20, 0x01, 0x03, 0x40, + 0xf7, 0xff, 0xf9, 0xac, 0x20, 0x14, 0x49, 0x09, + 0x60, 0x08, 0x20, 0xff, 0x60, 0x20, 0x1c, 0x33, + 0x1c, 0x29, 0x1c, 0x38, 0x22, 0x02, 0xf7, 0xfc, + 0xfa, 0x4b, 0x48, 0x05, 0x68, 0x01, 0x23, 0x01, + 0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00, + 0xe7, 0xe0, 0xe7, 0xdf, 0x2e, 0x08, 0x1f, 0x98, + 0x6c, 0x00, 0x00, 0x20, 0xb4, 0x0f, 0xb5, 0xf0, + 0x1c, 0x07, 0xb0, 0x82, 0x20, 0x00, 0x49, 0x16, + 0x60, 0x08, 0x48, 0x16, 0x6f, 0x80, 0x23, 0x09, + 0x01, 0x9b, 0x42, 0x98, 0xd1, 0x02, 0x20, 0xe1, + 0x00, 0xc0, 0xe0, 0x00, 0x48, 0x12, 0x1c, 0x05, + 0x68, 0x38, 0x28, 0xff, 0xd1, 0x17, 0x98, 0x0d, + 0x90, 0x00, 0x98, 0x0c, 0x90, 0x01, 0x98, 0x01, + 0x99, 0x00, 0x1a, 0x46, 0x08, 0x68, 0x19, 0x81, + 0x1c, 0x28, 0xf0, 0x09, 0xfa, 0xeb, 0x1c, 0x04, + 0x34, 0x01, 0x0f, 0xf0, 0x07, 0xc0, 0xd0, 0x00, + 0x24, 0x04, 0x2c, 0x32, 0xd9, 0x00, 0x24, 0x04, + 0x1d, 0xe0, 0x30, 0x0d, 0x60, 0x38, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18, + 0x2e, 0x08, 0x9b, 0xb0, 0xcc, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0x05, 0xdd, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x81, 0x99, 0x02, 0x06, 0x09, 0x0e, 0x09, + 0x91, 0x00, 0xb0, 0x82, 0x99, 0x02, 0x29, 0x20, + 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x99, 0x02, + 0x00, 0x88, 0x49, 0x2f, 0x58, 0x08, 0x90, 0x01, + 0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x03, + 0xe7, 0xf1, 0x20, 0x00, 0x70, 0x78, 0x78, 0xb8, + 0x07, 0x00, 0x0f, 0x00, 0x90, 0x00, 0x98, 0x00, + 0x28, 0x04, 0xd1, 0x1f, 0x6a, 0xfe, 0x24, 0x00, + 0x2c, 0x08, 0xdb, 0x04, 0xe0, 0x18, 0x1c, 0x60, + 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x00, 0xa0, + 0x19, 0x80, 0x68, 0x40, 0x00, 0xa1, 0x19, 0x89, + 0x64, 0x48, 0x21, 0x00, 0x00, 0xa0, 0x19, 0x80, + 0x62, 0x41, 0x00, 0xa0, 0x19, 0x80, 0x6c, 0x40, + 0x28, 0x00, 0xd0, 0x04, 0x20, 0x80, 0x41, 0x20, + 0x88, 0x31, 0x43, 0x08, 0x80, 0x30, 0xe7, 0xe6, + 0x88, 0x30, 0x80, 0x70, 0x78, 0xb8, 0x23, 0x20, + 0x40, 0x18, 0xd0, 0x1f, 0x6b, 0x3d, 0x20, 0x00, + 0x60, 0x28, 0x20, 0x00, 0x60, 0x68, 0x20, 0x00, + 0x60, 0xa8, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04, + 0xe0, 0x0c, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, + 0xe7, 0xf8, 0x20, 0x00, 0x00, 0xa1, 0x19, 0x49, + 0x60, 0xc8, 0x20, 0x00, 0x00, 0xa1, 0x19, 0x49, + 0x63, 0x88, 0xe7, 0xf2, 0x20, 0x00, 0x62, 0xe8, + 0x20, 0x00, 0x63, 0x28, 0x20, 0x00, 0x63, 0x68, + 0x20, 0x00, 0x65, 0xa8, 0x99, 0x02, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x3e, 0xb0, 0x03, 0xe7, 0x9e, + 0xb0, 0x02, 0xb0, 0x01, 0xe7, 0x9b, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xc8, 0xb5, 0xf3, 0x1c, 0x07, + 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0xb0, 0x82, + 0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0xa0, 0x49, 0x12, 0x58, 0x08, 0x1c, 0x05, + 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x02, 0xe7, 0xf3, + 0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x84, + 0x1c, 0x06, 0xd0, 0x02, 0x1c, 0x30, 0xb0, 0x02, + 0xe7, 0xea, 0x78, 0x68, 0x21, 0x20, 0x40, 0x01, + 0x91, 0x00, 0x99, 0x00, 0x1c, 0x38, 0xf0, 0x00, + 0xff, 0x3f, 0x68, 0xe9, 0x91, 0x01, 0x29, 0x00, + 0xd0, 0x03, 0x99, 0x01, 0x1c, 0x38, 0xf0, 0x03, + 0xfe, 0x7a, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xd7, + 0xb0, 0x02, 0xe7, 0xd5, 0x2e, 0x08, 0x9b, 0xc8, + 0xb5, 0xf3, 0x1c, 0x02, 0x99, 0x01, 0x06, 0x0f, + 0x0e, 0x3f, 0xb0, 0x86, 0x00, 0xb8, 0x4b, 0xa1, + 0x68, 0x1b, 0x18, 0xc0, 0x90, 0x00, 0x2f, 0x20, + 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb8, + 0x4b, 0x9b, 0x58, 0x18, 0x90, 0x05, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x06, 0xe7, 0xf2, + 0x78, 0x90, 0x90, 0x01, 0x71, 0xd7, 0x78, 0xd1, + 0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd1, 0x73, + 0x29, 0x20, 0xdd, 0x02, 0x20, 0xb1, 0xb0, 0x06, + 0xe7, 0xe5, 0x48, 0x92, 0x68, 0x00, 0x23, 0x01, + 0x42, 0xd8, 0xd1, 0x02, 0x20, 0xb2, 0xb0, 0x06, + 0xe7, 0xdd, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x8d, + 0x68, 0x1b, 0x40, 0x18, 0xd0, 0x02, 0x20, 0xb1, + 0xb0, 0x06, 0xe7, 0xd4, 0x00, 0x88, 0x4b, 0x8a, + 0x50, 0x1a, 0x48, 0x8a, 0x54, 0x47, 0x01, 0x08, + 0x4b, 0x89, 0x18, 0xc5, 0x7f, 0x10, 0x06, 0x00, + 0x7f, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7f, 0x93, + 0x02, 0x1b, 0x43, 0x18, 0x7f, 0xd3, 0x43, 0x03, + 0xc5, 0x08, 0x1d, 0xd0, 0x30, 0x19, 0x78, 0x00, + 0x06, 0x00, 0x1d, 0xd3, 0x33, 0x19, 0x78, 0x5b, + 0x04, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, + 0x78, 0x9b, 0x02, 0x1b, 0x43, 0x18, 0x1d, 0xd3, + 0x33, 0x19, 0x78, 0xdb, 0x43, 0x03, 0xc5, 0x08, + 0x01, 0x08, 0x4b, 0x7a, 0x18, 0xc4, 0x7b, 0x10, + 0x06, 0x00, 0x7b, 0x53, 0x04, 0x1b, 0x43, 0x18, + 0x7b, 0x93, 0x02, 0x1b, 0x43, 0x18, 0x7b, 0xd3, + 0x43, 0x03, 0xc4, 0x08, 0x7c, 0x10, 0x06, 0x00, + 0x7c, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7c, 0x93, + 0x02, 0x1b, 0x43, 0x18, 0x7c, 0xd3, 0x43, 0x03, + 0xc4, 0x08, 0x98, 0x01, 0x07, 0xc0, 0x0f, 0xc0, + 0xd0, 0x20, 0x1d, 0xd0, 0x30, 0x19, 0x79, 0x00, + 0x06, 0x00, 0x1d, 0xd3, 0x33, 0x19, 0x79, 0x5b, + 0x04, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, + 0x79, 0x9b, 0x02, 0x1b, 0x43, 0x18, 0x1d, 0xd3, + 0x33, 0x19, 0x79, 0xdb, 0x43, 0x03, 0xc5, 0x08, + 0x7d, 0x10, 0x06, 0x00, 0x7d, 0x53, 0x04, 0x1b, + 0x43, 0x18, 0x7d, 0x93, 0x02, 0x1b, 0xe0, 0x00, + 0xe0, 0x42, 0x43, 0x18, 0x7d, 0xd3, 0x43, 0x03, + 0xc4, 0x08, 0xe0, 0x03, 0x23, 0x00, 0xc5, 0x08, + 0x23, 0x00, 0xc4, 0x08, 0x23, 0xff, 0xc5, 0x08, + 0x20, 0x19, 0x06, 0x80, 0x6b, 0x00, 0x23, 0x08, + 0x40, 0x18, 0xd0, 0x06, 0x88, 0x90, 0x04, 0x00, + 0x19, 0xc3, 0x93, 0x02, 0x9b, 0x02, 0xc4, 0x08, + 0xe0, 0x00, 0xc4, 0x80, 0x98, 0x01, 0x23, 0x08, + 0x40, 0x18, 0xd0, 0x17, 0x48, 0x50, 0x5d, 0xc0, + 0x30, 0x01, 0x4b, 0x4f, 0x55, 0xd8, 0x7a, 0x10, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x04, 0x20, 0x01, + 0x40, 0x88, 0x23, 0x19, 0x06, 0x9b, 0x61, 0x18, + 0x7a, 0x10, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x04, + 0x20, 0x01, 0x40, 0x88, 0x23, 0x19, 0x06, 0x9b, + 0x61, 0x58, 0xe0, 0x05, 0x4e, 0x45, 0x20, 0x01, + 0x40, 0x88, 0x68, 0x33, 0x43, 0x18, 0x60, 0x30, + 0x20, 0x01, 0x40, 0x88, 0x4b, 0x3b, 0x68, 0x1b, + 0x43, 0x18, 0x4b, 0x3a, 0x60, 0x18, 0xe0, 0x4f, + 0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x48, + 0x48, 0x3d, 0x88, 0x00, 0x4b, 0x3d, 0x42, 0x98, + 0xd1, 0x02, 0x20, 0xb2, 0xb0, 0x06, 0xe7, 0x26, + 0x00, 0x88, 0x4b, 0x3b, 0x58, 0x18, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x1e, + 0x29, 0x10, 0xdb, 0x02, 0x20, 0xb1, 0xb0, 0x06, + 0xe7, 0x19, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x32, + 0x88, 0x1b, 0x40, 0x18, 0xd0, 0x02, 0x20, 0xb1, + 0xb0, 0x06, 0xe7, 0x10, 0x98, 0x05, 0x78, 0x80, + 0x28, 0x02, 0xdb, 0x02, 0x20, 0xb1, 0xb0, 0x06, + 0xe7, 0x09, 0x00, 0x88, 0x4b, 0x2c, 0x50, 0x1a, + 0x48, 0x2c, 0x54, 0x47, 0x00, 0xf8, 0x1b, 0xc0, + 0x00, 0x80, 0x4b, 0x2b, 0x68, 0x1b, 0x18, 0xc0, + 0x90, 0x04, 0x98, 0x04, 0x7e, 0x00, 0x28, 0xff, + 0xd1, 0x02, 0x98, 0x04, 0x76, 0x01, 0xe0, 0x01, + 0x98, 0x04, 0x76, 0x41, 0x4e, 0x25, 0x96, 0x03, + 0x1d, 0xd3, 0x33, 0x05, 0x00, 0x88, 0x9e, 0x03, + 0x50, 0x33, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x1c, + 0x88, 0x1b, 0x43, 0x18, 0x4b, 0x1a, 0x80, 0x18, + 0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe6, 0xe2, + 0x78, 0x50, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x18, + 0x70, 0x50, 0x98, 0x05, 0x78, 0x80, 0x28, 0x00, + 0xd1, 0x09, 0x98, 0x00, 0x68, 0x00, 0x23, 0x01, + 0x03, 0x5b, 0x43, 0x18, 0x9b, 0x00, 0x60, 0x18, + 0x20, 0x02, 0x9b, 0x05, 0x70, 0xd8, 0x98, 0x05, + 0x78, 0x80, 0x30, 0x01, 0x9b, 0x05, 0x70, 0x98, + 0x20, 0x00, 0xb0, 0x06, 0xe6, 0xc7, 0xb0, 0x06, + 0xe6, 0xc5, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x38, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9c, 0x48, + 0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x9d, 0x10, + 0x64, 0x00, 0x10, 0x00, 0x64, 0x00, 0x08, 0x00, + 0x2e, 0x08, 0xb9, 0x60, 0x64, 0x00, 0x00, 0x18, + 0x2e, 0x08, 0x9c, 0x4c, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x9c, 0xd0, 0x2e, 0x08, 0x9d, 0x30, + 0x2e, 0x08, 0x9b, 0x30, 0x9e, 0x00, 0x04, 0xb8, + 0xb5, 0xf3, 0x1c, 0x02, 0x99, 0x01, 0x06, 0x0f, + 0x0e, 0x3f, 0xb0, 0x86, 0x00, 0xb8, 0x4b, 0x65, + 0x68, 0x1b, 0x18, 0xc0, 0x90, 0x01, 0x2f, 0x20, + 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb8, + 0x4b, 0x5f, 0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02, + 0x20, 0xb0, 0xb0, 0x06, 0xe7, 0xf3, 0x78, 0x90, + 0x90, 0x03, 0x78, 0xd1, 0x00, 0x88, 0x4b, 0x5b, + 0x58, 0x18, 0x42, 0x90, 0xd0, 0x02, 0x20, 0xb1, + 0xb0, 0x06, 0xe7, 0xe8, 0x98, 0x03, 0x23, 0x80, + 0x40, 0x18, 0xd1, 0x49, 0x01, 0x08, 0x4b, 0x56, + 0x18, 0xc3, 0x93, 0x00, 0x20, 0x00, 0x9b, 0x00, + 0x60, 0x18, 0x23, 0x00, 0x00, 0x88, 0x4e, 0x51, + 0x50, 0x33, 0x23, 0xff, 0x48, 0x51, 0x54, 0x43, + 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x4b, 0x50, + 0x68, 0x1b, 0x40, 0x18, 0x4b, 0x4e, 0x60, 0x18, + 0x98, 0x03, 0x23, 0x08, 0x40, 0x18, 0xd0, 0x27, + 0x20, 0x01, 0x40, 0x88, 0x90, 0x04, 0x7a, 0x10, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x0b, 0x98, 0x04, + 0x23, 0x19, 0x06, 0x9b, 0x69, 0x1b, 0x40, 0x18, + 0xd0, 0x04, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, + 0x61, 0x18, 0xe7, 0xf4, 0xe0, 0x0e, 0x7a, 0x10, + 0x23, 0x02, 0x40, 0x18, 0xd0, 0x0a, 0x98, 0x04, + 0x23, 0x19, 0x06, 0x9b, 0x69, 0x5b, 0x40, 0x18, + 0xd0, 0x04, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, + 0x61, 0x58, 0xe7, 0xf4, 0x48, 0x3b, 0x5d, 0xc0, + 0x38, 0x01, 0x4b, 0x3a, 0x55, 0xd8, 0xe0, 0x06, + 0x4e, 0x39, 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, + 0x68, 0x33, 0x40, 0x18, 0x60, 0x30, 0xe0, 0x36, + 0x98, 0x03, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x2f, + 0x00, 0xf8, 0x1b, 0xc0, 0x00, 0x80, 0x4b, 0x33, + 0x68, 0x1b, 0x18, 0xc3, 0x93, 0x02, 0x9b, 0x02, + 0x7e, 0x18, 0x42, 0x88, 0xd1, 0x03, 0x20, 0xff, + 0x9b, 0x02, 0x76, 0x18, 0xe0, 0x0a, 0x9b, 0x02, + 0x7e, 0x58, 0x42, 0x88, 0xd1, 0x03, 0x20, 0xff, + 0x9b, 0x02, 0x76, 0x58, 0xe0, 0x02, 0x20, 0xb1, + 0xb0, 0x06, 0xe7, 0x7c, 0x23, 0x00, 0x00, 0x88, + 0x4e, 0x27, 0x50, 0x33, 0x20, 0xff, 0x4b, 0x27, + 0x54, 0x58, 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, + 0x4b, 0x25, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x24, + 0x80, 0x18, 0x4e, 0x24, 0x96, 0x05, 0x23, 0x00, + 0x00, 0x88, 0x9e, 0x05, 0x50, 0x33, 0xe0, 0x02, + 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x63, 0x78, 0xa8, + 0x38, 0x01, 0x70, 0xa8, 0x78, 0x50, 0x23, 0x80, + 0x43, 0x18, 0x70, 0x50, 0x78, 0xa8, 0x28, 0x00, + 0xd1, 0x07, 0x98, 0x01, 0x68, 0x00, 0x4b, 0x1a, + 0x40, 0x18, 0x9b, 0x01, 0x60, 0x18, 0x20, 0x01, + 0x70, 0xe8, 0x24, 0x1f, 0x2c, 0x00, 0xd1, 0x02, + 0xe0, 0x0a, 0x3c, 0x01, 0xe7, 0xfa, 0x48, 0x0d, + 0x5d, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x19, + 0x06, 0x80, 0x64, 0xc4, 0xe0, 0x00, 0xe7, 0xf4, + 0x20, 0x00, 0xb0, 0x06, 0xe7, 0x3f, 0xb0, 0x06, + 0xe7, 0x3d, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x38, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9c, 0x50, + 0x64, 0x00, 0x08, 0x08, 0x2e, 0x08, 0x9d, 0x10, + 0x2e, 0x08, 0x9c, 0x48, 0x2e, 0x08, 0xb9, 0x60, + 0x64, 0x00, 0x00, 0x18, 0x2e, 0x08, 0x9b, 0x30, + 0x2e, 0x08, 0x9c, 0xd0, 0x2e, 0x08, 0x9d, 0x30, + 0x2e, 0x08, 0x9c, 0x4c, 0x9e, 0x00, 0x04, 0xb8, + 0xff, 0xff, 0xdf, 0xff, 0x1c, 0x03, 0x1c, 0x0a, + 0x78, 0x58, 0x70, 0x10, 0x20, 0x00, 0x47, 0x70, + 0xe7, 0xfd, 0xb5, 0xf7, 0x1c, 0x07, 0xb0, 0x81, + 0x9a, 0x03, 0x06, 0x10, 0x0e, 0x00, 0x90, 0x00, + 0xb0, 0x87, 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, + 0xd0, 0x4c, 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, + 0xd0, 0x48, 0x78, 0xb8, 0x90, 0x06, 0x99, 0x09, + 0x78, 0x88, 0x90, 0x05, 0x98, 0x06, 0x23, 0x20, + 0x40, 0x18, 0xd0, 0x3f, 0x98, 0x05, 0x23, 0x20, + 0x40, 0x18, 0xd0, 0x3b, 0x6b, 0x38, 0x90, 0x01, + 0x99, 0x09, 0x6b, 0x08, 0x90, 0x00, 0x98, 0x01, + 0x28, 0x00, 0xd1, 0x02, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd1, 0x05, 0x20, 0xb6, 0xb0, 0x08, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x01, 0x68, 0x05, 0x98, 0x00, 0x68, 0x04, + 0x7a, 0x2e, 0x7a, 0x21, 0x91, 0x04, 0x7d, 0x6a, + 0x92, 0x03, 0x7d, 0x62, 0x92, 0x02, 0x98, 0x07, + 0x28, 0x00, 0xd0, 0x0a, 0x9a, 0x02, 0x99, 0x04, + 0x1c, 0x28, 0xf0, 0x00, 0xfc, 0xe5, 0x9a, 0x03, + 0x1c, 0x31, 0x1c, 0x20, 0xf0, 0x00, 0xfc, 0xe0, + 0xe0, 0x09, 0x99, 0x04, 0x1c, 0x28, 0x22, 0x00, + 0xf0, 0x00, 0xfc, 0xda, 0x1c, 0x31, 0x1c, 0x20, + 0x22, 0x00, 0xf0, 0x00, 0xfc, 0xd5, 0x20, 0x00, + 0xb0, 0x08, 0xe7, 0xd5, 0x20, 0xb1, 0xb0, 0x08, + 0xe7, 0xd2, 0xb0, 0x07, 0xb0, 0x01, 0xe7, 0xcf, + 0xb4, 0xf0, 0x1c, 0x02, 0x1c, 0x0b, 0x06, 0x1d, + 0x0e, 0x2d, 0xb0, 0x82, 0x2d, 0x00, 0xd1, 0x0a, + 0x48, 0x1a, 0x69, 0x00, 0x90, 0x01, 0x49, 0x1a, + 0x48, 0x18, 0x69, 0x40, 0x90, 0x00, 0x48, 0x17, + 0x6a, 0x00, 0x1e, 0x44, 0xe0, 0x10, 0x2d, 0x20, + 0xd1, 0x0a, 0x48, 0x14, 0x69, 0x80, 0x90, 0x01, + 0x49, 0x14, 0x48, 0x12, 0x69, 0xc0, 0x90, 0x00, + 0x48, 0x10, 0x6a, 0x40, 0x1e, 0x44, 0xe0, 0x03, + 0x20, 0xb3, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x20, 0x00, 0x70, 0x10, 0x78, 0x50, 0x00, 0x80, + 0x4e, 0x0d, 0x58, 0x37, 0x69, 0x38, 0x61, 0x78, + 0x98, 0x01, 0x9e, 0x00, 0x42, 0xb0, 0xd0, 0x07, + 0x98, 0x01, 0x30, 0x01, 0x90, 0x01, 0x98, 0x01, + 0x40, 0x20, 0x90, 0x01, 0x98, 0x01, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xe6, 0xb0, 0x02, + 0xe7, 0xe4, 0x00, 0x00, 0x9e, 0x00, 0x04, 0x80, + 0x9e, 0x00, 0x04, 0x90, 0x9e, 0x00, 0x04, 0x98, + 0x2e, 0x08, 0x9b, 0xc8, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x81, 0x99, 0x02, 0x06, 0x08, 0x0e, 0x00, + 0x90, 0x00, 0xb0, 0x88, 0x98, 0x08, 0x28, 0x00, + 0xd1, 0x0e, 0x49, 0x69, 0x91, 0x02, 0x48, 0x69, + 0x69, 0x00, 0x90, 0x07, 0x48, 0x68, 0x90, 0x06, + 0x48, 0x66, 0x69, 0x40, 0x90, 0x05, 0x48, 0x65, + 0x6a, 0x00, 0x1e, 0x41, 0x91, 0x04, 0xe0, 0x17, + 0x98, 0x08, 0x28, 0x20, 0xd1, 0x0e, 0x49, 0x63, + 0x91, 0x02, 0x48, 0x60, 0x69, 0x80, 0x90, 0x07, + 0x48, 0x61, 0x90, 0x06, 0x48, 0x5d, 0x69, 0xc0, + 0x90, 0x05, 0x48, 0x5c, 0x6a, 0x40, 0x1e, 0x41, + 0x91, 0x04, 0xe0, 0x05, 0x20, 0xb3, 0xb0, 0x09, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x25, 0x00, 0x98, 0x07, 0x99, 0x05, 0x42, 0x88, + 0xd0, 0x73, 0x2d, 0x00, 0xd1, 0x72, 0x98, 0x07, + 0x00, 0x80, 0x99, 0x02, 0x18, 0x40, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xc0, 0x68, 0x01, 0x91, 0x03, + 0x98, 0x07, 0x00, 0x80, 0x99, 0x02, 0x58, 0x08, + 0x90, 0x01, 0x99, 0x02, 0x98, 0x07, 0x18, 0x08, + 0x23, 0x01, 0x02, 0xdb, 0x18, 0xc0, 0x78, 0x00, + 0x90, 0x00, 0x20, 0x00, 0x99, 0x02, 0x9a, 0x07, + 0x18, 0x89, 0x23, 0x01, 0x02, 0xdb, 0x18, 0xc9, + 0x70, 0x08, 0x98, 0x07, 0x30, 0x01, 0x90, 0x07, + 0x98, 0x07, 0x99, 0x04, 0x40, 0x08, 0x90, 0x07, + 0x99, 0x03, 0x29, 0x00, 0xd0, 0x71, 0xb0, 0x83, + 0x20, 0x00, 0x90, 0x00, 0x99, 0x06, 0x91, 0x02, + 0x20, 0x01, 0x90, 0x01, 0x98, 0x03, 0x28, 0x80, + 0xd1, 0x1f, 0x24, 0x00, 0x2c, 0x10, 0xd3, 0x02, + 0xe0, 0x1a, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x01, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x10, 0x48, 0x39, + 0x5d, 0x00, 0x28, 0xff, 0xd0, 0x0c, 0x48, 0x37, + 0x5d, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x49, 0x36, + 0x58, 0x09, 0x00, 0xa8, 0x19, 0xc0, 0x61, 0x01, + 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0xe0, 0x03, + 0x98, 0x01, 0x00, 0x40, 0x90, 0x01, 0xe7, 0xe4, + 0xe0, 0x1d, 0x24, 0x00, 0x2c, 0x20, 0xd3, 0x02, + 0xe0, 0x19, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x01, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x0f, 0x48, 0x2b, + 0x5d, 0x00, 0x28, 0xff, 0xd0, 0x0b, 0x48, 0x29, + 0x5d, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x49, 0x28, + 0x58, 0x09, 0x00, 0xa8, 0x19, 0xc0, 0x61, 0x01, + 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x01, + 0x00, 0x40, 0x90, 0x01, 0xe7, 0xe5, 0x2d, 0x00, + 0xe0, 0x01, 0xe0, 0x27, 0xe0, 0x26, 0xd0, 0x23, + 0xb0, 0x81, 0x98, 0x01, 0x70, 0x78, 0x98, 0x05, + 0x60, 0x78, 0x98, 0x01, 0x00, 0x80, 0x49, 0x1d, + 0x58, 0x08, 0x90, 0x00, 0x98, 0x00, 0x69, 0x46, + 0x98, 0x05, 0x42, 0xb0, 0xd3, 0x04, 0x1d, 0xf0, + 0x30, 0xb9, 0x99, 0x05, 0x42, 0x88, 0xd2, 0x08, + 0x68, 0x30, 0x28, 0x00, 0xd0, 0x01, 0x68, 0x36, + 0xe0, 0x02, 0x20, 0xba, 0xb0, 0x0d, 0xe7, 0x63, + 0xe7, 0xee, 0x60, 0xbe, 0x98, 0x00, 0x61, 0x46, + 0x1c, 0x38, 0xf0, 0x00, 0xfb, 0x02, 0xb0, 0x01, + 0xb0, 0x03, 0xe7, 0x5e, 0x70, 0x3d, 0x98, 0x07, + 0x99, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x09, + 0xe7, 0x52, 0xb0, 0x08, 0xb0, 0x01, 0xe7, 0x4f, + 0x2e, 0x08, 0x9d, 0xfc, 0x9e, 0x00, 0x04, 0x80, + 0x9e, 0x00, 0x04, 0x90, 0x2e, 0x08, 0xa6, 0xfc, + 0x9e, 0x00, 0x04, 0x98, 0x2e, 0x08, 0x9d, 0x30, + 0x2e, 0x08, 0x9c, 0xd0, 0x2e, 0x08, 0x9d, 0x10, + 0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x9b, 0xc8, + 0xb4, 0x90, 0x1c, 0x01, 0x78, 0x48, 0x00, 0x80, + 0x4c, 0x0d, 0x58, 0x23, 0x69, 0x1a, 0x68, 0x8f, + 0x42, 0xba, 0xd0, 0x12, 0x68, 0x10, 0x42, 0xb8, + 0xd0, 0x08, 0x68, 0x10, 0x28, 0x00, 0xd0, 0x01, + 0x68, 0x12, 0xe0, 0x02, 0x20, 0xba, 0xbc, 0x90, + 0x47, 0x70, 0xe7, 0xf3, 0x20, 0x00, 0x60, 0x10, + 0x69, 0x9c, 0x69, 0x18, 0x60, 0x20, 0x61, 0x1f, + 0x61, 0x9a, 0x20, 0x00, 0xe7, 0xf3, 0xe7, 0xf2, + 0x2e, 0x08, 0x9b, 0xc8, 0xb4, 0xb0, 0x1c, 0x02, + 0x1c, 0x0f, 0x78, 0x90, 0x23, 0x04, 0x40, 0x18, + 0xd0, 0x1c, 0x78, 0x90, 0x23, 0x20, 0x40, 0x18, + 0xd0, 0x18, 0x6b, 0x14, 0x68, 0x20, 0x28, 0x00, + 0xd0, 0x02, 0x1d, 0xe5, 0x35, 0x05, 0xe0, 0x01, + 0x1d, 0xe5, 0x35, 0x31, 0x21, 0x00, 0x29, 0x08, + 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, + 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 0x58, 0x2b, + 0x00, 0x88, 0x50, 0x3b, 0xe7, 0xf6, 0x20, 0x00, + 0xbc, 0xb0, 0x47, 0x70, 0x20, 0xb1, 0xe7, 0xfb, + 0xe7, 0xfa, 0xb5, 0xf3, 0x1c, 0x0a, 0xb0, 0x93, + 0x20, 0x00, 0x90, 0x06, 0x98, 0x13, 0x69, 0x00, + 0x90, 0x00, 0x98, 0x00, 0x6b, 0x00, 0x90, 0x12, + 0x98, 0x00, 0x78, 0x80, 0x90, 0x05, 0x98, 0x12, + 0x68, 0x00, 0x90, 0x01, 0x28, 0x00, 0xd0, 0x03, + 0x98, 0x12, 0x30, 0x0c, 0x90, 0x09, 0xe0, 0x0e, + 0x98, 0x12, 0x6a, 0xc0, 0x90, 0x01, 0x28, 0x00, + 0xd0, 0x03, 0x98, 0x12, 0x30, 0x38, 0x90, 0x09, + 0xe0, 0x05, 0x20, 0xb1, 0xb0, 0x13, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0x90, 0x06, 0x98, 0x05, 0x23, 0x04, 0x40, 0x18, + 0xd0, 0x73, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, + 0xe0, 0x0c, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x98, 0x13, 0x30, 0x80, 0x69, 0x00, + 0x00, 0x8b, 0x58, 0xc0, 0x00, 0x8e, 0xab, 0x0a, + 0x51, 0x98, 0xe7, 0xf2, 0x9d, 0x01, 0x21, 0x00, + 0x29, 0x08, 0xdb, 0x04, 0xe0, 0xa7, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, + 0xab, 0x0a, 0x58, 0x18, 0x28, 0x00, 0xd0, 0x55, + 0x20, 0x00, 0x90, 0x08, 0x48, 0x73, 0x90, 0x07, + 0x20, 0x00, 0x90, 0x02, 0x98, 0x02, 0x28, 0x20, + 0xdb, 0x06, 0xe0, 0x8d, 0x98, 0x02, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x90, 0x02, 0xe7, 0xf5, + 0x00, 0x8b, 0xa8, 0x0a, 0x58, 0xc0, 0x9b, 0x07, + 0x40, 0x18, 0x90, 0x08, 0x28, 0x00, 0xd0, 0x73, + 0x00, 0x88, 0x9b, 0x09, 0x58, 0x18, 0x9b, 0x08, + 0x40, 0x18, 0xd0, 0x6e, 0x1d, 0xec, 0x34, 0x01, + 0x27, 0x00, 0x79, 0xa0, 0x9b, 0x06, 0x42, 0x98, + 0xd0, 0x08, 0x68, 0x68, 0x1c, 0x05, 0xd1, 0x02, + 0x20, 0xba, 0xb0, 0x13, 0xe7, 0xab, 0x1d, 0xec, + 0x34, 0x01, 0xe7, 0xf2, 0x78, 0x60, 0x07, 0x00, + 0x0f, 0x00, 0x02, 0x00, 0x04, 0x07, 0x0c, 0x3f, + 0x78, 0xa0, 0x19, 0xc0, 0x30, 0x03, 0x04, 0x07, + 0x0c, 0x3f, 0x2a, 0x00, 0xd0, 0x42, 0x98, 0x13, + 0x88, 0x40, 0x42, 0xb8, 0xdb, 0x3a, 0x98, 0x13, + 0x88, 0x40, 0x1b, 0xc0, 0x9b, 0x13, 0x80, 0x58, + 0x20, 0xbc, 0x90, 0x04, 0x2f, 0x00, 0xdd, 0x30, + 0x2f, 0xbc, 0xdd, 0x1b, 0x20, 0x00, 0x90, 0x03, + 0x98, 0x03, 0x28, 0xbc, 0xdb, 0x09, 0xe0, 0x0d, + 0x98, 0x03, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, + 0xe0, 0x01, 0xe0, 0x4c, 0xe0, 0x41, 0x90, 0x03, + 0xe7, 0xf2, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, + 0x32, 0x01, 0xe7, 0xf1, 0x1f, 0xf8, 0x38, 0xb5, + 0x04, 0x07, 0x0c, 0x3f, 0x68, 0x2d, 0x1d, 0xec, + 0x34, 0x01, 0xe0, 0x11, 0x20, 0x00, 0x90, 0x03, + 0x98, 0x03, 0x42, 0xb8, 0xdb, 0x06, 0xe0, 0x0a, + 0x98, 0x03, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x03, 0xe7, 0xf5, 0x78, 0x23, 0x34, 0x01, + 0x70, 0x13, 0x32, 0x01, 0xe7, 0xf4, 0x27, 0x00, + 0xe7, 0xcc, 0xe0, 0x02, 0x20, 0xb7, 0xb0, 0x13, + 0xe7, 0x59, 0xe0, 0x04, 0x98, 0x13, 0x88, 0x40, + 0x19, 0xc0, 0x9b, 0x13, 0x80, 0x58, 0x00, 0x88, + 0xab, 0x0a, 0x58, 0x18, 0x9b, 0x07, 0x43, 0x98, + 0x00, 0x8e, 0xab, 0x0a, 0x51, 0x98, 0xe0, 0x01, + 0xe0, 0x01, 0xe0, 0x00, 0x9d, 0x01, 0x98, 0x06, + 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x06, + 0x98, 0x07, 0x08, 0x40, 0x90, 0x07, 0xe7, 0x71, + 0xe0, 0x04, 0x98, 0x06, 0x30, 0x20, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x06, 0xe7, 0x57, 0x20, 0x00, + 0xb0, 0x13, 0xe7, 0x34, 0xe0, 0x44, 0x98, 0x05, + 0x23, 0x02, 0x40, 0x18, 0xd0, 0x3b, 0x98, 0x01, + 0x1d, 0xc4, 0x34, 0x01, 0x78, 0x60, 0x07, 0x00, + 0x0f, 0x00, 0x02, 0x00, 0x04, 0x07, 0x0c, 0x3f, + 0x78, 0xa0, 0x19, 0xc0, 0x30, 0x03, 0x04, 0x07, + 0x0c, 0x3f, 0x2f, 0x00, 0xdd, 0x28, 0x2f, 0xbc, + 0xdd, 0x17, 0x21, 0x00, 0x29, 0xbc, 0xdb, 0x04, + 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, + 0x32, 0x01, 0xe7, 0xf6, 0x1f, 0xf8, 0x38, 0xb5, + 0x04, 0x07, 0x0c, 0x3f, 0x98, 0x01, 0x68, 0x00, + 0x90, 0x01, 0x98, 0x01, 0x1d, 0xc4, 0x34, 0x01, + 0xe0, 0x0d, 0x21, 0x00, 0x42, 0xb9, 0xdb, 0x04, + 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, + 0x32, 0x01, 0xe7, 0xf6, 0x27, 0x00, 0xe7, 0xd4, + 0x20, 0x00, 0xb0, 0x13, 0xe6, 0xf3, 0x20, 0xb1, + 0xb0, 0x13, 0xe6, 0xf0, 0xb0, 0x13, 0xe6, 0xee, + 0xe6, 0xed, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xb5, 0xf3, 0xb0, 0x84, 0x98, 0x04, 0x78, 0x40, + 0x00, 0x80, 0x49, 0x4b, 0x58, 0x08, 0x90, 0x03, + 0x28, 0x00, 0xd1, 0x05, 0x20, 0xb0, 0xb0, 0x04, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x04, 0x68, 0x86, 0x98, 0x04, 0x88, 0x47, + 0x98, 0x04, 0x68, 0x44, 0x1d, 0xf0, 0x30, 0xb9, + 0x99, 0x04, 0x68, 0x49, 0x1a, 0x45, 0x42, 0xbd, + 0xdb, 0x0c, 0x2f, 0x00, 0xdb, 0x01, 0x2f, 0xbc, + 0xdd, 0x02, 0x20, 0xba, 0xb0, 0x04, 0xe7, 0xe7, + 0x1c, 0x3a, 0x99, 0x05, 0x1c, 0x20, 0xf0, 0x00, + 0xf9, 0x29, 0xe0, 0x6b, 0x20, 0x00, 0x90, 0x00, + 0x98, 0x04, 0x78, 0x40, 0x00, 0xc3, 0x1a, 0x18, + 0x00, 0x80, 0x49, 0x36, 0x68, 0x09, 0x18, 0x40, + 0x90, 0x01, 0x98, 0x01, 0x78, 0x80, 0x90, 0x02, + 0x98, 0x02, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, + 0x98, 0x02, 0x28, 0x12, 0xd1, 0x03, 0x2d, 0x0e, + 0xda, 0x01, 0x20, 0x01, 0x90, 0x00, 0x2f, 0x00, + 0xdd, 0x50, 0xb0, 0x81, 0x42, 0xaf, 0xdd, 0x0d, + 0x2d, 0x00, 0xdb, 0x01, 0x2d, 0xbc, 0xdd, 0x02, + 0x20, 0xba, 0xb0, 0x05, 0xe7, 0xbc, 0x1c, 0x2a, + 0x99, 0x06, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0xfe, + 0x68, 0x36, 0xe0, 0x0b, 0x2f, 0x00, 0xdb, 0x01, + 0x2f, 0xbc, 0xdd, 0x02, 0x20, 0xba, 0xb0, 0x05, + 0xe7, 0xae, 0x1c, 0x3a, 0x99, 0x06, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0xf0, 0x99, 0x06, 0x19, 0x49, + 0x91, 0x06, 0x1b, 0x7f, 0x1d, 0x31, 0x91, 0x00, + 0x99, 0x00, 0x78, 0x88, 0x19, 0x84, 0x98, 0x01, + 0x28, 0x00, 0xd0, 0x20, 0x99, 0x00, 0x78, 0xc8, + 0x23, 0x80, 0x40, 0x18, 0xd1, 0x1b, 0x1d, 0xf0, + 0x30, 0xb9, 0x1b, 0x05, 0x42, 0xbd, 0xdb, 0x01, + 0x3c, 0x01, 0xe0, 0x14, 0x1c, 0x68, 0x42, 0xb8, + 0xd1, 0x11, 0x99, 0x00, 0x78, 0x88, 0x28, 0x09, + 0xdd, 0x08, 0x99, 0x00, 0x79, 0x08, 0x30, 0x09, + 0x99, 0x00, 0x78, 0x89, 0x42, 0x88, 0xd0, 0x00, + 0x3c, 0x01, 0xe0, 0x04, 0x99, 0x00, 0x78, 0x88, + 0x28, 0x09, 0xd1, 0x00, 0x3c, 0x01, 0x20, 0x00, + 0x90, 0x01, 0x1d, 0xf0, 0x30, 0xb9, 0x1b, 0x05, + 0xb0, 0x01, 0xe7, 0xac, 0x20, 0x00, 0xb0, 0x04, + 0xe7, 0x72, 0xb0, 0x04, 0xe7, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x30, + 0xb5, 0xf1, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24, + 0xb0, 0x83, 0x00, 0xa0, 0x4b, 0x4c, 0x58, 0x1d, + 0x78, 0x28, 0x90, 0x02, 0x2c, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x4b, 0x46, + 0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0, + 0xb0, 0x03, 0xe7, 0xf3, 0x00, 0xe0, 0x1b, 0x00, + 0x00, 0x80, 0x4b, 0x42, 0x68, 0x1b, 0x18, 0xc7, + 0x78, 0xa8, 0x28, 0x00, 0xd0, 0x63, 0x20, 0x00, + 0x42, 0x80, 0xd0, 0x20, 0x21, 0x00, 0x29, 0x20, + 0xdb, 0x04, 0xe0, 0x1b, 0x1c, 0x48, 0x06, 0x01, + 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 0x4b, 0x3a, + 0x58, 0x18, 0x90, 0x01, 0x98, 0x01, 0x79, 0xc0, + 0x42, 0xa0, 0xd1, 0x0e, 0x20, 0x01, 0x40, 0x88, + 0x43, 0xc0, 0x4b, 0x36, 0x68, 0x1b, 0x40, 0x18, + 0x4b, 0x34, 0x60, 0x18, 0x23, 0x00, 0x00, 0x88, + 0x4e, 0x31, 0x50, 0x33, 0x23, 0xff, 0x48, 0x32, + 0x54, 0x43, 0xe7, 0xe3, 0xe0, 0x3f, 0x7e, 0x38, + 0x1c, 0x02, 0x28, 0xff, 0xd0, 0x10, 0x20, 0xff, + 0x4b, 0x2e, 0x54, 0x98, 0x23, 0x00, 0x00, 0x90, + 0x4e, 0x2d, 0x50, 0x33, 0x20, 0x01, 0x40, 0x90, + 0x43, 0xc0, 0x4b, 0x2c, 0x88, 0x1b, 0x40, 0x18, + 0x4b, 0x2a, 0x80, 0x18, 0x20, 0xff, 0x76, 0x38, + 0x7e, 0x78, 0x1c, 0x02, 0x28, 0xff, 0xd0, 0x11, + 0x20, 0xff, 0x4b, 0x24, 0x54, 0x98, 0x23, 0x00, + 0x00, 0x90, 0x4e, 0x23, 0x50, 0x33, 0x20, 0x01, + 0x40, 0x90, 0x43, 0xc0, 0x4b, 0x21, 0x88, 0x1b, + 0x40, 0x18, 0x4b, 0x20, 0x80, 0x18, 0x20, 0xff, + 0x76, 0x78, 0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x03, + 0xe7, 0x98, 0x23, 0x00, 0x00, 0x90, 0x4e, 0x1a, + 0x50, 0x33, 0x20, 0x01, 0x40, 0x90, 0x43, 0xc0, + 0x4b, 0x18, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x17, + 0x80, 0x18, 0x4e, 0x17, 0x96, 0x00, 0x20, 0x00, + 0x00, 0x93, 0x9e, 0x00, 0x50, 0xf0, 0x98, 0x02, + 0x23, 0x20, 0x40, 0x18, 0xd0, 0xff, 0x21, 0x00, + 0x29, 0x0c, 0xdb, 0x04, 0xe0, 0x07, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x00, + 0x18, 0x7b, 0x73, 0x18, 0xe7, 0xf7, 0x20, 0x00, + 0x83, 0x38, 0x20, 0x00, 0x70, 0xf8, 0x20, 0x00, + 0xb0, 0x03, 0xe7, 0x6f, 0xb0, 0x03, 0xe7, 0x6d, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x30, + 0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x9c, 0x48, + 0x2e, 0x08, 0x9d, 0x10, 0x2e, 0x08, 0x9d, 0x30, + 0x2e, 0x08, 0x9c, 0xd0, 0x2e, 0x08, 0x9c, 0x4c, + 0x9e, 0x00, 0x04, 0xb8, 0xb5, 0xf0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x20, 0x1d, 0x02, 0x80, + 0x69, 0x86, 0x1c, 0x3a, 0x1c, 0x29, 0x1c, 0x20, + 0xf0, 0x08, 0xfb, 0x32, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb4, 0xf0, 0x1c, 0x01, 0xb0, 0x82, + 0x68, 0x48, 0x68, 0x8c, 0x1d, 0xe2, 0x32, 0xb7, + 0x42, 0x82, 0xd9, 0x09, 0x78, 0x42, 0x07, 0x12, + 0x0f, 0x12, 0x02, 0x12, 0x78, 0x83, 0x43, 0x1a, + 0x32, 0x03, 0x04, 0x17, 0x0c, 0x3f, 0xe0, 0x41, + 0xb0, 0x82, 0x68, 0x23, 0x93, 0x01, 0x9b, 0x01, + 0x33, 0x04, 0x93, 0x00, 0x9b, 0x00, 0x78, 0x9b, + 0x9e, 0x01, 0x19, 0x9a, 0x78, 0x4e, 0x00, 0xf3, + 0x1b, 0x9b, 0x00, 0x9b, 0x4e, 0x1b, 0x68, 0x36, + 0x19, 0x9b, 0x93, 0x02, 0x9b, 0x02, 0x78, 0x9d, + 0x06, 0xed, 0x0e, 0xed, 0x2d, 0x12, 0xd1, 0x0f, + 0x1d, 0xe3, 0x33, 0xb9, 0x68, 0x4e, 0x1b, 0x9b, + 0x06, 0x1b, 0x0e, 0x1b, 0x93, 0x03, 0x9b, 0x00, + 0x78, 0xde, 0x23, 0x80, 0x40, 0x33, 0xd1, 0x03, + 0x9b, 0x03, 0x2b, 0x0e, 0xda, 0x00, 0x3a, 0x01, + 0x1d, 0xe3, 0x33, 0xb8, 0x42, 0x83, 0xd9, 0x0b, + 0x78, 0x43, 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, + 0x04, 0x1f, 0x0c, 0x3f, 0x78, 0x13, 0x18, 0xfb, + 0x33, 0x03, 0x04, 0x1f, 0x0c, 0x3f, 0xe0, 0x08, + 0x78, 0x13, 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, + 0x78, 0x56, 0x43, 0x33, 0x33, 0x03, 0x04, 0x1f, + 0x0c, 0x3f, 0xb0, 0x02, 0x80, 0x4f, 0xb0, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x9b, 0x30, + 0xb5, 0xf3, 0xb0, 0x81, 0x99, 0x02, 0x06, 0x0b, + 0x0e, 0x1b, 0x93, 0x00, 0x9b, 0x00, 0x2b, 0x00, + 0xd1, 0x0a, 0x49, 0x24, 0x4b, 0x24, 0x69, 0x1b, + 0x1c, 0x18, 0x4b, 0x23, 0x69, 0x5b, 0x1c, 0x1c, + 0x4b, 0x21, 0x6a, 0x1b, 0x1e, 0x5a, 0xe0, 0x09, + 0x49, 0x20, 0x4b, 0x1f, 0x69, 0x9b, 0x1c, 0x18, + 0x4b, 0x1d, 0x69, 0xdb, 0x1c, 0x1c, 0x4b, 0x1c, + 0x6a, 0x5b, 0x1e, 0x5a, 0x9b, 0x01, 0x78, 0xdd, + 0x26, 0x01, 0x40, 0xae, 0x1c, 0x37, 0x42, 0xa0, + 0xd0, 0x26, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x40, 0x3b, + 0xd0, 0x1b, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x43, 0xbb, + 0x1c, 0x1d, 0x00, 0x83, 0x18, 0x5e, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xf3, 0x60, 0x1d, 0x00, 0x83, + 0x18, 0x5d, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xeb, + 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x05, 0x25, 0x00, + 0x18, 0x0e, 0x23, 0x01, 0x02, 0xdb, 0x18, 0xf3, + 0x70, 0x1d, 0x30, 0x01, 0x40, 0x10, 0xe7, 0xd6, + 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x9d, 0xfc, + 0x9e, 0x00, 0x04, 0x80, 0x2e, 0x08, 0xa6, 0xfc, + 0xb4, 0x90, 0x1c, 0x03, 0x1c, 0x0c, 0x1c, 0x17, + 0x06, 0x21, 0x0e, 0x09, 0x06, 0x38, 0x0e, 0x00, + 0x72, 0x19, 0x28, 0x00, 0xd0, 0x00, 0x75, 0x58, + 0x68, 0x5b, 0x2b, 0x00, 0xd1, 0xf8, 0xbc, 0x90, + 0x47, 0x70, 0x00, 0x00, 0xb5, 0x80, 0x1c, 0x07, + 0x68, 0xf8, 0x28, 0x1f, 0xd9, 0x03, 0x20, 0xe1, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x1e, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x1d, 0x40, 0x18, + 0x49, 0x1b, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x80, + 0x48, 0x19, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x18, + 0x6e, 0xc9, 0x60, 0x08, 0x48, 0x16, 0x6d, 0x00, + 0x68, 0x00, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, + 0x49, 0x13, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x80, + 0x48, 0x11, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x10, + 0x6e, 0xc9, 0x60, 0x08, 0x48, 0x0e, 0x6f, 0xc1, + 0xcf, 0x09, 0xc1, 0x09, 0xcf, 0x09, 0xc1, 0x09, + 0xcf, 0x08, 0xc1, 0x08, 0xf0, 0x00, 0xfc, 0x1e, + 0x20, 0x00, 0x49, 0x09, 0x60, 0x08, 0x20, 0x00, + 0x49, 0x07, 0x60, 0x48, 0x20, 0x00, 0x49, 0x06, + 0x60, 0x88, 0x49, 0x07, 0x20, 0x0b, 0xf0, 0x0d, + 0xfd, 0xef, 0x20, 0xff, 0x30, 0x01, 0x49, 0x02, + 0x61, 0xc8, 0x20, 0x00, 0xe7, 0xc0, 0xe7, 0xbf, + 0x2e, 0x08, 0x1f, 0x9c, 0xff, 0xff, 0xfd, 0xff, + 0x2e, 0x01, 0x5f, 0x15, 0x1c, 0x01, 0x48, 0x0e, + 0x6f, 0x00, 0x68, 0x00, 0x60, 0x08, 0x48, 0x0c, + 0x6e, 0x80, 0x68, 0x00, 0x60, 0x48, 0x48, 0x0a, + 0x6e, 0xc0, 0x68, 0x00, 0x60, 0x88, 0x48, 0x08, + 0x6f, 0x40, 0x68, 0x00, 0x60, 0xc8, 0x48, 0x06, + 0x68, 0x00, 0x61, 0x08, 0x48, 0x04, 0x68, 0x40, + 0x61, 0x48, 0x48, 0x03, 0x68, 0x80, 0x61, 0x88, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, + 0x2e, 0x08, 0x1f, 0x9c, 0x48, 0x03, 0x6e, 0x80, + 0x68, 0x00, 0x07, 0x40, 0x0f, 0xc0, 0x47, 0x70, + 0xe7, 0xfd, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x9c, + 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x48, 0x37, + 0x69, 0xc0, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, + 0xd0, 0x02, 0x20, 0xe0, 0xbc, 0x80, 0x47, 0x70, + 0x48, 0x32, 0x62, 0x07, 0x20, 0x00, 0x49, 0x31, + 0x62, 0x48, 0x48, 0x31, 0x60, 0x02, 0x48, 0x30, + 0x68, 0x00, 0x78, 0x00, 0x49, 0x2d, 0x61, 0x88, + 0x48, 0x2d, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x2b, + 0x61, 0x08, 0x48, 0x2b, 0x68, 0x00, 0x68, 0x40, + 0x49, 0x28, 0x60, 0xc8, 0x48, 0x27, 0x69, 0x80, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x27, + 0xe0, 0x01, 0x20, 0x01, 0x02, 0x40, 0x49, 0x23, + 0x61, 0xc8, 0x48, 0x22, 0x68, 0x40, 0x30, 0x01, + 0x49, 0x20, 0x60, 0x48, 0x48, 0x1f, 0x6d, 0x40, + 0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0x1d, + 0x69, 0x89, 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, + 0x43, 0x08, 0x49, 0x1a, 0x6d, 0x49, 0x60, 0x08, + 0x06, 0x00, 0x48, 0x18, 0x6d, 0x00, 0x68, 0x00, + 0x4b, 0x19, 0x40, 0x18, 0x49, 0x15, 0x69, 0x89, + 0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x49, 0x13, + 0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, 0x48, 0x11, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x13, 0x40, 0x18, + 0x49, 0x0e, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x40, + 0x48, 0x0c, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, + 0x03, 0x1b, 0x43, 0x18, 0x49, 0x09, 0x6d, 0x09, + 0x60, 0x08, 0x04, 0xc0, 0x48, 0x07, 0x6d, 0x40, + 0x68, 0x00, 0x49, 0x06, 0x6f, 0x09, 0x60, 0x08, + 0x48, 0x04, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x03, + 0x6e, 0xc9, 0x60, 0x08, 0x20, 0x00, 0xe7, 0x99, + 0xe7, 0x98, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x9c, + 0x2e, 0x08, 0x9d, 0xc0, 0x00, 0x00, 0x02, 0x01, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xb5, 0x00, 0x48, 0xf6, 0x6e, 0x80, 0x68, 0x00, + 0x23, 0x08, 0x40, 0x18, 0xd0, 0x74, 0x48, 0xf3, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xf2, 0x40, 0x18, + 0x49, 0xf0, 0x6d, 0x09, 0x60, 0x08, 0x04, 0x80, + 0x48, 0xee, 0x6e, 0x40, 0x68, 0x00, 0x0a, 0x00, + 0x02, 0x00, 0x49, 0xec, 0x6e, 0x49, 0x60, 0x08, + 0x06, 0x00, 0x48, 0xea, 0x6e, 0xc0, 0x68, 0x00, + 0x23, 0x01, 0x02, 0xdb, 0x40, 0x18, 0xd0, 0x3e, + 0x20, 0xff, 0x30, 0x01, 0x49, 0xe5, 0x61, 0xc8, + 0x48, 0xe4, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xe5, + 0x40, 0x18, 0x49, 0xe2, 0x6d, 0x09, 0x60, 0x08, + 0x04, 0xc0, 0x48, 0xe0, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0xdd, + 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, + 0x48, 0xdd, 0x68, 0x00, 0x7a, 0x00, 0x49, 0xd9, + 0x69, 0x09, 0x1a, 0x41, 0x48, 0xd7, 0x6f, 0xc0, + 0x68, 0x80, 0x68, 0x02, 0x4b, 0xd9, 0x40, 0x1a, + 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, + 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0xd1, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x04, + 0x43, 0x19, 0x60, 0x01, 0x07, 0x48, 0x48, 0xcd, + 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, + 0xf0, 0x0d, 0xfc, 0xd0, 0x48, 0xc9, 0x68, 0x00, + 0x30, 0x01, 0x49, 0xc8, 0x60, 0x08, 0x48, 0xc7, + 0x69, 0xc0, 0x4b, 0xcb, 0x42, 0x98, 0xd0, 0x73, + 0xdc, 0x08, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, + 0xd0, 0x6f, 0x23, 0x01, 0x02, 0x5b, 0x42, 0x98, + 0xd0, 0x07, 0xe2, 0xba, 0x4b, 0xc5, 0x42, 0x98, + 0xd0, 0x68, 0x4b, 0xc5, 0x42, 0x98, 0xd0, 0x66, + 0xe2, 0xb3, 0x48, 0xbc, 0x6e, 0x80, 0x68, 0x00, + 0x23, 0x01, 0x02, 0x5b, 0x40, 0x18, 0xe0, 0x00, + 0xe2, 0xcd, 0xd0, 0x3f, 0x48, 0xb7, 0x68, 0x00, + 0x30, 0x01, 0x49, 0xb6, 0x60, 0x08, 0x48, 0xb5, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xb5, 0x40, 0x18, + 0x49, 0xb2, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, + 0x20, 0xff, 0x30, 0x01, 0x49, 0xaf, 0x61, 0xc8, + 0x48, 0xae, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, + 0x02, 0x09, 0x0a, 0x09, 0x4a, 0xab, 0x6a, 0x52, + 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 0x48, 0xac, + 0x68, 0x00, 0x7a, 0x00, 0x49, 0xa7, 0x69, 0x09, + 0x1a, 0x41, 0x48, 0xa6, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x02, 0x4b, 0xa8, 0x40, 0x1a, 0x04, 0x09, + 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, + 0x02, 0x08, 0x0c, 0x00, 0x48, 0x9f, 0x6f, 0xc0, + 0x68, 0x80, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, + 0x60, 0x01, 0x07, 0x88, 0x48, 0x9b, 0x6f, 0xc0, + 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0d, + 0xfc, 0x6d, 0xe0, 0x5e, 0x48, 0x97, 0x69, 0x00, + 0x28, 0x00, 0xd0, 0x20, 0x48, 0x95, 0x69, 0x00, + 0x38, 0x01, 0x49, 0x94, 0x61, 0x08, 0x48, 0x93, + 0x68, 0xc0, 0x78, 0x00, 0x49, 0x91, 0x6c, 0x89, + 0x68, 0x09, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x08, + 0x49, 0x8e, 0x6c, 0x89, 0x60, 0x08, 0x06, 0x00, + 0x0e, 0x00, 0x48, 0x8c, 0x68, 0xc0, 0xe0, 0x03, + 0xe1, 0x4b, 0xe2, 0x4d, 0xe0, 0x42, 0xe1, 0x93, + 0x30, 0x01, 0x49, 0x88, 0x60, 0xc8, 0x48, 0x8d, + 0x49, 0x86, 0x61, 0xc8, 0xe0, 0x39, 0x20, 0xff, + 0x30, 0x01, 0x49, 0x84, 0x61, 0xc8, 0x48, 0x83, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, + 0x0a, 0x09, 0x4a, 0x80, 0x6a, 0x52, 0x06, 0x12, + 0x43, 0x11, 0x60, 0x01, 0x48, 0x80, 0x68, 0x00, + 0x7a, 0x00, 0x49, 0x7c, 0x69, 0x09, 0x1a, 0x41, + 0x48, 0x7a, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, + 0x4b, 0x7c, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, + 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, + 0x0c, 0x00, 0x48, 0x74, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, + 0x07, 0xc8, 0x48, 0x70, 0x6f, 0xc0, 0x68, 0xc1, + 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0d, 0xfc, 0x16, + 0x48, 0x6c, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x6d, + 0x40, 0x18, 0x49, 0x6a, 0x6d, 0x09, 0x60, 0x08, + 0x04, 0xc0, 0xe2, 0x08, 0x48, 0x67, 0x69, 0x00, + 0x28, 0x00, 0xd0, 0x5f, 0x48, 0x65, 0x6e, 0x80, + 0x68, 0x00, 0x23, 0xff, 0x33, 0x01, 0x40, 0x18, + 0xd0, 0x3f, 0x48, 0x62, 0x68, 0x00, 0x30, 0x01, + 0x49, 0x60, 0x60, 0x08, 0x48, 0x5f, 0x6d, 0x00, + 0x68, 0x00, 0x4b, 0x60, 0x40, 0x18, 0x49, 0x5d, + 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 0x20, 0xff, + 0x30, 0x01, 0x49, 0x5a, 0x61, 0xc8, 0x48, 0x59, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, + 0x0a, 0x09, 0x4a, 0x56, 0x6a, 0x52, 0x06, 0x12, + 0x43, 0x11, 0x60, 0x01, 0x48, 0x56, 0x68, 0x00, + 0x7a, 0x00, 0x49, 0x52, 0x69, 0x09, 0x1a, 0x41, + 0x48, 0x50, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, + 0x4b, 0x52, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, + 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, + 0x0c, 0x00, 0x48, 0x4a, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, + 0x07, 0x88, 0x48, 0x46, 0x6f, 0xc0, 0x68, 0xc1, + 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0d, 0xfb, 0xc2, + 0xe0, 0x17, 0x48, 0x42, 0x68, 0xc0, 0x78, 0x00, + 0x49, 0x40, 0x6c, 0x89, 0x68, 0x09, 0x0a, 0x09, + 0x02, 0x09, 0x43, 0x08, 0x49, 0x3d, 0x6c, 0x89, + 0x60, 0x08, 0x06, 0x00, 0x0e, 0x00, 0x48, 0x3b, + 0x68, 0xc0, 0x30, 0x01, 0x49, 0x39, 0x60, 0xc8, + 0x48, 0x38, 0x69, 0x00, 0x38, 0x01, 0x49, 0x37, + 0x61, 0x08, 0xe0, 0xa1, 0x48, 0x35, 0x6a, 0x00, + 0x38, 0x01, 0x49, 0x34, 0x62, 0x08, 0x48, 0x33, + 0x6a, 0x00, 0x28, 0x00, 0xd0, 0x4b, 0x48, 0x31, + 0x6a, 0x40, 0x30, 0x01, 0x49, 0x2f, 0x62, 0x48, + 0x48, 0x31, 0x68, 0x00, 0x30, 0x0c, 0x49, 0x30, + 0x60, 0x08, 0x48, 0x2f, 0x68, 0x00, 0x78, 0x00, + 0x49, 0x2a, 0x61, 0x88, 0x48, 0x2c, 0x68, 0x00, + 0x7a, 0x00, 0x49, 0x28, 0x61, 0x08, 0x48, 0x2a, + 0x68, 0x00, 0x68, 0x40, 0x49, 0x25, 0x60, 0xc8, + 0x48, 0x24, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, + 0xd0, 0x01, 0x48, 0x27, 0xe0, 0x01, 0x20, 0x01, + 0x02, 0x40, 0x49, 0x20, 0x61, 0xc8, 0x48, 0x1f, + 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, + 0x43, 0x18, 0x49, 0x1c, 0x6d, 0x09, 0x60, 0x08, + 0x04, 0x80, 0x48, 0x1a, 0x6d, 0x40, 0x68, 0x00, + 0x0a, 0x00, 0x02, 0x00, 0x49, 0x17, 0x69, 0x89, + 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, 0x43, 0x08, + 0x49, 0x14, 0x6d, 0x49, 0x60, 0x08, 0x06, 0x00, + 0x48, 0x12, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x19, + 0x40, 0x18, 0x49, 0x10, 0x69, 0x89, 0x07, 0xc9, + 0x0c, 0x49, 0x43, 0x08, 0x49, 0x0d, 0x6d, 0x09, + 0x60, 0x08, 0x04, 0x40, 0xe0, 0x4c, 0x20, 0xff, + 0x30, 0x01, 0x49, 0x0a, 0x61, 0xc8, 0x48, 0x09, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, + 0x0a, 0x09, 0x4a, 0x06, 0x6a, 0x52, 0x06, 0x12, + 0x43, 0x11, 0x60, 0x01, 0x48, 0x06, 0x68, 0x00, + 0x7a, 0x00, 0x49, 0x02, 0x69, 0x09, 0x1a, 0x41, + 0x48, 0x00, 0xe0, 0x11, 0x2e, 0x08, 0x1f, 0x9c, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xef, 0xff, + 0x2e, 0x08, 0x9d, 0xc0, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x02, 0x02, + 0x00, 0x00, 0x02, 0x03, 0xff, 0xff, 0xbf, 0xff, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 0x4b, 0xa5, + 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, + 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, + 0x48, 0xa1, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, + 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x07, 0xc8, + 0x48, 0x9d, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x0d, 0xfb, 0x0f, 0x48, 0x9a, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x99, 0x40, 0x18, + 0x49, 0x97, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, + 0xe1, 0x01, 0x48, 0x95, 0x6e, 0x80, 0x68, 0x00, + 0x23, 0x01, 0x02, 0x5b, 0x40, 0x18, 0xd0, 0x3f, + 0x48, 0x91, 0x68, 0x00, 0x30, 0x01, 0x49, 0x90, + 0x60, 0x08, 0x48, 0x8f, 0x6d, 0x00, 0x68, 0x00, + 0x4b, 0x8e, 0x40, 0x18, 0x49, 0x8c, 0x6d, 0x09, + 0x60, 0x08, 0x04, 0xc0, 0x20, 0xff, 0x30, 0x01, + 0x49, 0x89, 0x61, 0xc8, 0x48, 0x88, 0x6f, 0xc0, + 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, + 0x4a, 0x85, 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, + 0x60, 0x01, 0x48, 0x85, 0x68, 0x00, 0x7a, 0x00, + 0x49, 0x81, 0x69, 0x09, 0x1a, 0x41, 0x48, 0x80, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 0x4b, 0x7d, + 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, + 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, + 0x48, 0x79, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, + 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, 0x07, 0x88, + 0x48, 0x75, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x0d, 0xfa, 0xbf, 0xe0, 0x02, + 0x48, 0x74, 0x49, 0x71, 0x61, 0xc8, 0xe0, 0xb6, + 0x48, 0x6f, 0x69, 0x00, 0x28, 0x00, 0xd0, 0x62, + 0x48, 0x6d, 0x6e, 0x00, 0x68, 0x00, 0x49, 0x6c, + 0x68, 0xc9, 0x70, 0x08, 0x48, 0x6a, 0x68, 0xc0, + 0x30, 0x01, 0x49, 0x69, 0x60, 0xc8, 0x48, 0x68, + 0x69, 0x00, 0x38, 0x01, 0x49, 0x66, 0x61, 0x08, + 0x48, 0x65, 0x69, 0x00, 0x28, 0x00, 0xd1, 0x4d, + 0x48, 0x63, 0x6a, 0x00, 0x28, 0x01, 0xd1, 0x49, + 0x48, 0x63, 0x68, 0x00, 0x7a, 0x40, 0x49, 0x60, + 0x6d, 0x09, 0x68, 0x09, 0x4b, 0x62, 0x40, 0x19, + 0x07, 0xc0, 0x0d, 0x40, 0x43, 0x08, 0x49, 0x5c, + 0x6d, 0x09, 0x60, 0x08, 0x05, 0x40, 0x0f, 0xc0, + 0x20, 0xff, 0x30, 0x01, 0x49, 0x58, 0x61, 0xc8, + 0x48, 0x57, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x57, + 0x40, 0x18, 0x49, 0x55, 0x6d, 0x09, 0x60, 0x08, + 0x04, 0xc0, 0x48, 0x53, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0x50, + 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, + 0x48, 0x4f, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x4c, + 0x69, 0x09, 0x1a, 0x41, 0x48, 0x4a, 0x6f, 0xc0, + 0x68, 0x80, 0x68, 0x02, 0x4b, 0x47, 0x40, 0x1a, + 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, + 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0x44, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x01, + 0x43, 0x19, 0x60, 0x01, 0x07, 0xc8, 0x48, 0x40, + 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, + 0xf0, 0x0d, 0xfa, 0x54, 0xe0, 0x4f, 0x48, 0x3c, + 0x6a, 0x00, 0x38, 0x01, 0x49, 0x3a, 0x62, 0x08, + 0x48, 0x39, 0x6a, 0x40, 0x30, 0x01, 0x49, 0x38, + 0x62, 0x48, 0x48, 0x39, 0x68, 0x00, 0x30, 0x0c, + 0x49, 0x37, 0x60, 0x08, 0x48, 0x36, 0x68, 0x00, + 0x78, 0x00, 0x49, 0x33, 0x61, 0x88, 0x48, 0x34, + 0x68, 0x00, 0x7a, 0x00, 0x49, 0x30, 0x61, 0x08, + 0x48, 0x31, 0x68, 0x00, 0x68, 0x40, 0x49, 0x2e, + 0x60, 0xc8, 0x48, 0x2d, 0x69, 0x80, 0x07, 0xc0, + 0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x2f, 0xe0, 0x01, + 0x20, 0x01, 0x02, 0x40, 0x49, 0x28, 0x61, 0xc8, + 0x48, 0x27, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, + 0x03, 0x5b, 0x43, 0x18, 0x49, 0x24, 0x6d, 0x09, + 0x60, 0x08, 0x04, 0x80, 0x48, 0x22, 0x6d, 0x40, + 0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0x20, + 0x69, 0x89, 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, + 0x43, 0x08, 0x49, 0x1d, 0x6d, 0x49, 0x60, 0x08, + 0x06, 0x00, 0x48, 0x1b, 0x6d, 0x00, 0x68, 0x00, + 0x4b, 0x1f, 0x40, 0x18, 0x49, 0x18, 0x69, 0x89, + 0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x49, 0x16, + 0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, 0xe0, 0x01, + 0xe0, 0x00, 0xe7, 0xff, 0x48, 0x12, 0x6c, 0x80, + 0x68, 0x00, 0x49, 0x11, 0x6e, 0x49, 0x60, 0x08, + 0x48, 0x0f, 0x6d, 0x40, 0x68, 0x00, 0x49, 0x0e, + 0x6f, 0x09, 0x60, 0x08, 0x48, 0x0c, 0x6d, 0x00, + 0x68, 0x00, 0x49, 0x0b, 0x6e, 0xc9, 0x60, 0x08, + 0x48, 0x09, 0x6c, 0xc0, 0x68, 0x00, 0x23, 0x08, + 0x43, 0x18, 0x49, 0x07, 0x6c, 0xc9, 0x60, 0x08, + 0x07, 0x00, 0x48, 0x05, 0x6c, 0xc0, 0x68, 0x00, + 0x49, 0x03, 0x6e, 0x89, 0x60, 0x08, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, + 0x2e, 0x08, 0x1f, 0x9c, 0xff, 0xff, 0xef, 0xff, + 0x2e, 0x08, 0x9d, 0xc0, 0x00, 0x00, 0x02, 0x03, + 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x02, 0x01, + 0xff, 0xff, 0xbf, 0xff, 0xb4, 0x80, 0x49, 0x2e, + 0x20, 0x00, 0x28, 0x08, 0xd3, 0x04, 0xe0, 0x06, + 0x1c, 0x42, 0x06, 0x10, 0x0e, 0x00, 0xe7, 0xf8, + 0x23, 0x00, 0xc1, 0x08, 0xe7, 0xf8, 0x4a, 0x29, + 0x6f, 0xd2, 0x68, 0x12, 0x4b, 0x27, 0x6d, 0x9b, + 0x68, 0x1b, 0x0a, 0x1b, 0x02, 0x1b, 0x06, 0x12, + 0x0e, 0x12, 0x43, 0x1a, 0x4b, 0x23, 0x6d, 0x9b, + 0x60, 0x1a, 0x06, 0x12, 0x0e, 0x12, 0x4a, 0x21, + 0x6f, 0xd2, 0x68, 0x52, 0x4b, 0x1f, 0x6d, 0x1b, + 0x68, 0x1f, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x9f, + 0x1c, 0x3b, 0x07, 0xd2, 0x0c, 0x12, 0x43, 0x1a, + 0x4b, 0x1a, 0x6d, 0x1b, 0x60, 0x1a, 0x04, 0x12, + 0x0f, 0xd2, 0x4a, 0x18, 0x6f, 0xd2, 0x69, 0x12, + 0x4b, 0x16, 0x6d, 0xdb, 0x68, 0x1b, 0x0c, 0x1b, + 0x04, 0x1b, 0x04, 0x12, 0x0c, 0x12, 0x43, 0x1a, + 0x4b, 0x12, 0x6d, 0xdb, 0x60, 0x1a, 0x04, 0x12, + 0x0c, 0x12, 0x4a, 0x10, 0x6d, 0x12, 0x68, 0x12, + 0x23, 0x01, 0x02, 0x5b, 0x43, 0x1a, 0x4b, 0x0d, + 0x6d, 0x1b, 0x60, 0x1a, 0x05, 0x92, 0x4a, 0x0b, + 0x6d, 0x12, 0x68, 0x12, 0x4b, 0x09, 0x6e, 0xdb, + 0x60, 0x1a, 0x4a, 0x08, 0x6d, 0x92, 0x68, 0x12, + 0x4b, 0x06, 0x6f, 0x5b, 0x60, 0x1a, 0x4a, 0x05, + 0x6d, 0xd2, 0x68, 0x12, 0x4b, 0x03, 0x6f, 0x9b, + 0x60, 0x1a, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x1f, 0xc4, 0x2e, 0x08, 0x1f, 0x9c, + 0xb5, 0x90, 0x1c, 0x07, 0x1c, 0x0c, 0x2f, 0x22, + 0xd1, 0x07, 0x2c, 0x3f, 0xd8, 0x01, 0x2c, 0x01, + 0xd2, 0x03, 0x20, 0x38, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x01, 0x49, 0x13, 0x70, 0x08, + 0x23, 0x01, 0x03, 0xdb, 0x42, 0x9f, 0xd0, 0x02, + 0x4b, 0x11, 0x42, 0x9f, 0xd1, 0x04, 0x48, 0x11, + 0x60, 0x07, 0x20, 0x00, 0xe7, 0xee, 0xe0, 0x18, + 0x2f, 0xff, 0xd1, 0x0b, 0x21, 0x00, 0x43, 0xc9, + 0x20, 0x0d, 0xf0, 0x00, 0xf8, 0x1d, 0x48, 0x0c, + 0x68, 0x01, 0x48, 0x0c, 0x68, 0x00, 0xf0, 0x00, + 0xf8, 0x43, 0xe0, 0x07, 0x1c, 0x21, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x3e, 0x48, 0x07, 0x60, 0x07, + 0x48, 0x05, 0x60, 0x04, 0x20, 0x00, 0xe7, 0xd5, + 0xe7, 0xd4, 0xe7, 0xd3, 0x2e, 0x08, 0x9d, 0xe8, + 0x00, 0x00, 0x80, 0x0f, 0xcc, 0x00, 0x05, 0x00, + 0x2e, 0x08, 0x9d, 0xe4, 0x2e, 0x08, 0x20, 0x1c, + 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0x4b, 0x13, + 0x68, 0x5b, 0x1c, 0x18, 0x21, 0x00, 0x29, 0x02, + 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x4b, 0x06, 0x19, + 0x0e, 0x09, 0xe7, 0xf8, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc4, 0x29, 0x00, 0xd1, 0x01, 0x60, 0x27, + 0xe0, 0x05, 0x23, 0x01, 0x42, 0xda, 0xd0, 0x01, + 0x60, 0x22, 0xe0, 0x00, 0xe0, 0x09, 0x1d, 0x05, + 0x23, 0x05, 0x02, 0x1b, 0x42, 0x9d, 0xdb, 0x02, + 0x20, 0x01, 0x02, 0x80, 0xe0, 0x00, 0x30, 0x04, + 0xe7, 0xe4, 0x4b, 0x02, 0x60, 0x58, 0xbc, 0xb0, + 0x47, 0x70, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x00, + 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x05, 0x20, + 0x0d, 0x00, 0x23, 0xff, 0x33, 0x04, 0x42, 0x98, + 0xd0, 0x50, 0xdc, 0x18, 0x28, 0x10, 0xd0, 0x2d, + 0xdc, 0x08, 0x28, 0x01, 0xd0, 0x23, 0x28, 0x02, + 0xd0, 0x1e, 0x28, 0x04, 0xd0, 0x1f, 0x28, 0x08, + 0xd0, 0x1d, 0xe0, 0x76, 0x28, 0x12, 0xd0, 0x1d, + 0x28, 0x22, 0xd0, 0x3a, 0x23, 0xff, 0x33, 0x02, + 0x42, 0x98, 0xd0, 0x24, 0x23, 0xff, 0x33, 0x03, + 0x42, 0x98, 0xd0, 0x29, 0xe0, 0x69, 0x38, 0xff, + 0x38, 0x05, 0x28, 0x08, 0xd2, 0x65, 0xa3, 0x02, + 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x35, 0x3c, 0x41, 0x4f, 0x56, 0x4b, 0x5d, 0x46, + 0x20, 0x00, 0x49, 0x32, 0x63, 0x48, 0x48, 0x31, + 0x62, 0x04, 0xe0, 0x5c, 0x20, 0x01, 0x49, 0x2f, + 0x63, 0x48, 0xe0, 0x58, 0x20, 0x00, 0x49, 0x2e, + 0x67, 0x08, 0x21, 0x00, 0x43, 0xc9, 0x20, 0x10, + 0xf7, 0xff, 0xff, 0x92, 0xe0, 0x4f, 0x20, 0x01, + 0x49, 0x29, 0x67, 0x08, 0x21, 0x00, 0x43, 0xc9, + 0x20, 0x10, 0xf7, 0xff, 0xff, 0x89, 0xe0, 0x46, + 0x20, 0x02, 0x49, 0x25, 0x67, 0x08, 0x21, 0x00, + 0x43, 0xc9, 0x20, 0x10, 0xf7, 0xff, 0xff, 0x80, + 0xe0, 0x3d, 0x1c, 0x39, 0x20, 0x22, 0xf7, 0xff, + 0xff, 0x7b, 0xe0, 0x38, 0x48, 0x1e, 0x65, 0xc7, + 0x21, 0x01, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x74, + 0xe0, 0x31, 0x48, 0x1b, 0x65, 0xc7, 0x21, 0x02, + 0x20, 0x35, 0xf7, 0xff, 0xff, 0x6d, 0xe0, 0x2a, + 0x21, 0x00, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x68, + 0xe0, 0x25, 0x21, 0x03, 0x20, 0x35, 0xf7, 0xff, + 0xff, 0x63, 0xe0, 0x20, 0x21, 0x04, 0x20, 0x35, + 0xf7, 0xff, 0xff, 0x5e, 0xe0, 0x1b, 0x20, 0x00, + 0x49, 0x0f, 0x65, 0xc8, 0xe0, 0x17, 0x48, 0x0e, + 0x66, 0x07, 0x21, 0x01, 0x20, 0x36, 0xf7, 0xff, + 0xff, 0x53, 0xe0, 0x10, 0x48, 0x0a, 0x66, 0x07, + 0x21, 0x02, 0x20, 0x36, 0xf7, 0xff, 0xff, 0x4c, + 0xe0, 0x09, 0x20, 0x00, 0x49, 0x06, 0x66, 0x08, + 0xe0, 0x05, 0x1c, 0x20, 0x21, 0x00, 0x43, 0xc9, + 0xf7, 0xff, 0xff, 0x42, 0xe7, 0xff, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0f, 0x80, + 0xcc, 0x00, 0x05, 0x00, 0xb4, 0xb0, 0x1c, 0x04, + 0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x38, 0x0e, 0x00, + 0x06, 0x19, 0x0e, 0x09, 0x29, 0x01, 0xd0, 0x08, + 0x22, 0x00, 0x4d, 0x09, 0x60, 0x2a, 0x22, 0x00, + 0x43, 0xd2, 0x4d, 0x08, 0x68, 0x2d, 0x60, 0x2a, + 0xe0, 0x08, 0x4a, 0x07, 0x68, 0x12, 0x60, 0x14, + 0x4a, 0x04, 0x68, 0x12, 0x60, 0x10, 0x22, 0x01, + 0x4d, 0x01, 0x60, 0x2a, 0xbc, 0xb0, 0x47, 0x70, + 0xcc, 0x00, 0x0d, 0x00, 0x2e, 0x08, 0x9d, 0xdc, + 0x2e, 0x08, 0x9d, 0xd8, 0xb5, 0xf3, 0xb0, 0x81, + 0x99, 0x02, 0x06, 0x08, 0x16, 0x00, 0x90, 0x00, + 0xb0, 0x85, 0x20, 0x00, 0x90, 0x01, 0x9c, 0x06, + 0x1d, 0xe6, 0x36, 0x05, 0xcc, 0x20, 0x07, 0xa8, + 0x0f, 0x80, 0x06, 0x00, 0x16, 0x00, 0x90, 0x00, + 0x08, 0xad, 0x3d, 0x03, 0xcc, 0x80, 0x08, 0xb8, + 0x00, 0x80, 0x19, 0x86, 0xcc, 0x02, 0x91, 0x04, + 0x99, 0x04, 0x08, 0x89, 0x91, 0x04, 0x20, 0x03, + 0x05, 0x80, 0x21, 0x35, 0x06, 0x49, 0x60, 0x08, + 0x48, 0x46, 0x68, 0x01, 0x08, 0x89, 0x00, 0x89, + 0x60, 0x01, 0x48, 0x45, 0x90, 0x03, 0x20, 0x00, + 0x90, 0x02, 0x98, 0x02, 0x42, 0xa8, 0xd3, 0x04, + 0xe0, 0x08, 0x98, 0x02, 0x30, 0x01, 0x90, 0x02, + 0xe7, 0xf7, 0xcc, 0x02, 0x98, 0x03, 0xc0, 0x02, + 0x90, 0x03, 0xe7, 0xf6, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x03, 0xcc, 0x02, 0x98, 0x03, 0xc0, 0x02, + 0x90, 0x03, 0x20, 0x00, 0x49, 0x39, 0x65, 0x88, + 0x9f, 0x04, 0x2f, 0x00, 0xd8, 0x02, 0xe0, 0x05, + 0x3f, 0x01, 0xe7, 0xfa, 0xce, 0x02, 0x48, 0x35, + 0x64, 0x81, 0xe7, 0xf9, 0x20, 0x00, 0x49, 0x34, + 0x60, 0x48, 0x20, 0x00, 0x21, 0x35, 0x06, 0x49, + 0x60, 0x08, 0x20, 0x00, 0x49, 0x2f, 0x66, 0x88, + 0x20, 0x00, 0x21, 0x35, 0x06, 0x49, 0x61, 0x88, + 0x20, 0x01, 0x49, 0x2c, 0x64, 0xc8, 0x48, 0x2c, + 0x68, 0x40, 0x28, 0x00, 0xd1, 0x0e, 0x27, 0x00, + 0x2f, 0x64, 0xd3, 0x02, 0xe0, 0x02, 0x37, 0x01, + 0xe7, 0xfa, 0xe7, 0xfc, 0x98, 0x01, 0x1c, 0x41, + 0x91, 0x01, 0x4b, 0x26, 0x42, 0x98, 0xdb, 0x00, + 0xe0, 0x00, 0xe7, 0xec, 0x48, 0x24, 0x68, 0x01, + 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x48, 0x23, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x21, + 0x68, 0x40, 0x28, 0x00, 0xd1, 0x0b, 0x48, 0x20, + 0x68, 0x40, 0x4b, 0x19, 0x18, 0xc0, 0x49, 0x1d, + 0x60, 0x08, 0x48, 0x1d, 0x68, 0x80, 0x4b, 0x16, + 0x18, 0xc0, 0x49, 0x1a, 0x60, 0x48, 0x48, 0x19, + 0x68, 0x00, 0x21, 0x33, 0x06, 0x49, 0x65, 0x48, + 0x48, 0x16, 0x68, 0x40, 0x21, 0x33, 0x06, 0x49, + 0x65, 0x88, 0x48, 0x14, 0x68, 0x40, 0x21, 0x33, + 0x06, 0x49, 0x66, 0x88, 0x48, 0x11, 0x68, 0x00, + 0x21, 0x33, 0x06, 0x49, 0x66, 0x48, 0x20, 0x03, + 0x21, 0x33, 0x06, 0x49, 0x67, 0x08, 0x20, 0x00, + 0x49, 0x0e, 0x68, 0x09, 0x70, 0x08, 0x21, 0x00, + 0x20, 0x0d, 0xf7, 0xff, 0xfe, 0x2d, 0xb0, 0x05, + 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x66, 0x00, 0x00, 0x70, + 0xcc, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x80, + 0xcc, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x27, 0x10, + 0x6a, 0x00, 0x00, 0x10, 0x2e, 0x08, 0xb9, 0x88, + 0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0xd2, 0x10, + 0x1c, 0x01, 0xb0, 0x81, 0x48, 0x27, 0x22, 0x00, + 0x92, 0x00, 0x9a, 0x00, 0x2a, 0x16, 0xdb, 0x04, + 0xe0, 0x09, 0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, + 0xe7, 0xf7, 0x68, 0x02, 0x9b, 0x00, 0x00, 0x9b, + 0x50, 0xca, 0x30, 0x04, 0xe7, 0xf5, 0x48, 0x20, + 0x22, 0x00, 0x92, 0x00, 0x9a, 0x00, 0x2a, 0x0b, + 0xdb, 0x04, 0xe0, 0x0a, 0x9a, 0x00, 0x32, 0x01, + 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x03, 0x9a, 0x00, + 0x00, 0x92, 0x18, 0x52, 0x65, 0x93, 0x30, 0x04, + 0xe7, 0xf4, 0x48, 0x18, 0x22, 0x00, 0x92, 0x00, + 0x9a, 0x00, 0x2a, 0x11, 0xdb, 0x04, 0xe0, 0x0b, + 0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, + 0x68, 0x03, 0x9a, 0x00, 0x00, 0x92, 0x18, 0x52, + 0x32, 0x80, 0x60, 0x53, 0x30, 0x04, 0xe7, 0xf3, + 0x48, 0x0f, 0x22, 0x02, 0x92, 0x00, 0x9a, 0x00, + 0x2a, 0x05, 0xdb, 0x04, 0xe0, 0x0b, 0x9a, 0x00, + 0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x02, + 0x9b, 0x00, 0x00, 0x9b, 0x18, 0x5b, 0x33, 0x80, + 0x60, 0x5a, 0x30, 0x04, 0xe7, 0xf3, 0x4a, 0x07, + 0x6c, 0x12, 0x1d, 0xcb, 0x33, 0x79, 0x61, 0xda, + 0xb0, 0x01, 0x47, 0x70, 0xcc, 0x00, 0x05, 0x20, + 0xcc, 0x00, 0x0c, 0x00, 0xcc, 0x00, 0x0c, 0x5c, + 0xcc, 0x00, 0x0c, 0xa0, 0xcc, 0x00, 0x0c, 0x80, + 0xb4, 0xf0, 0x1c, 0x06, 0x1c, 0x0f, 0x1c, 0x14, + 0x1c, 0x1d, 0x06, 0x29, 0x0e, 0x09, 0x2c, 0x1f, + 0xdb, 0x02, 0x20, 0xaf, 0xbc, 0xf0, 0x47, 0x70, + 0x4b, 0x0b, 0x40, 0x1f, 0x48, 0x0b, 0x68, 0x00, + 0x60, 0x06, 0x29, 0x01, 0xd1, 0x07, 0x48, 0x0a, + 0x68, 0x02, 0x43, 0x3a, 0x60, 0x02, 0x20, 0x80, + 0x6e, 0x00, 0x60, 0x04, 0xe0, 0x05, 0x29, 0x02, + 0xd1, 0x03, 0x48, 0x05, 0x68, 0x02, 0x43, 0xba, + 0x60, 0x02, 0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5, + 0xff, 0xff, 0xf8, 0xff, 0x2e, 0x08, 0x9d, 0xe0, + 0xcc, 0x00, 0x02, 0x20, 0xb5, 0xf3, 0xb0, 0x81, + 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, + 0x99, 0x02, 0x06, 0x0e, 0x0e, 0x36, 0x48, 0x1a, + 0x6f, 0x00, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x0d, + 0x20, 0x33, 0x06, 0x40, 0x6d, 0x80, 0x21, 0x33, + 0x06, 0x49, 0x6d, 0x49, 0x1a, 0x41, 0x48, 0x14, + 0x6d, 0xc0, 0x4a, 0x13, 0x6d, 0x92, 0x1a, 0x80, + 0x18, 0x0d, 0xe0, 0x06, 0x20, 0x33, 0x06, 0x40, + 0x6d, 0x80, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x49, + 0x1a, 0x45, 0x98, 0x00, 0x43, 0x68, 0x1c, 0x01, + 0x20, 0x64, 0xf0, 0x07, 0xfb, 0x43, 0x1c, 0x04, + 0x43, 0x6e, 0x1c, 0x31, 0x20, 0x64, 0xf0, 0x07, + 0xfb, 0x3d, 0x1c, 0x07, 0x08, 0xa4, 0x00, 0xa4, + 0x08, 0xbf, 0x00, 0xbf, 0x48, 0x05, 0x64, 0x84, + 0x48, 0x04, 0x64, 0xc7, 0xb0, 0x01, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x0c, 0x80, + 0xb5, 0xf7, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, + 0xb0, 0x82, 0x27, 0x00, 0x2d, 0x1f, 0xdb, 0x05, + 0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2f, 0x00, 0xd1, 0x0d, + 0x48, 0x19, 0x69, 0x80, 0x28, 0x00, 0xd0, 0x00, + 0xe7, 0xfa, 0x20, 0x02, 0x49, 0x16, 0x61, 0x88, + 0x48, 0x15, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x00, + 0x27, 0xff, 0xe7, 0xef, 0x4c, 0x13, 0x94, 0x00, + 0x20, 0x01, 0x02, 0x40, 0x90, 0x01, 0x22, 0x00, + 0x99, 0x03, 0xb4, 0x06, 0x06, 0x2b, 0x16, 0x1b, + 0x9a, 0x03, 0x99, 0x04, 0x1c, 0x20, 0xf0, 0x01, + 0xff, 0x75, 0xb0, 0x02, 0x1c, 0x06, 0x2e, 0xd2, + 0xd1, 0x06, 0x20, 0x00, 0x49, 0x08, 0x61, 0x88, + 0x20, 0xd2, 0xb0, 0x02, 0xe7, 0xd2, 0xe0, 0x08, + 0x20, 0x00, 0x99, 0x00, 0x60, 0x08, 0x20, 0x00, + 0x49, 0x03, 0x61, 0x88, 0x20, 0x00, 0xb0, 0x02, + 0xe7, 0xc8, 0xb0, 0x02, 0xe7, 0xc6, 0x00, 0x00, + 0xcc, 0x00, 0x0f, 0x80, 0xcc, 0x00, 0x06, 0x00, + 0xb5, 0xff, 0x9f, 0x09, 0xb0, 0x81, 0x9b, 0x01, + 0x06, 0x18, 0x0e, 0x00, 0x9b, 0x02, 0x06, 0x19, + 0x0e, 0x09, 0x9b, 0x03, 0x06, 0x1b, 0x0e, 0x1b, + 0x93, 0x00, 0x9b, 0x04, 0x06, 0x1a, 0x0e, 0x12, + 0x06, 0x3d, 0x0e, 0x2d, 0x2d, 0x01, 0xd1, 0x07, + 0x4c, 0x1c, 0x68, 0x26, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x23, 0xe0, 0x07, + 0x2d, 0x02, 0xd1, 0x05, 0x4c, 0x17, 0x68, 0x26, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x33, 0x60, 0x23, + 0x28, 0x00, 0xd1, 0x03, 0x23, 0x00, 0x4c, 0x14, + 0x61, 0xe3, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02, + 0x23, 0x01, 0x4c, 0x11, 0x61, 0xe3, 0x29, 0x00, + 0xd1, 0x03, 0x23, 0x00, 0x4c, 0x0e, 0x65, 0xa3, + 0xe0, 0x04, 0x29, 0x01, 0xd1, 0x02, 0x23, 0x01, + 0x4c, 0x0b, 0x65, 0xa3, 0x2a, 0x00, 0xd1, 0x03, + 0x23, 0x02, 0x4c, 0x09, 0x66, 0xe3, 0xe0, 0x04, + 0x2a, 0x01, 0xd1, 0x02, 0x23, 0x03, 0x4c, 0x06, + 0x66, 0xe3, 0x9b, 0x00, 0x4c, 0x04, 0x67, 0x23, + 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xcc, 0x00, 0x02, 0x20, + 0xcc, 0x00, 0x0f, 0x80, 0xb5, 0xf0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2e, 0x0e, 0x36, + 0xb0, 0x84, 0x48, 0x15, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x04, 0x20, 0x39, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x01, 0xd1, 0x0a, + 0x94, 0x00, 0x97, 0x01, 0x48, 0x0f, 0x90, 0x02, + 0x48, 0x0f, 0x90, 0x03, 0x46, 0x68, 0x21, 0x01, + 0xf0, 0x00, 0xfd, 0x1a, 0xe0, 0x0f, 0x20, 0x00, + 0x90, 0x00, 0x20, 0x00, 0x90, 0x01, 0x48, 0x09, + 0x90, 0x02, 0x48, 0x09, 0x90, 0x03, 0x46, 0x68, + 0x21, 0x01, 0xf0, 0x00, 0xfd, 0x0d, 0x21, 0x00, + 0x20, 0x02, 0xf7, 0xff, 0xfc, 0x85, 0x20, 0x00, + 0xb0, 0x04, 0xe7, 0xdc, 0xb0, 0x04, 0xe7, 0xda, + 0x2e, 0x08, 0xba, 0x28, 0x00, 0x00, 0x02, 0xcf, + 0x00, 0x00, 0x02, 0x3f, 0xb4, 0xb0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x48, 0x14, 0x6c, 0x00, + 0x1c, 0x01, 0x48, 0x13, 0x6f, 0x80, 0x23, 0x09, + 0x01, 0x9b, 0x42, 0x98, 0xd1, 0x12, 0x20, 0x02, + 0x40, 0x20, 0xd0, 0x0c, 0x2d, 0x02, 0xd1, 0x0a, + 0x2f, 0x03, 0xd1, 0x00, 0x31, 0x04, 0x2f, 0x03, + 0xd2, 0x05, 0x07, 0xe0, 0x0f, 0xc0, 0xd0, 0x01, + 0x31, 0x05, 0xe0, 0x00, 0x31, 0x08, 0x2d, 0x02, + 0xd9, 0x00, 0x21, 0x12, 0x00, 0x48, 0x18, 0x40, + 0x30, 0x01, 0x10, 0x40, 0x21, 0x2d, 0x02, 0x09, + 0x43, 0x41, 0x48, 0x03, 0x69, 0x40, 0x18, 0x09, + 0x1c, 0x08, 0xbc, 0xb0, 0x47, 0x70, 0xe7, 0xfc, + 0xcc, 0x00, 0x0f, 0x80, 0x48, 0x07, 0x6a, 0xc0, + 0x1c, 0x01, 0x00, 0x48, 0x18, 0x40, 0x30, 0x01, + 0x10, 0x40, 0x21, 0x2d, 0x02, 0x09, 0x43, 0x41, + 0x48, 0x03, 0x69, 0x40, 0x18, 0x09, 0x1c, 0x08, + 0x47, 0x70, 0xe7, 0xfd, 0xcc, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x0f, 0x80, 0x48, 0x07, 0x68, 0x80, + 0x28, 0x00, 0xd1, 0x03, 0x48, 0x06, 0x69, 0x00, + 0x1c, 0x01, 0xe0, 0x02, 0x48, 0x04, 0x68, 0xc0, + 0x1c, 0x01, 0x4b, 0x02, 0x18, 0xc9, 0x1c, 0x08, + 0x47, 0x70, 0xe7, 0xfd, 0xcc, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x0f, 0x80, 0xb5, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0x48, 0x06, 0x6c, 0x40, 0x60, 0x20, + 0x48, 0x04, 0x6c, 0x80, 0x60, 0x38, 0xf7, 0xff, + 0xff, 0xe1, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xe7, 0xfb, 0x00, 0x00, 0xcc, 0x00, 0x02, 0x00, + 0xb5, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, + 0xf7, 0xff, 0xff, 0xd4, 0x1c, 0x06, 0x2d, 0x00, + 0xd0, 0x01, 0x2c, 0x00, 0xd1, 0x03, 0x20, 0x3a, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x08, 0x78, + 0x00, 0x40, 0xd0, 0x01, 0x20, 0x3a, 0xe7, 0xf7, + 0x20, 0x00, 0x49, 0x0d, 0x66, 0x88, 0x48, 0x0d, + 0x68, 0x01, 0x23, 0x12, 0x43, 0x19, 0x60, 0x01, + 0x48, 0x0b, 0x63, 0x45, 0x48, 0x0a, 0x63, 0x84, + 0x20, 0x01, 0x49, 0x09, 0x62, 0x48, 0x48, 0x09, + 0x68, 0x01, 0x23, 0x01, 0x40, 0x59, 0x60, 0x01, + 0x48, 0x05, 0x63, 0xc7, 0x48, 0x02, 0x60, 0x46, + 0x20, 0x00, 0xe7, 0xdd, 0xe7, 0xdc, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x48, + 0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x00, 0x08, + 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0x1c, 0x16, + 0x1c, 0x1d, 0x48, 0x10, 0x6a, 0x00, 0x28, 0x10, + 0xd0, 0x02, 0x20, 0x3b, 0xbc, 0xf0, 0x47, 0x70, + 0x48, 0x0d, 0x68, 0x00, 0x60, 0x38, 0x68, 0x38, + 0x4b, 0x0b, 0x18, 0xc0, 0x60, 0x38, 0x48, 0x0b, + 0x6b, 0x40, 0x60, 0x30, 0x48, 0x09, 0x6b, 0x80, + 0x60, 0x28, 0x48, 0x09, 0x6c, 0x80, 0x23, 0x10, + 0x40, 0x18, 0xd0, 0x02, 0x20, 0x02, 0x60, 0x20, + 0xe0, 0x01, 0x20, 0x01, 0x60, 0x20, 0x20, 0x00, + 0xe7, 0xe4, 0xe7, 0xe3, 0xcc, 0x00, 0x05, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x80, + 0xcc, 0x00, 0x0f, 0x00, 0xb4, 0xf0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2a, 0x0e, 0x12, + 0x06, 0x21, 0x0e, 0x09, 0x2f, 0x00, 0xd1, 0x30, + 0xb0, 0x81, 0x46, 0x6f, 0x2a, 0x00, 0xd0, 0x06, + 0x2a, 0x08, 0xd0, 0x0d, 0x2a, 0x10, 0xd0, 0x14, + 0x2a, 0x18, 0xd0, 0x1b, 0xe0, 0x23, 0x20, 0x00, + 0x70, 0x38, 0x20, 0x00, 0x70, 0x78, 0x20, 0x0c, + 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 0xe0, 0x1b, + 0x20, 0x00, 0x70, 0x38, 0x20, 0x08, 0x70, 0x78, + 0x20, 0x1c, 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, + 0xe0, 0x12, 0x20, 0x00, 0x70, 0x38, 0x20, 0x10, + 0x70, 0x78, 0x20, 0x0c, 0x70, 0xb8, 0x20, 0x00, + 0x70, 0xf8, 0xe0, 0x09, 0x20, 0x00, 0x70, 0x38, + 0x20, 0x18, 0x70, 0x78, 0x20, 0x1c, 0x70, 0xb8, + 0x20, 0x00, 0x70, 0xf8, 0xe0, 0x00, 0xe7, 0xff, + 0xb0, 0x01, 0x23, 0x00, 0x56, 0xf8, 0x23, 0x39, + 0x06, 0x5b, 0x60, 0x18, 0x23, 0x01, 0x56, 0xf8, + 0x23, 0x39, 0x06, 0x5b, 0x61, 0xd8, 0x29, 0x00, + 0xd1, 0x06, 0x48, 0x0e, 0x68, 0x06, 0x23, 0x20, + 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x03, 0xe0, 0x06, + 0x29, 0x20, 0xd1, 0x04, 0x48, 0x09, 0x68, 0x06, + 0x23, 0x20, 0x43, 0x33, 0x60, 0x03, 0x23, 0x02, + 0x56, 0xf8, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x58, + 0x23, 0x03, 0x56, 0xf8, 0x4b, 0x04, 0x63, 0x18, + 0x20, 0x00, 0x23, 0x39, 0x06, 0x5b, 0x64, 0x98, + 0xbc, 0xf0, 0x47, 0x70, 0x72, 0x00, 0x00, 0x1c, + 0x72, 0x00, 0x01, 0x00, 0xb4, 0xb0, 0x1c, 0x07, + 0x1c, 0x0d, 0x1c, 0x14, 0x06, 0x29, 0x0e, 0x09, + 0x06, 0x22, 0x0e, 0x12, 0xb0, 0x84, 0x29, 0x33, + 0xdc, 0x01, 0x2a, 0x0f, 0xdd, 0x03, 0x20, 0xff, + 0xb0, 0x04, 0xbc, 0xb0, 0x47, 0x70, 0x20, 0x39, + 0x06, 0x40, 0x63, 0x41, 0x20, 0x10, 0x43, 0x10, + 0x23, 0x39, 0x06, 0x5b, 0x63, 0x98, 0x20, 0x39, + 0x06, 0x40, 0x68, 0x00, 0x90, 0x03, 0x98, 0x03, + 0x23, 0x9c, 0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, + 0x20, 0x39, 0x06, 0x40, 0x68, 0x40, 0x90, 0x01, + 0x98, 0x01, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, + 0x90, 0x01, 0x06, 0x38, 0x0e, 0x00, 0xd0, 0x29, + 0x20, 0x10, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, + 0x23, 0x80, 0x43, 0x18, 0x90, 0x03, 0x20, 0x08, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 0x23, 0x10, + 0x43, 0x18, 0x90, 0x03, 0x20, 0x04, 0x40, 0x38, + 0xd0, 0x04, 0x98, 0x03, 0x23, 0x08, 0x43, 0x18, + 0x90, 0x03, 0xe0, 0x0c, 0x20, 0x02, 0x40, 0x38, + 0xd0, 0x04, 0x98, 0x03, 0x23, 0x0c, 0x43, 0x18, + 0x90, 0x03, 0xe0, 0x04, 0x98, 0x03, 0x23, 0x0c, + 0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, 0x20, 0x20, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x20, + 0x43, 0x18, 0x90, 0x01, 0x98, 0x03, 0x23, 0x39, + 0x06, 0x5b, 0x60, 0x18, 0x98, 0x01, 0x23, 0x39, + 0x06, 0x5b, 0x60, 0x58, 0x20, 0x39, 0x06, 0x40, + 0x6a, 0x00, 0x90, 0x00, 0x98, 0x00, 0x23, 0xf0, + 0x43, 0xdb, 0x43, 0x18, 0x90, 0x00, 0x20, 0xff, + 0x02, 0x00, 0x40, 0x38, 0xd0, 0x27, 0x20, 0xff, + 0x30, 0x01, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xfe, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, + 0x02, 0x40, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xfd, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, + 0x02, 0x80, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xfb, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, + 0x02, 0xc0, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xf7, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, + 0x03, 0x00, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xf0, 0x40, 0x18, 0x90, 0x00, 0x98, 0x00, + 0x23, 0x39, 0x06, 0x5b, 0x62, 0x18, 0x20, 0x39, + 0x06, 0x40, 0x69, 0xc0, 0x90, 0x02, 0x98, 0x02, + 0x08, 0x40, 0x00, 0x40, 0x90, 0x02, 0x20, 0x39, + 0x06, 0x40, 0x6a, 0xc0, 0x90, 0x00, 0x98, 0x00, + 0x23, 0x1c, 0x43, 0xdb, 0x40, 0x18, 0x90, 0x00, + 0x20, 0x39, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x03, + 0x98, 0x03, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, + 0x90, 0x03, 0x20, 0x39, 0x06, 0x40, 0x6b, 0xc0, + 0x90, 0x01, 0x98, 0x01, 0x09, 0x00, 0x01, 0x00, + 0x90, 0x01, 0x48, 0x4a, 0x40, 0x38, 0xd0, 0x45, + 0x20, 0x01, 0x04, 0x00, 0x40, 0x38, 0xd0, 0x03, + 0x98, 0x02, 0x23, 0x01, 0x43, 0x18, 0x90, 0x02, + 0x20, 0x01, 0x05, 0xc0, 0x40, 0x38, 0xd0, 0x03, + 0x98, 0x00, 0x23, 0x10, 0x43, 0x18, 0x90, 0x00, + 0x20, 0x07, 0x04, 0x40, 0x40, 0x38, 0x23, 0x01, + 0x04, 0x5b, 0x42, 0x98, 0xd0, 0x08, 0x23, 0x01, + 0x04, 0x9b, 0x42, 0x98, 0xd0, 0x07, 0x23, 0x01, + 0x04, 0xdb, 0x42, 0x98, 0xd0, 0x08, 0xe0, 0x0c, + 0x98, 0x00, 0x90, 0x00, 0xe0, 0x0a, 0x98, 0x00, + 0x23, 0x04, 0x43, 0x18, 0x90, 0x00, 0xe0, 0x05, + 0x98, 0x00, 0x23, 0x0c, 0x43, 0x18, 0x90, 0x00, + 0xe0, 0x00, 0xe7, 0xff, 0x20, 0x01, 0x05, 0x80, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 0x23, 0x10, + 0x43, 0x18, 0x90, 0x03, 0x20, 0x01, 0x05, 0x00, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x08, + 0x43, 0x18, 0x90, 0x01, 0x20, 0x01, 0x05, 0x40, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x07, + 0x43, 0x18, 0x90, 0x01, 0x98, 0x03, 0x23, 0x39, + 0x06, 0x5b, 0x63, 0x98, 0x98, 0x02, 0x23, 0x39, + 0x06, 0x5b, 0x61, 0xd8, 0x98, 0x01, 0x23, 0x39, + 0x06, 0x5b, 0x63, 0xd8, 0x98, 0x00, 0x23, 0x39, + 0x06, 0x5b, 0x62, 0xd8, 0x20, 0x39, 0x06, 0x40, + 0x68, 0x80, 0x90, 0x03, 0x98, 0x03, 0x08, 0x80, + 0x00, 0x80, 0x90, 0x03, 0x0f, 0x38, 0x07, 0x00, + 0xd0, 0x26, 0x20, 0x01, 0x07, 0x00, 0x40, 0x38, + 0x23, 0x01, 0x07, 0x1b, 0x42, 0x98, 0xd1, 0x04, + 0x98, 0x03, 0x23, 0x02, 0x43, 0x18, 0x90, 0x03, + 0xe0, 0x07, 0x20, 0x00, 0x42, 0x80, 0xd1, 0x04, + 0x98, 0x03, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, + 0x90, 0x03, 0x20, 0x01, 0x07, 0x40, 0x40, 0x38, + 0x23, 0x01, 0x07, 0x5b, 0x42, 0x98, 0xd1, 0x04, + 0x98, 0x03, 0x23, 0x01, 0x43, 0x18, 0x90, 0x03, + 0xe0, 0x06, 0x20, 0x00, 0x42, 0x80, 0xd1, 0x03, + 0x98, 0x03, 0x08, 0x40, 0x00, 0x40, 0x90, 0x03, + 0x98, 0x03, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x98, + 0x20, 0x00, 0xb0, 0x04, 0xe6, 0xc1, 0xb0, 0x04, + 0xe6, 0xbf, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, + 0x48, 0x02, 0x69, 0xc0, 0x06, 0x00, 0x16, 0x00, + 0x47, 0x70, 0xe7, 0xfd, 0x72, 0x00, 0x01, 0x00, + 0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x23, + 0x16, 0x18, 0x06, 0x3b, 0x16, 0x19, 0x9b, 0x02, + 0x06, 0x1a, 0x0e, 0x12, 0x2a, 0x00, 0xd1, 0x0b, + 0x23, 0x39, 0x06, 0x5b, 0x60, 0xd8, 0x23, 0x39, + 0x06, 0x5b, 0x61, 0x19, 0x4d, 0x0b, 0x68, 0x2e, + 0x23, 0x01, 0x43, 0x33, 0x60, 0x2b, 0xe0, 0x0c, + 0x2a, 0x01, 0xd1, 0x0a, 0x23, 0x39, 0x06, 0x5b, + 0x61, 0x58, 0x23, 0x39, 0x06, 0x5b, 0x61, 0x99, + 0x4d, 0x04, 0x68, 0x2e, 0x23, 0x02, 0x43, 0x33, + 0x60, 0x2b, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x72, 0x00, 0x00, 0x08, + 0xb4, 0x90, 0x1c, 0x01, 0x20, 0x92, 0x4b, 0x4b, + 0x60, 0x18, 0x20, 0x92, 0x4b, 0x4a, 0x60, 0x18, + 0x20, 0x10, 0x4b, 0x4a, 0x60, 0x18, 0x20, 0x00, + 0x4b, 0x48, 0x60, 0x58, 0x48, 0x48, 0x4b, 0x47, + 0x60, 0x98, 0x22, 0x00, 0x2a, 0x10, 0xdb, 0x02, + 0xe0, 0x07, 0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, + 0x43, 0xc0, 0x00, 0x93, 0x4c, 0x42, 0x50, 0xe0, + 0xe7, 0xf7, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x93, + 0x4c, 0x3f, 0x50, 0xe0, 0x22, 0x00, 0x2a, 0x08, + 0xdb, 0x02, 0xe0, 0x08, 0x32, 0x01, 0xe7, 0xfa, + 0x20, 0x00, 0x43, 0xc0, 0x00, 0x94, 0x4b, 0x3b, + 0x18, 0xe3, 0x64, 0x18, 0xe7, 0xf6, 0x22, 0x00, + 0x2a, 0x20, 0xdb, 0x02, 0xe0, 0x08, 0x32, 0x01, + 0xe7, 0xfa, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x94, + 0x4b, 0x35, 0x18, 0xe3, 0x60, 0x18, 0xe7, 0xf6, + 0x22, 0x00, 0x2a, 0x19, 0xdb, 0x02, 0xe0, 0x06, + 0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, 0x00, 0x93, + 0x4c, 0x30, 0x50, 0xe0, 0xe7, 0xf8, 0x20, 0x00, + 0x4b, 0x2f, 0x60, 0x18, 0x20, 0x39, 0x06, 0x40, + 0x69, 0xc0, 0x27, 0x18, 0x40, 0x07, 0x2f, 0x00, + 0xd0, 0x03, 0x48, 0x2c, 0x4b, 0x2c, 0x60, 0x18, + 0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, 0x4b, 0x2a, + 0x60, 0x18, 0x20, 0x00, 0x4b, 0x29, 0x60, 0x18, + 0x20, 0x00, 0x4b, 0x28, 0x60, 0x58, 0x48, 0x28, + 0x4b, 0x26, 0x60, 0x98, 0x48, 0x24, 0x68, 0x00, + 0x4b, 0x24, 0x60, 0xd8, 0x48, 0x25, 0x60, 0x01, + 0x20, 0x0d, 0x06, 0xc0, 0x61, 0xc1, 0x20, 0x05, + 0x02, 0x00, 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x18, + 0x48, 0x21, 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x58, + 0x48, 0x1f, 0x4b, 0x16, 0x63, 0x98, 0x20, 0x00, + 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x98, 0x20, 0x00, + 0x23, 0x0d, 0x06, 0xdb, 0x61, 0x18, 0x48, 0x1b, + 0x23, 0x0d, 0x06, 0xdb, 0x61, 0x98, 0x20, 0x01, + 0x23, 0x0d, 0x06, 0xdb, 0x60, 0xd8, 0x48, 0x18, + 0x23, 0x0d, 0x06, 0xdb, 0x63, 0x18, 0x48, 0x17, + 0x23, 0x0d, 0x06, 0xdb, 0x63, 0x58, 0x20, 0x00, + 0x4b, 0x15, 0x60, 0x18, 0x48, 0x11, 0x4b, 0x15, + 0x60, 0x18, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70, + 0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0xba, 0x30, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xbb, 0x00, + 0x2e, 0x08, 0xba, 0x38, 0x68, 0x00, 0x0d, 0x00, + 0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0xb9, 0xc4, + 0x2e, 0x08, 0xba, 0x28, 0x00, 0x00, 0x02, 0x3f, + 0x2e, 0x08, 0x9d, 0xec, 0x2e, 0x08, 0xbb, 0x0c, + 0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0x9d, 0xf0, + 0x00, 0xf0, 0x29, 0x6d, 0x3f, 0xff, 0xff, 0xff, + 0x00, 0x80, 0x10, 0x80, 0x00, 0x80, 0xeb, 0x80, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0x9b, 0xb8, + 0xb5, 0xff, 0xb0, 0x85, 0x20, 0x39, 0x06, 0x40, + 0x69, 0xc0, 0x23, 0x18, 0x40, 0x18, 0x90, 0x00, + 0x98, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x5a, + 0x4b, 0x5a, 0x60, 0x18, 0xe0, 0x03, 0x20, 0xff, + 0x30, 0xe0, 0x4b, 0x58, 0x60, 0x18, 0x9c, 0x06, + 0x9f, 0x07, 0x22, 0x00, 0x21, 0x00, 0x98, 0x05, + 0x38, 0x0c, 0x28, 0x06, 0xd2, 0x0c, 0xa3, 0x02, + 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x04, 0x03, 0x06, 0x04, 0x03, 0x06, 0x32, 0x01, + 0x32, 0x01, 0xe0, 0x02, 0x3a, 0x01, 0xe0, 0x00, + 0xe7, 0xff, 0x98, 0x05, 0x38, 0x0b, 0x28, 0x08, + 0xd2, 0x15, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x0a, 0x04, 0x04, 0x04, + 0x0a, 0x0a, 0x0a, 0x04, 0x25, 0x2d, 0x01, 0x2d, + 0x48, 0x44, 0x68, 0x00, 0x1c, 0x46, 0xe0, 0x0e, + 0x48, 0x43, 0x6c, 0x40, 0x1c, 0x05, 0x48, 0x43, + 0x68, 0x40, 0x1c, 0x06, 0xe0, 0x07, 0x21, 0xff, + 0x1c, 0x08, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 0x2d, 0x00, + 0xd0, 0x01, 0x2e, 0x00, 0xd1, 0x04, 0x25, 0x2d, + 0x01, 0x2d, 0x48, 0x38, 0x68, 0x00, 0x1c, 0x46, + 0x29, 0xff, 0xd1, 0x02, 0x1c, 0x08, 0xb0, 0x05, + 0xe7, 0xec, 0x1e, 0x68, 0x90, 0x02, 0x1e, 0x70, + 0x90, 0x01, 0x23, 0x01, 0x42, 0xda, 0xd1, 0x08, + 0x42, 0x50, 0x40, 0x85, 0x1c, 0x2b, 0x1e, 0x5d, + 0x42, 0x50, 0x40, 0x86, 0x1c, 0x33, 0x1e, 0x5e, + 0xe0, 0x05, 0x41, 0x15, 0x1c, 0x28, 0x1e, 0x45, + 0x41, 0x16, 0x1c, 0x30, 0x1e, 0x46, 0x07, 0xe0, + 0x0f, 0xc0, 0xd0, 0x02, 0x21, 0x80, 0x08, 0x64, + 0x00, 0x64, 0x07, 0xf8, 0x0f, 0xc0, 0xd0, 0x02, + 0x21, 0x80, 0x08, 0x7f, 0x00, 0x7f, 0x19, 0x60, + 0x90, 0x04, 0x19, 0xb8, 0x90, 0x03, 0x2c, 0x00, + 0xda, 0x01, 0x21, 0x80, 0x24, 0x00, 0x98, 0x04, + 0x28, 0x01, 0xda, 0x02, 0x21, 0x80, 0x20, 0x01, + 0x90, 0x04, 0x4b, 0x1f, 0x42, 0x9c, 0xdb, 0x01, + 0x21, 0x80, 0x4c, 0x1e, 0x98, 0x04, 0x4b, 0x1c, + 0x42, 0x98, 0xdd, 0x02, 0x21, 0x80, 0x48, 0x1a, + 0x90, 0x04, 0x2f, 0x00, 0xda, 0x01, 0x21, 0x80, + 0x27, 0x00, 0x98, 0x03, 0x28, 0x01, 0xda, 0x02, + 0x21, 0x80, 0x20, 0x01, 0x90, 0x03, 0x48, 0x11, + 0x68, 0x00, 0x42, 0x87, 0xd3, 0x03, 0x21, 0x80, + 0x48, 0x0e, 0x68, 0x00, 0x1e, 0x47, 0x98, 0x03, + 0x4b, 0x0c, 0x68, 0x1b, 0x42, 0x98, 0xd9, 0x03, + 0x21, 0x80, 0x48, 0x0a, 0x68, 0x00, 0x90, 0x03, + 0x9b, 0x08, 0x60, 0x1c, 0x9b, 0x08, 0x60, 0x5f, + 0x98, 0x04, 0x9b, 0x08, 0x60, 0x98, 0x98, 0x03, + 0x9b, 0x08, 0x60, 0xd8, 0x1c, 0x08, 0xb0, 0x05, + 0xe7, 0x88, 0xb0, 0x05, 0xe7, 0x86, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x9d, 0xec, + 0xcc, 0x00, 0x02, 0x00, 0xcc, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0xce, + 0xb5, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0xb0, 0x81, + 0x2c, 0x0b, 0xdb, 0x19, 0x2c, 0x12, 0xdc, 0x17, + 0x68, 0xbe, 0x68, 0xf9, 0x91, 0x00, 0x68, 0x7a, + 0x1c, 0x3b, 0x68, 0x39, 0x1c, 0x20, 0xf7, 0xff, + 0xff, 0x23, 0x1c, 0x05, 0x68, 0xb8, 0x42, 0xb0, + 0xd0, 0x00, 0x25, 0x80, 0x68, 0xf8, 0x99, 0x00, + 0x42, 0x88, 0xd0, 0x00, 0x25, 0x80, 0x1c, 0x28, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x25, 0x00, 0x68, 0x38, 0x28, 0x00, 0xda, 0x02, + 0x25, 0x80, 0x20, 0x00, 0x60, 0x38, 0x68, 0x78, + 0x28, 0x00, 0xda, 0x02, 0x25, 0x80, 0x20, 0x00, + 0x60, 0x78, 0x68, 0x38, 0x07, 0xc0, 0x0f, 0xc0, + 0xd0, 0x04, 0x25, 0x80, 0x68, 0x38, 0x08, 0x40, + 0x00, 0x40, 0x60, 0x38, 0x68, 0xb8, 0x07, 0xc0, + 0x0f, 0xc0, 0xd1, 0x09, 0x25, 0x80, 0x68, 0xb8, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x68, 0xb8, + 0xe0, 0x01, 0x68, 0xb8, 0x38, 0x01, 0x60, 0xb8, + 0x68, 0xb8, 0x68, 0x39, 0x42, 0x88, 0xdc, 0x03, + 0x25, 0x80, 0x68, 0x38, 0x30, 0x01, 0x60, 0xb8, + 0x68, 0x78, 0x68, 0xf9, 0x42, 0x88, 0xdb, 0x03, + 0x25, 0x80, 0x68, 0x78, 0x30, 0x01, 0x60, 0xf8, + 0x1c, 0x28, 0xb0, 0x01, 0xe7, 0xc5, 0xb0, 0x01, + 0xe7, 0xc3, 0x1c, 0x02, 0x21, 0x18, 0xe0, 0x00, + 0x31, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, + 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0a, 0xb0, 0x81, + 0x68, 0xb8, 0x68, 0x3b, 0x1a, 0xc0, 0x1c, 0x46, + 0x68, 0xf8, 0x68, 0x7b, 0x1a, 0xc0, 0x30, 0x01, + 0x90, 0x00, 0x00, 0x90, 0x4b, 0x15, 0x58, 0x1c, + 0x98, 0x00, 0x43, 0x46, 0x1c, 0x35, 0x07, 0xa0, + 0x0f, 0x80, 0x1c, 0x29, 0x40, 0x81, 0x2a, 0x0b, + 0xdb, 0x01, 0x2a, 0x12, 0xdd, 0x01, 0x2a, 0x13, + 0xd1, 0x01, 0x21, 0x00, 0xe0, 0x0a, 0x2a, 0x09, + 0xd0, 0x01, 0x2a, 0x0a, 0xd1, 0x03, 0x00, 0x69, + 0x19, 0x49, 0x00, 0xc9, 0xe0, 0x02, 0x2a, 0x08, + 0xd1, 0x00, 0x01, 0x29, 0x20, 0x04, 0x40, 0x20, + 0xd0, 0x00, 0x08, 0x49, 0x09, 0x4c, 0x06, 0xc8, + 0x0e, 0xc0, 0xd0, 0x00, 0x34, 0x01, 0x1c, 0x20, + 0xb0, 0x01, 0xbc, 0xf0, 0x47, 0x70, 0xb0, 0x01, + 0xe7, 0xfb, 0x00, 0x00, 0x2e, 0x03, 0xa8, 0x78, + 0xb4, 0x80, 0x23, 0x00, 0x22, 0x01, 0x21, 0x00, + 0x29, 0x08, 0xdb, 0x02, 0xe0, 0x09, 0x31, 0x01, + 0xe7, 0xfa, 0x00, 0x88, 0x4f, 0x05, 0x58, 0x38, + 0x28, 0x00, 0xd0, 0x00, 0x43, 0x13, 0x00, 0x52, + 0xe7, 0xf5, 0x1c, 0x18, 0xbc, 0x80, 0x47, 0x70, + 0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xc4, + 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x81, 0x20, 0x39, + 0x06, 0x40, 0x69, 0xc0, 0x23, 0x18, 0x40, 0x18, + 0x90, 0x00, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x03, + 0x48, 0x32, 0x49, 0x33, 0x60, 0x08, 0xe0, 0x03, + 0x20, 0xff, 0x30, 0xe0, 0x49, 0x30, 0x60, 0x08, + 0x24, 0x00, 0x99, 0x01, 0x48, 0x2f, 0xf7, 0xfc, + 0xfa, 0x1f, 0x48, 0x2e, 0x68, 0x00, 0x28, 0x00, + 0xda, 0x03, 0x20, 0x00, 0x49, 0x2b, 0x60, 0x08, + 0x24, 0x80, 0x48, 0x2a, 0x68, 0x40, 0x28, 0x00, + 0xda, 0x03, 0x20, 0x00, 0x49, 0x27, 0x60, 0x48, + 0x24, 0x80, 0x48, 0x26, 0x68, 0x80, 0x4b, 0x26, + 0x42, 0x98, 0xdd, 0x03, 0x48, 0x24, 0x49, 0x23, + 0x60, 0x88, 0x24, 0x80, 0x48, 0x21, 0x68, 0xc0, + 0x49, 0x1f, 0x68, 0x09, 0x42, 0x88, 0xd9, 0x04, + 0x48, 0x1d, 0x68, 0x00, 0x49, 0x1d, 0x60, 0xc8, + 0x24, 0x80, 0x48, 0x1e, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x27, 0x2f, 0x01, 0xd1, 0x25, 0x48, 0x19, + 0x68, 0x06, 0x48, 0x18, 0x68, 0x45, 0x23, 0xff, + 0x33, 0x68, 0x42, 0x9e, 0xdd, 0x01, 0x26, 0xff, + 0x36, 0x68, 0x48, 0x13, 0x68, 0x00, 0x08, 0x40, + 0x42, 0xa8, 0xd2, 0x02, 0x48, 0x10, 0x68, 0x00, + 0x08, 0x45, 0x48, 0x13, 0x49, 0x13, 0x65, 0x48, + 0x48, 0x13, 0x43, 0x70, 0x23, 0x01, 0x04, 0x1b, + 0x18, 0xc0, 0x14, 0x40, 0x49, 0x0f, 0x65, 0x88, + 0x20, 0x00, 0x49, 0x0e, 0x65, 0xc8, 0x48, 0x0d, + 0x66, 0x05, 0x1c, 0x38, 0x21, 0x00, 0xf7, 0xfe, + 0xff, 0x13, 0x1c, 0x20, 0xb0, 0x01, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, + 0xe7, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3f, + 0x2e, 0x08, 0x9d, 0xec, 0x2e, 0x08, 0xbb, 0x0c, + 0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0xba, 0x28, + 0x00, 0x00, 0x07, 0xfa, 0xcc, 0x00, 0x00, 0x00, + 0x00, 0x0b, 0x60, 0xb6, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x0f, 0xb0, 0x81, 0x1c, 0x26, 0x69, 0x30, + 0x90, 0x00, 0x98, 0x00, 0x28, 0x13, 0xd1, 0x04, + 0x20, 0x75, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0xf5, 0x68, 0x38, 0x08, 0x40, + 0x00, 0x40, 0x60, 0x38, 0x68, 0x78, 0x08, 0x40, + 0x00, 0x40, 0x60, 0x78, 0x68, 0xb8, 0x07, 0xc0, + 0x0f, 0xc0, 0xd1, 0x02, 0x68, 0xb8, 0x38, 0x01, + 0x60, 0xb8, 0x68, 0xf8, 0x07, 0xc0, 0x0f, 0xc0, + 0xd1, 0x02, 0x68, 0xf8, 0x38, 0x01, 0x60, 0xf8, + 0x1d, 0xf0, 0x30, 0x49, 0x1c, 0x39, 0xf7, 0xfc, + 0xf9, 0x8b, 0x48, 0x1c, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x01, + 0xe7, 0xcc, 0x49, 0x13, 0x20, 0x91, 0xf0, 0x14, + 0xff, 0x47, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x05, 0xfa, 0xf4, 0xe7, 0xf5, 0x00, 0xa8, + 0x49, 0x0e, 0x58, 0x08, 0x42, 0xa0, 0xd0, 0x05, + 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0x20, 0xff, + 0xb0, 0x01, 0xe7, 0xb7, 0x48, 0x0a, 0x68, 0x00, + 0x42, 0xa0, 0xd1, 0x03, 0x1c, 0x39, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x10, 0x20, 0x92, 0x49, 0x04, + 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xa9, + 0xb0, 0x01, 0xe7, 0xa7, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x2e, 0x08, 0xba, 0x28, 0xb5, 0xf3, 0x1c, 0x0f, + 0xb0, 0x9b, 0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, + 0x23, 0x18, 0x40, 0x18, 0x90, 0x01, 0x98, 0x01, + 0x28, 0x00, 0xd0, 0x03, 0x48, 0xf8, 0x49, 0xf9, + 0x60, 0x08, 0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, + 0x49, 0xf6, 0x60, 0x08, 0x20, 0xff, 0x30, 0x01, + 0x90, 0x06, 0x98, 0x1b, 0x90, 0x1a, 0x98, 0x1a, + 0x69, 0x05, 0x98, 0x1a, 0x68, 0xc0, 0x90, 0x19, + 0x48, 0xf1, 0x68, 0x00, 0x99, 0x1b, 0x42, 0x88, + 0xd1, 0x73, 0x20, 0x02, 0x90, 0x08, 0x2d, 0x0c, + 0xd0, 0x01, 0x2d, 0x0f, 0xd1, 0x02, 0x20, 0x04, + 0x90, 0x08, 0xe0, 0x0c, 0x2d, 0x0d, 0xd0, 0x01, + 0x2d, 0x10, 0xd1, 0x02, 0x20, 0x08, 0x90, 0x08, + 0xe0, 0x05, 0x2d, 0x0e, 0xd0, 0x01, 0x2d, 0x11, + 0xd1, 0x01, 0x20, 0x01, 0x90, 0x08, 0x68, 0xf8, + 0x68, 0x79, 0x1a, 0x40, 0x1c, 0x44, 0x2d, 0x0b, + 0xd0, 0x05, 0x2d, 0x0f, 0xd0, 0x03, 0x2d, 0x10, + 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x11, 0x48, 0xdf, + 0x6c, 0x40, 0x1c, 0x06, 0x48, 0xdd, 0x6c, 0x81, + 0x91, 0x07, 0x2e, 0x00, 0xd0, 0x02, 0x99, 0x07, + 0x29, 0x00, 0xd1, 0x05, 0x26, 0x2d, 0x01, 0x36, + 0x48, 0xd6, 0x68, 0x00, 0x1c, 0x41, 0x91, 0x07, + 0xe0, 0x05, 0x26, 0x2d, 0x01, 0x36, 0x48, 0xd3, + 0x68, 0x00, 0x1c, 0x41, 0x91, 0x07, 0x49, 0xd4, + 0xa8, 0x15, 0xf7, 0xfc, 0xf8, 0xe9, 0x98, 0x17, + 0x1e, 0x71, 0x42, 0x88, 0xdd, 0x01, 0x1e, 0x70, + 0x90, 0x17, 0x98, 0x18, 0x99, 0x07, 0x39, 0x01, + 0x42, 0x88, 0xdd, 0x02, 0x99, 0x07, 0x1e, 0x48, + 0x90, 0x18, 0x98, 0x18, 0x99, 0x16, 0x1a, 0x40, + 0x00, 0x40, 0x1c, 0x81, 0x98, 0x08, 0xf0, 0x06, + 0xfb, 0xd3, 0x90, 0x0a, 0x98, 0x0a, 0x42, 0x84, + 0xdd, 0x00, 0x9c, 0x0a, 0x48, 0xc5, 0x6f, 0x00, + 0x90, 0x02, 0x20, 0x00, 0x90, 0x05, 0x98, 0x02, + 0x28, 0x02, 0xd0, 0x02, 0x98, 0x02, 0x28, 0x03, + 0xd1, 0x3a, 0x48, 0xc1, 0x6b, 0x00, 0x90, 0x04, + 0x48, 0xbe, 0x6e, 0xc1, 0x91, 0x03, 0x98, 0x04, + 0x99, 0x03, 0x42, 0x88, 0xdd, 0x21, 0x20, 0xc0, + 0x90, 0x06, 0x1d, 0x20, 0x28, 0x00, 0xda, 0x02, + 0xe0, 0x00, 0xe1, 0x8e, 0x30, 0x07, 0x10, 0xc0, + 0x90, 0x05, 0x98, 0x04, 0x28, 0x03, 0xd0, 0x14, + 0x99, 0x03, 0x29, 0x03, 0xd1, 0x07, 0x20, 0xcd, + 0x90, 0x06, 0x1d, 0x61, 0x20, 0x0a, 0xf0, 0x06, + 0xfb, 0xa3, 0x90, 0x05, 0xe0, 0x09, 0x98, 0x02, + 0x28, 0x02, 0xd1, 0x06, 0x20, 0x9a, 0x90, 0x06, + 0x1c, 0xa1, 0x20, 0x05, 0xf0, 0x06, 0xfb, 0x98, + 0x90, 0x05, 0x98, 0x06, 0x28, 0x9a, 0xd0, 0x02, + 0x98, 0x06, 0x28, 0xcd, 0xd1, 0x08, 0x2d, 0x0e, + 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x04, 0x20, 0x00, + 0x90, 0x05, 0x20, 0xff, 0x30, 0x01, 0x90, 0x06, + 0x2d, 0x12, 0xd1, 0x0b, 0x48, 0x9d, 0x68, 0x00, + 0x30, 0x01, 0x42, 0xa0, 0xd1, 0x06, 0x68, 0x78, + 0x28, 0x00, 0xd1, 0x03, 0x20, 0x01, 0x49, 0x9f, + 0x63, 0x48, 0xe0, 0x02, 0x20, 0x00, 0x49, 0x9d, + 0x63, 0x48, 0x98, 0x0a, 0x99, 0x06, 0x43, 0x48, + 0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 0x12, 0x00, + 0x42, 0xa0, 0xdd, 0x04, 0x20, 0x00, 0x90, 0x05, + 0x20, 0xff, 0x30, 0x01, 0x90, 0x06, 0x68, 0x78, + 0x99, 0x05, 0x18, 0x40, 0x60, 0x78, 0x1c, 0x39, + 0xa8, 0x11, 0xf7, 0xfc, 0xf8, 0x61, 0x1c, 0x29, + 0xa8, 0x11, 0xf7, 0xff, 0xfd, 0x71, 0x98, 0x12, + 0x49, 0x88, 0x68, 0x09, 0x39, 0x01, 0x42, 0x88, + 0xd1, 0x00, 0x24, 0x00, 0x99, 0x15, 0x91, 0x0d, + 0x98, 0x16, 0x90, 0x0f, 0x21, 0x00, 0x91, 0x10, + 0x68, 0x38, 0x28, 0x00, 0xda, 0x08, 0x68, 0x38, + 0x99, 0x08, 0x43, 0x48, 0x42, 0x41, 0x29, 0x00, + 0xda, 0x00, 0x31, 0x01, 0x10, 0x49, 0x91, 0x10, + 0x68, 0x78, 0x28, 0x00, 0xda, 0x0d, 0x68, 0x78, + 0x99, 0x08, 0x43, 0x48, 0x28, 0x00, 0xda, 0x00, + 0x30, 0x01, 0x10, 0x40, 0x02, 0x01, 0x98, 0x06, + 0xf0, 0x06, 0xfb, 0x36, 0x99, 0x0f, 0x1a, 0x08, + 0x90, 0x0f, 0x98, 0x18, 0x99, 0x0f, 0x42, 0x88, + 0xdc, 0x02, 0x98, 0x18, 0x30, 0x01, 0x90, 0x0f, + 0x98, 0x17, 0x99, 0x0d, 0x1a, 0x40, 0x30, 0x01, + 0x90, 0x0e, 0x98, 0x18, 0x99, 0x0f, 0x1a, 0x40, + 0x30, 0x01, 0x90, 0x09, 0x98, 0x09, 0x00, 0x41, + 0x98, 0x08, 0xf0, 0x06, 0xfb, 0x1d, 0x99, 0x06, + 0x43, 0x48, 0x28, 0x00, 0xda, 0x00, 0x30, 0xff, + 0x12, 0x00, 0x90, 0x09, 0x68, 0xb8, 0x68, 0x39, + 0x1a, 0x40, 0x1c, 0x41, 0x91, 0x0c, 0x98, 0x17, + 0x99, 0x15, 0x1a, 0x40, 0x00, 0x40, 0x1c, 0x81, + 0x98, 0x08, 0xf0, 0x06, 0xfb, 0x09, 0x90, 0x0b, + 0x98, 0x0b, 0x4b, 0x65, 0x40, 0x18, 0x90, 0x0b, + 0x98, 0x0b, 0x99, 0x08, 0x43, 0x48, 0x28, 0x00, + 0xda, 0x00, 0x30, 0x01, 0x10, 0x40, 0x90, 0x0e, + 0x99, 0x0c, 0x98, 0x0b, 0x42, 0x81, 0xdd, 0x01, + 0x98, 0x0b, 0x90, 0x0c, 0x99, 0x0c, 0x4b, 0x5c, + 0x40, 0x19, 0x91, 0x0c, 0x98, 0x0c, 0x28, 0x00, + 0xdd, 0x05, 0x68, 0x38, 0x99, 0x0c, 0x18, 0x40, + 0x38, 0x01, 0x90, 0x13, 0xe0, 0x02, 0x68, 0x38, + 0x30, 0x01, 0x90, 0x13, 0x98, 0x13, 0x28, 0x01, + 0xda, 0x01, 0x20, 0x01, 0x90, 0x13, 0x98, 0x13, + 0x4b, 0x52, 0x42, 0x98, 0xdd, 0x01, 0x48, 0x51, + 0x90, 0x13, 0x99, 0x06, 0x43, 0x4c, 0x1c, 0x20, + 0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 0x12, 0x04, + 0x98, 0x0a, 0x42, 0x84, 0xdd, 0x00, 0x9c, 0x0a, + 0x2c, 0x02, 0xda, 0x00, 0x24, 0x02, 0x68, 0x78, + 0x19, 0x00, 0x38, 0x01, 0x90, 0x14, 0x98, 0x14, + 0x28, 0x01, 0xda, 0x01, 0x20, 0x01, 0x90, 0x14, + 0x98, 0x14, 0x49, 0x3c, 0x68, 0x09, 0x42, 0x88, + 0xd9, 0x02, 0x48, 0x3a, 0x68, 0x00, 0x90, 0x14, + 0x98, 0x12, 0x49, 0x38, 0x68, 0x09, 0x39, 0x01, + 0x42, 0x88, 0xd9, 0x03, 0x48, 0x35, 0x68, 0x00, + 0x38, 0x01, 0x90, 0x12, 0x98, 0x09, 0x28, 0x04, + 0xdb, 0x01, 0x2c, 0x04, 0xda, 0x01, 0x20, 0x00, + 0x90, 0x0e, 0x98, 0x0e, 0x28, 0x03, 0xdb, 0x02, + 0x98, 0x0c, 0x28, 0x04, 0xda, 0x09, 0x20, 0x00, + 0x90, 0x0e, 0x48, 0x35, 0x90, 0x11, 0x48, 0x33, + 0x90, 0x13, 0x20, 0x00, 0x90, 0x12, 0x20, 0x01, + 0x90, 0x14, 0x21, 0x00, 0x91, 0x00, 0x98, 0x08, + 0x28, 0x01, 0xd1, 0x16, 0x98, 0x0e, 0x99, 0x10, + 0x1a, 0x40, 0x00, 0x40, 0x4b, 0x2b, 0x42, 0x98, + 0xdd, 0x0b, 0x98, 0x0e, 0x99, 0x10, 0x1a, 0x40, + 0x00, 0x40, 0x23, 0x2d, 0x01, 0x1b, 0x1a, 0xc1, + 0x29, 0x00, 0xda, 0x00, 0x31, 0x01, 0x10, 0x49, + 0x91, 0x00, 0x98, 0x0e, 0x42, 0xb0, 0xdd, 0x00, + 0x96, 0x0e, 0x99, 0x10, 0x42, 0xb1, 0xdd, 0x00, + 0x96, 0x10, 0x1c, 0x30, 0x21, 0x01, 0x07, 0x49, + 0xf0, 0x06, 0xfa, 0x76, 0x99, 0x0d, 0x43, 0x48, + 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, + 0x49, 0x1c, 0x65, 0x88, 0x1c, 0x30, 0x21, 0x01, + 0x07, 0x49, 0xf0, 0x06, 0xfa, 0x69, 0x99, 0x10, + 0x43, 0x48, 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0, + 0x14, 0x40, 0x49, 0x16, 0x65, 0xc8, 0x1c, 0x30, + 0x21, 0x01, 0x07, 0x49, 0xf0, 0x06, 0xfa, 0x5c, + 0x99, 0x0e, 0x43, 0x48, 0x23, 0x01, 0x04, 0x1b, + 0x18, 0xc0, 0x14, 0x40, 0x49, 0x0f, 0x65, 0x48, + 0x99, 0x07, 0x1f, 0x08, 0x99, 0x0f, 0x42, 0x88, + 0xdc, 0x1b, 0x99, 0x07, 0x1f, 0x08, 0xe0, 0x17, + 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x9d, 0xec, + 0x2e, 0x08, 0xba, 0x28, 0xcc, 0x00, 0x02, 0x00, + 0x2e, 0x08, 0xbb, 0x0c, 0xcc, 0x00, 0x0f, 0x80, + 0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x02, 0xcf, + 0x00, 0x00, 0x02, 0xce, 0xcc, 0x00, 0x00, 0x00, + 0x90, 0x0f, 0x98, 0x0f, 0x49, 0x0d, 0x66, 0x08, + 0x1c, 0x30, 0x21, 0x01, 0x07, 0x49, 0xf0, 0x06, + 0xfa, 0x2b, 0x99, 0x00, 0x43, 0x48, 0x23, 0x01, + 0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, 0x49, 0x07, + 0x66, 0x48, 0xa9, 0x11, 0x1c, 0x38, 0xf7, 0xfb, + 0xff, 0x1f, 0x20, 0x00, 0xb0, 0x1b, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x1b, + 0xe7, 0xf9, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x2a, 0x00, + 0xd1, 0x02, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, + 0x2f, 0x01, 0xd1, 0x20, 0x20, 0x00, 0x23, 0x00, + 0x4d, 0x13, 0x62, 0x2b, 0x23, 0x00, 0x4d, 0x12, + 0x62, 0xab, 0x4b, 0x12, 0x68, 0x9b, 0x1c, 0x1c, + 0x4b, 0x11, 0x6e, 0xdb, 0x1c, 0x19, 0x2c, 0x02, + 0xd0, 0x01, 0x29, 0x02, 0xd1, 0x01, 0x20, 0x08, + 0xe0, 0x00, 0x20, 0x07, 0x79, 0x13, 0x2b, 0x00, + 0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0x4b, 0x08, + 0x62, 0x58, 0x79, 0x55, 0x23, 0x80, 0x43, 0x2b, + 0x4d, 0x05, 0x62, 0xab, 0xe0, 0x05, 0x48, 0x07, + 0x68, 0x05, 0x23, 0x80, 0x43, 0x9d, 0x1c, 0x2b, + 0x60, 0x03, 0x20, 0x00, 0xe7, 0xd2, 0xe7, 0xd1, + 0x72, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x0c, 0x00, + 0xcc, 0x00, 0x0f, 0x80, 0x72, 0x00, 0x01, 0x28, + 0xb5, 0xff, 0x9f, 0x09, 0xb0, 0x81, 0x98, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, + 0x06, 0x0c, 0x0e, 0x24, 0x98, 0x03, 0x06, 0x02, + 0x0e, 0x12, 0x9b, 0x04, 0x06, 0x1d, 0x0e, 0x2d, + 0x2f, 0x01, 0xd1, 0x1b, 0x20, 0x00, 0x4b, 0x14, + 0x62, 0x18, 0x20, 0x00, 0x4b, 0x12, 0x62, 0x98, + 0x98, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x01, 0x23, + 0x43, 0x18, 0x06, 0x01, 0x0e, 0x09, 0x48, 0x0e, + 0x62, 0x41, 0x07, 0x50, 0x0f, 0x40, 0x07, 0x6b, + 0x0f, 0x5b, 0x00, 0xdb, 0x43, 0x18, 0x06, 0x01, + 0x0e, 0x09, 0x20, 0x80, 0x43, 0x08, 0x4b, 0x08, + 0x62, 0x98, 0xe0, 0x05, 0x48, 0x07, 0x68, 0x06, + 0x23, 0x80, 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x03, + 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, + 0x72, 0x00, 0x01, 0x00, 0x72, 0x00, 0x01, 0x28, + 0xb5, 0xf1, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f, + 0xb0, 0x81, 0x2f, 0x1f, 0xdb, 0x05, 0x20, 0xb3, + 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x48, 0x62, 0x23, 0x80, 0x68, 0x1b, + 0x60, 0x18, 0x48, 0x61, 0x23, 0x80, 0x6b, 0x1b, + 0x60, 0x18, 0x48, 0x60, 0x23, 0x80, 0x6b, 0x5b, + 0x60, 0x18, 0x48, 0x5f, 0x23, 0x80, 0x6b, 0x9b, + 0x60, 0x18, 0x20, 0x01, 0x40, 0xb8, 0x4b, 0x59, + 0x60, 0x18, 0x20, 0x00, 0x4b, 0x57, 0x71, 0x18, + 0x20, 0x00, 0x4b, 0x56, 0x71, 0x58, 0x48, 0x55, + 0x68, 0x00, 0x4b, 0x58, 0x60, 0x58, 0x48, 0x58, + 0x4b, 0x56, 0x60, 0x98, 0x48, 0x57, 0x4b, 0x55, + 0x60, 0xd8, 0x20, 0xff, 0x30, 0x01, 0x4b, 0x53, + 0x62, 0x18, 0x20, 0xff, 0x30, 0x01, 0x4b, 0x51, + 0x62, 0x58, 0x20, 0x03, 0x4b, 0x52, 0x75, 0x18, + 0x20, 0x0e, 0x4b, 0x51, 0x75, 0x58, 0x20, 0x04, + 0x4b, 0x4f, 0x75, 0x98, 0x20, 0x03, 0x4b, 0x4e, + 0x75, 0xd8, 0x20, 0x00, 0x4b, 0x4d, 0x60, 0x18, + 0x20, 0x00, 0x4b, 0x4d, 0x60, 0x18, 0x20, 0x0d, + 0x23, 0x19, 0x06, 0x9b, 0x63, 0x18, 0x22, 0x00, + 0x2a, 0x20, 0xdb, 0x04, 0xe0, 0x21, 0x1c, 0x50, + 0x06, 0x02, 0x0e, 0x12, 0xe7, 0xf8, 0x25, 0x00, + 0x00, 0x93, 0x4e, 0x46, 0x50, 0xf5, 0x25, 0xff, + 0x4b, 0x45, 0x54, 0x9d, 0x01, 0x15, 0x4b, 0x45, + 0x18, 0xec, 0x01, 0x15, 0x4b, 0x44, 0x18, 0xe8, + 0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc4, 0x20, + 0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc4, 0x20, + 0x25, 0x00, 0xc0, 0x20, 0x25, 0x00, 0xc0, 0x20, + 0x25, 0x00, 0xc0, 0x20, 0x25, 0x00, 0xc0, 0x20, + 0xe7, 0xdd, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, + 0xe0, 0x0b, 0x1c, 0x48, 0x04, 0x01, 0x0c, 0x09, + 0xe7, 0xf8, 0x23, 0x00, 0x00, 0x88, 0x4c, 0x2a, + 0x50, 0x23, 0x23, 0x00, 0x48, 0x35, 0x54, 0x43, + 0xe7, 0xf3, 0x4c, 0x35, 0x94, 0x00, 0x22, 0x00, + 0x2a, 0x10, 0xdb, 0x04, 0xe0, 0x0f, 0x1c, 0x50, + 0x06, 0x02, 0x0e, 0x12, 0xe7, 0xf8, 0x20, 0x00, + 0x00, 0x93, 0x4c, 0x30, 0x50, 0xe0, 0x23, 0xff, + 0x48, 0x2f, 0x54, 0x83, 0x20, 0x00, 0x00, 0x93, + 0x9c, 0x00, 0x50, 0xe0, 0xe7, 0xef, 0x21, 0x00, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xdb, 0x04, + 0xe0, 0x2a, 0x1c, 0x48, 0x04, 0x01, 0x0c, 0x09, + 0xe7, 0xf6, 0x23, 0x00, 0x00, 0x88, 0x4c, 0x1a, + 0x50, 0x23, 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x18, + 0x19, 0x1c, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xe3, + 0x60, 0x18, 0x20, 0x00, 0x4b, 0x14, 0x18, 0x5c, + 0x23, 0x01, 0x02, 0xdb, 0x18, 0xe3, 0x70, 0x18, + 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x11, 0x50, 0xe0, + 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x0f, 0x19, 0x1c, + 0x23, 0x01, 0x02, 0x9b, 0x18, 0xe3, 0x60, 0x18, + 0x20, 0x00, 0x4b, 0x0c, 0x18, 0x5c, 0x23, 0x01, + 0x02, 0xdb, 0x18, 0xe3, 0x70, 0x18, 0xe7, 0xd4, + 0x20, 0x00, 0xb0, 0x01, 0xe7, 0x39, 0xb0, 0x01, + 0xe7, 0x37, 0x00, 0x00, 0x2e, 0x08, 0xb0, 0x58, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0xaf, 0xfc, + 0x2e, 0x08, 0xb0, 0x08, 0x9e, 0x00, 0x04, 0x80, + 0x2e, 0x08, 0x9d, 0xfc, 0x2e, 0x08, 0xa6, 0xfc, + 0x9e, 0x00, 0x04, 0xa0, 0x2e, 0x08, 0x9c, 0x48, + 0x2e, 0x08, 0x9c, 0x4c, 0x2e, 0x08, 0x9c, 0x50, + 0x2e, 0x08, 0x9d, 0x10, 0x64, 0x00, 0x08, 0x00, + 0x64, 0x00, 0x10, 0x00, 0x2e, 0x08, 0xb9, 0x60, + 0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x9c, 0xd0, + 0x2e, 0x08, 0x9d, 0x30, 0xb4, 0xb0, 0x1c, 0x07, + 0x1c, 0x0a, 0x06, 0x11, 0x0e, 0x09, 0x29, 0x20, + 0xdb, 0x02, 0x20, 0xa2, 0xbc, 0xb0, 0x47, 0x70, + 0x00, 0x88, 0x4b, 0x0a, 0x58, 0x18, 0x1c, 0x05, + 0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x68, 0xe8, + 0x1c, 0x04, 0xd1, 0x01, 0x20, 0xb6, 0xe7, 0xf1, + 0x68, 0x60, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, + 0x08, 0x80, 0x60, 0x38, 0x20, 0x00, 0xe7, 0xe9, + 0xe7, 0xe8, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xc8, + 0xb5, 0xff, 0xb0, 0x82, 0x9a, 0x04, 0x06, 0x11, + 0x0e, 0x09, 0x91, 0x00, 0x9b, 0x05, 0x06, 0x18, + 0x0e, 0x00, 0x90, 0x01, 0xb0, 0x83, 0x99, 0x03, + 0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x05, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x05, 0x28, 0x00, 0xd0, 0x64, 0x98, 0x05, + 0x23, 0x0d, 0x06, 0x9b, 0x42, 0xd8, 0xd3, 0x02, + 0x20, 0xb4, 0xb0, 0x05, 0xe7, 0xf0, 0x99, 0x06, + 0x23, 0xff, 0x33, 0x81, 0x42, 0x99, 0xd2, 0x02, + 0x20, 0xb5, 0xb0, 0x05, 0xe7, 0xe8, 0x99, 0x03, + 0x00, 0x88, 0x49, 0x2c, 0x58, 0x08, 0x90, 0x02, + 0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x05, + 0xe7, 0xde, 0x99, 0x06, 0x00, 0x88, 0x1f, 0xc1, + 0x39, 0x05, 0x91, 0x00, 0x9e, 0x05, 0x98, 0x05, + 0x1d, 0xc5, 0x35, 0x05, 0x60, 0x35, 0x99, 0x06, + 0x60, 0x71, 0x20, 0x00, 0x60, 0xb0, 0x98, 0x04, + 0x28, 0x10, 0xd1, 0x0a, 0x98, 0x02, 0x68, 0x84, + 0x98, 0x02, 0x30, 0x18, 0x90, 0x01, 0x1c, 0x2a, + 0x99, 0x00, 0x98, 0x01, 0xf0, 0x00, 0xfc, 0x86, + 0xe0, 0x25, 0x98, 0x04, 0x28, 0x20, 0xd1, 0x1f, + 0x98, 0x02, 0x68, 0xc0, 0x1c, 0x07, 0xd1, 0x02, + 0x20, 0xb6, 0xb0, 0x05, 0xe7, 0xb8, 0x78, 0xb8, + 0x08, 0x40, 0x00, 0x40, 0x70, 0xb8, 0x69, 0x3c, + 0x1d, 0xf8, 0x30, 0x05, 0x90, 0x01, 0x68, 0xb8, + 0x28, 0x00, 0xd1, 0x00, 0x60, 0xbd, 0x1c, 0x2a, + 0x99, 0x00, 0x98, 0x01, 0xf0, 0x00, 0xfc, 0x6a, + 0x68, 0x79, 0x18, 0x40, 0x60, 0x78, 0x78, 0x78, + 0x99, 0x03, 0xf0, 0x00, 0xf8, 0xb9, 0xe0, 0x02, + 0x20, 0xbc, 0xb0, 0x05, 0xe7, 0x9c, 0x68, 0xa0, + 0x28, 0x00, 0xd0, 0x01, 0x68, 0xa4, 0xe7, 0xfa, + 0x60, 0xa6, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x93, + 0x20, 0xb4, 0xb0, 0x05, 0xe7, 0x90, 0xb0, 0x03, + 0xb0, 0x02, 0xe7, 0x8d, 0x2e, 0x08, 0x9b, 0xc8, + 0xb5, 0xff, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x16, + 0x0e, 0x36, 0x9b, 0x04, 0x06, 0x18, 0x0e, 0x00, + 0x90, 0x00, 0xb0, 0x83, 0x27, 0x00, 0x2e, 0x20, + 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x04, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb0, + 0x49, 0x45, 0x58, 0x08, 0x1c, 0x04, 0xd1, 0x02, + 0x20, 0xb0, 0xb0, 0x04, 0xe7, 0xf3, 0x78, 0xe0, + 0x28, 0x00, 0xd1, 0x73, 0x98, 0x03, 0x28, 0x20, + 0xd1, 0x19, 0x68, 0xe0, 0x1c, 0x07, 0xd1, 0x02, + 0x20, 0xb6, 0xb0, 0x04, 0xe7, 0xe7, 0x69, 0x38, + 0x49, 0x3c, 0x60, 0x48, 0x48, 0x3b, 0x68, 0x40, + 0x68, 0x00, 0x60, 0xb8, 0x1d, 0xf8, 0x30, 0x05, + 0x90, 0x02, 0x20, 0x01, 0x90, 0x00, 0x48, 0x37, + 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, 0x1f, 0xc1, + 0x39, 0x19, 0x91, 0x01, 0xe0, 0x1d, 0x98, 0x03, + 0x28, 0x10, 0xd1, 0x17, 0x68, 0xa0, 0x49, 0x31, + 0x60, 0x48, 0x48, 0x30, 0x68, 0x40, 0x68, 0x00, + 0x61, 0x20, 0x48, 0x2e, 0x68, 0x40, 0x68, 0x00, + 0x61, 0x60, 0x1d, 0xe0, 0x30, 0x11, 0x90, 0x02, + 0x48, 0x2a, 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, + 0x1f, 0xc1, 0x39, 0x21, 0x91, 0x01, 0x20, 0x00, + 0x90, 0x00, 0xe0, 0x02, 0x20, 0xbc, 0xb0, 0x04, + 0xe7, 0xb5, 0x48, 0x24, 0x68, 0x40, 0x68, 0x80, + 0x28, 0x00, 0xd0, 0x37, 0x25, 0x00, 0x48, 0x21, + 0x68, 0x40, 0x68, 0x02, 0x99, 0x01, 0x98, 0x02, + 0xf0, 0x00, 0xfb, 0xe8, 0x19, 0x45, 0x48, 0x1d, + 0x68, 0x40, 0x49, 0x1c, 0x60, 0x08, 0x48, 0x1b, + 0x68, 0x00, 0x68, 0x80, 0x49, 0x19, 0x60, 0x48, + 0x48, 0x18, 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, + 0x1f, 0xc1, 0x39, 0x05, 0x91, 0x01, 0x48, 0x15, + 0x68, 0x40, 0x68, 0x80, 0x28, 0x00, 0xd1, 0xe2, + 0x20, 0x00, 0x49, 0x12, 0x68, 0x09, 0x60, 0x88, + 0x48, 0x10, 0x68, 0x40, 0x99, 0x04, 0x60, 0x08, + 0x48, 0x0e, 0x68, 0x40, 0x68, 0x40, 0x99, 0x05, + 0x60, 0x08, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x06, + 0x60, 0x7d, 0x78, 0x78, 0x1c, 0x31, 0xf0, 0x00, + 0xf8, 0x13, 0xe0, 0x00, 0xe0, 0x05, 0x20, 0x00, + 0xb0, 0x04, 0xe7, 0x78, 0x20, 0xb4, 0xb0, 0x04, + 0xe7, 0x75, 0x20, 0xbc, 0xb0, 0x04, 0xe7, 0x72, + 0xb0, 0x03, 0xb0, 0x01, 0xe7, 0x6f, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9d, 0xf4, + 0xb5, 0xf3, 0x98, 0x00, 0x06, 0x02, 0x0e, 0x12, + 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0xb0, 0x81, + 0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x01, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0xa0, 0x4b, 0x14, 0x58, 0x18, 0x1c, 0x05, + 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x01, 0xe7, 0xf3, + 0x68, 0xe8, 0x1c, 0x01, 0xd1, 0x02, 0x20, 0xb6, + 0xb0, 0x01, 0xe7, 0xed, 0x11, 0x10, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x00, 0x28, 0x00, 0xd1, 0x04, + 0x68, 0x48, 0x40, 0xd0, 0x06, 0x07, 0x0e, 0x3f, + 0xe0, 0x09, 0x68, 0x48, 0x07, 0x16, 0x0f, 0x36, + 0x40, 0xf0, 0x68, 0x4e, 0x40, 0xd6, 0x1c, 0x33, + 0x18, 0xc0, 0x06, 0x07, 0x0e, 0x3f, 0x70, 0x0f, + 0x70, 0x4a, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xd3, + 0xb0, 0x01, 0xe7, 0xd1, 0x2e, 0x08, 0x9b, 0xc8, + 0xb4, 0xb0, 0x1c, 0x03, 0x1c, 0x0a, 0x06, 0x11, + 0x0e, 0x09, 0x29, 0x20, 0xdb, 0x02, 0x20, 0xa2, + 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x88, 0x4d, 0x08, + 0x58, 0x28, 0x1c, 0x04, 0xd1, 0x01, 0x20, 0xb0, + 0xe7, 0xf6, 0x68, 0xe0, 0x1c, 0x07, 0xd1, 0x01, + 0x20, 0xb6, 0xe7, 0xf1, 0x78, 0x78, 0x70, 0x18, + 0x20, 0x00, 0xe7, 0xed, 0xe7, 0xec, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xc8, 0xb5, 0xf3, 0xb0, 0x81, + 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, + 0x99, 0x02, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x86, + 0x20, 0x00, 0x90, 0x00, 0x2d, 0x20, 0xdd, 0x05, + 0x20, 0xa2, 0xb0, 0x07, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0xa8, 0x49, 0xa2, + 0x58, 0x08, 0x90, 0x04, 0x28, 0x00, 0xd1, 0x02, + 0x20, 0xb0, 0xb0, 0x07, 0xe7, 0xf2, 0x00, 0xa8, + 0x49, 0x9e, 0x68, 0x09, 0x18, 0x40, 0x90, 0x05, + 0x00, 0xe8, 0x1b, 0x40, 0x00, 0x80, 0x49, 0x9c, + 0x68, 0x09, 0x18, 0x46, 0x98, 0x06, 0x28, 0x00, + 0xd0, 0x73, 0x28, 0x01, 0xd0, 0x4f, 0x28, 0x02, + 0xd0, 0x00, 0xe1, 0x1d, 0x98, 0x04, 0x69, 0x00, + 0x60, 0x70, 0x98, 0x04, 0x78, 0x40, 0x06, 0xc0, + 0x0e, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x13, + 0xd0, 0x16, 0x27, 0x00, 0x2f, 0x20, 0xdb, 0x04, + 0xe0, 0x11, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, + 0xe7, 0xf8, 0x48, 0x8e, 0x5d, 0xc0, 0x42, 0xa8, + 0xd1, 0x08, 0x00, 0xb8, 0x49, 0x8c, 0x58, 0x08, + 0x30, 0x01, 0x78, 0x01, 0x23, 0x80, 0x43, 0xdb, + 0x40, 0x19, 0x70, 0x01, 0xe7, 0xed, 0xe0, 0x1e, + 0x27, 0x00, 0x2f, 0x10, 0xdb, 0x04, 0xe0, 0x1a, + 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, + 0x48, 0x84, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x11, + 0x00, 0xb8, 0x49, 0x83, 0x58, 0x08, 0x30, 0x01, + 0x78, 0x01, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x19, + 0x70, 0x01, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x02, + 0xd1, 0x00, 0xe0, 0x00, 0xe7, 0xe4, 0x88, 0x30, + 0x4b, 0x7a, 0x40, 0x18, 0x80, 0x30, 0x98, 0x05, + 0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x99, 0x05, 0x60, 0x08, 0xe0, 0xd3, 0x98, 0x05, + 0x68, 0x00, 0x4b, 0x75, 0x40, 0x18, 0x99, 0x05, + 0x60, 0x08, 0x20, 0x00, 0x60, 0xb0, 0x20, 0x00, + 0x70, 0xf0, 0x20, 0x00, 0x60, 0xf0, 0x98, 0x04, + 0x78, 0x40, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, + 0x98, 0x02, 0x28, 0x13, 0xd0, 0x16, 0x27, 0x00, + 0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x11, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x63, + 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x08, 0x00, 0xb8, + 0xe0, 0x00, 0xe0, 0x27, 0x49, 0x60, 0x58, 0x0c, + 0x78, 0x60, 0x23, 0x80, 0x43, 0x18, 0x70, 0x60, + 0xe7, 0xed, 0xe0, 0x1e, 0x27, 0x00, 0x2f, 0x10, + 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x59, 0x5d, 0xc0, + 0x42, 0xa8, 0xd1, 0x11, 0x00, 0xb8, 0x49, 0x58, + 0x58, 0x08, 0x30, 0x01, 0x78, 0x01, 0x23, 0x80, + 0x43, 0xdb, 0x40, 0x19, 0x70, 0x01, 0x98, 0x00, + 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, + 0x98, 0x00, 0x28, 0x02, 0xd1, 0x00, 0xe0, 0x00, + 0xe7, 0xe4, 0xe0, 0x88, 0x98, 0x05, 0x68, 0x00, + 0x4b, 0x4f, 0x40, 0x18, 0x99, 0x05, 0x60, 0x08, + 0x20, 0x00, 0x60, 0xb0, 0x20, 0x00, 0x70, 0xf0, + 0x20, 0x00, 0x60, 0xf0, 0x98, 0x04, 0x78, 0x40, + 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, 0x98, 0x04, + 0x78, 0x40, 0x21, 0x20, 0x40, 0x01, 0x91, 0x03, + 0x98, 0x02, 0x28, 0x13, 0xd0, 0x4c, 0x27, 0x00, + 0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x47, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x3b, + 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x3e, 0x00, 0xb8, + 0x49, 0x39, 0x58, 0x0c, 0x20, 0x80, 0x70, 0x60, + 0x99, 0x03, 0x1c, 0x20, 0xf7, 0xfd, 0xfb, 0x30, + 0x78, 0xa0, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x28, + 0x6a, 0xe0, 0x22, 0x00, 0x92, 0x01, 0x99, 0x01, + 0x29, 0x08, 0xdb, 0x06, 0xe0, 0x1f, 0x99, 0x01, + 0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x91, 0x01, + 0xe7, 0xf5, 0x99, 0x01, 0x00, 0x89, 0x18, 0x09, + 0x68, 0x49, 0x9a, 0x01, 0x00, 0x92, 0x18, 0x12, + 0x64, 0x51, 0x22, 0x00, 0x99, 0x01, 0x00, 0x89, + 0x18, 0x09, 0x62, 0x4a, 0x99, 0x01, 0x00, 0x89, + 0x18, 0x09, 0x6c, 0x49, 0x29, 0x00, 0xd0, 0x05, + 0x9a, 0x01, 0x21, 0x80, 0x41, 0x11, 0x88, 0x02, + 0x43, 0x11, 0x80, 0x01, 0xe7, 0xdf, 0x88, 0x01, + 0x80, 0x41, 0x78, 0xa0, 0x23, 0x20, 0x40, 0x18, + 0xd0, 0x04, 0x98, 0x04, 0x68, 0xc1, 0x1c, 0x20, + 0xf0, 0x00, 0xfa, 0x3d, 0xe7, 0xb7, 0xe0, 0x1e, + 0x27, 0x00, 0x2f, 0x10, 0xdb, 0x04, 0xe0, 0x1a, + 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, + 0x48, 0x16, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x11, + 0x00, 0xb8, 0x49, 0x15, 0x58, 0x0c, 0x20, 0x80, + 0x70, 0x60, 0x99, 0x03, 0x1c, 0x20, 0xf7, 0xfd, + 0xfa, 0xe3, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x02, + 0xd1, 0x00, 0xe0, 0x00, 0xe7, 0xe4, 0xe0, 0x02, + 0x20, 0xbc, 0xb0, 0x07, 0xe6, 0xbe, 0x98, 0x06, + 0x99, 0x04, 0x70, 0xc8, 0x20, 0x00, 0xb0, 0x07, + 0xe6, 0xb8, 0xb0, 0x06, 0xb0, 0x01, 0xe6, 0xb5, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x38, + 0x2e, 0x08, 0x9b, 0x30, 0x2e, 0x08, 0x9d, 0x10, + 0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x9d, 0x30, + 0x2e, 0x08, 0x9c, 0xd0, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xb4, 0x90, 0x1c, 0x03, + 0x1c, 0x0a, 0x06, 0x11, 0x0e, 0x09, 0x29, 0x20, + 0xdd, 0x02, 0x20, 0xa2, 0xbc, 0x90, 0x47, 0x70, + 0x00, 0x88, 0x4c, 0x05, 0x58, 0x20, 0x1c, 0x07, + 0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x78, 0xf8, + 0x70, 0x18, 0x20, 0x00, 0xe7, 0xf2, 0xe7, 0xf1, + 0x2e, 0x08, 0x9b, 0xc8, 0xb4, 0x90, 0x1c, 0x02, + 0x1c, 0x0f, 0x06, 0x38, 0x16, 0x04, 0x2a, 0x02, + 0xda, 0x02, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70, + 0x2c, 0x01, 0xd1, 0x01, 0x21, 0x28, 0xe0, 0x09, + 0x2c, 0x02, 0xd1, 0x01, 0x21, 0x20, 0xe0, 0x05, + 0x2c, 0x00, 0xd1, 0x01, 0x21, 0x0c, 0xe0, 0x01, + 0x20, 0x00, 0xe7, 0xef, 0x00, 0x50, 0x18, 0x80, + 0x01, 0x80, 0x18, 0x41, 0x1c, 0xc8, 0x08, 0x81, + 0x1c, 0x08, 0xe7, 0xe7, 0xe7, 0xe6, 0xb5, 0xf7, + 0x1c, 0x07, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x11, + 0x0e, 0x09, 0x91, 0x00, 0xb0, 0x84, 0x99, 0x04, + 0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x05, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x99, 0x04, 0x00, 0x88, 0x49, 0x29, 0x58, 0x08, + 0x1c, 0x06, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x05, + 0xe7, 0xf2, 0x2f, 0x00, 0xd1, 0x02, 0x20, 0xb4, + 0xb0, 0x05, 0xe7, 0xed, 0x4b, 0x24, 0x42, 0x9f, + 0xd1, 0x0a, 0x78, 0xf0, 0x28, 0x00, 0xd0, 0x02, + 0x20, 0xbc, 0xb0, 0x05, 0xe7, 0xe4, 0x20, 0x00, + 0x60, 0xf0, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0xdf, + 0x68, 0xf0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0xb4, + 0xb0, 0x05, 0xe7, 0xd9, 0x99, 0x06, 0x00, 0x88, + 0x1f, 0xc1, 0x39, 0x19, 0x91, 0x02, 0x20, 0xff, + 0x30, 0x81, 0x90, 0x01, 0x99, 0x02, 0x98, 0x01, + 0x42, 0x81, 0xda, 0x02, 0x20, 0xb5, 0xb0, 0x05, + 0xe7, 0xca, 0x1c, 0x3c, 0x60, 0xf4, 0x37, 0x14, + 0x1c, 0x3d, 0x37, 0x0c, 0x60, 0x2f, 0x99, 0x06, + 0x60, 0x69, 0x20, 0x00, 0x60, 0xa8, 0x97, 0x03, + 0x20, 0x00, 0x60, 0xe0, 0x1d, 0xe0, 0x30, 0x05, + 0x9a, 0x03, 0x99, 0x02, 0xf0, 0x00, 0xf9, 0x56, + 0x90, 0x00, 0x20, 0x00, 0x70, 0xa0, 0x98, 0x00, + 0x60, 0x60, 0x9a, 0x03, 0x60, 0xa2, 0x61, 0x25, + 0x99, 0x04, 0x20, 0x54, 0xf7, 0xff, 0xfd, 0xa0, + 0xb0, 0x05, 0xe7, 0xa9, 0xb0, 0x04, 0xb0, 0x01, + 0xe7, 0xa6, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xc8, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0xff, 0xb0, 0x83, + 0x9a, 0x05, 0x06, 0x11, 0x0e, 0x09, 0x91, 0x00, + 0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, + 0x98, 0x0c, 0x06, 0x01, 0x0e, 0x09, 0x91, 0x02, + 0xb0, 0x85, 0x99, 0x05, 0x29, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x08, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x08, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0xb4, 0xb0, 0x08, 0xe7, 0xf5, + 0x99, 0x05, 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, + 0x49, 0x83, 0x68, 0x09, 0x18, 0x47, 0x98, 0x08, + 0x4b, 0x82, 0x42, 0x98, 0xd1, 0x73, 0x99, 0x05, + 0x00, 0x88, 0x49, 0x81, 0x58, 0x08, 0x1c, 0x05, + 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x08, 0xe7, 0xe1, + 0x68, 0xe8, 0x28, 0x00, 0xd1, 0x02, 0x78, 0xe8, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0xbc, 0xb0, 0x08, + 0xe7, 0xd8, 0x78, 0xa8, 0x28, 0x00, 0xd0, 0x54, + 0x20, 0x00, 0x42, 0x80, 0xd0, 0x1d, 0x24, 0x00, + 0x2c, 0x20, 0xdb, 0x04, 0xe0, 0x18, 0x1c, 0x60, + 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x48, 0x73, + 0x5d, 0x00, 0x99, 0x05, 0x42, 0x88, 0xd1, 0x0e, + 0x20, 0x01, 0x40, 0xa0, 0x43, 0xc0, 0x49, 0x70, + 0x68, 0x09, 0x40, 0x08, 0x49, 0x6e, 0x60, 0x08, + 0x20, 0x00, 0x00, 0xa1, 0x4a, 0x6d, 0x50, 0x50, + 0x20, 0xff, 0x49, 0x6a, 0x55, 0x08, 0xe7, 0xe6, + 0xe0, 0x33, 0x4a, 0x6b, 0x92, 0x03, 0x7e, 0x38, + 0x1c, 0x06, 0x28, 0xff, 0xd0, 0x14, 0x20, 0x00, + 0x00, 0xb1, 0x4a, 0x68, 0x50, 0x50, 0x20, 0x01, + 0x40, 0xb0, 0x43, 0xc0, 0x49, 0x66, 0x68, 0x09, + 0x40, 0x08, 0x49, 0x65, 0x60, 0x08, 0x20, 0xff, + 0x76, 0x38, 0x21, 0xff, 0x48, 0x63, 0x55, 0x81, + 0x21, 0x00, 0x00, 0xb0, 0x9a, 0x03, 0x50, 0x11, + 0x7e, 0x78, 0x1c, 0x06, 0x28, 0xff, 0xd0, 0x14, + 0x21, 0x00, 0x00, 0xb0, 0x4a, 0x5b, 0x50, 0x11, + 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, 0x49, 0x5a, + 0x68, 0x09, 0x40, 0x08, 0x49, 0x58, 0x60, 0x08, + 0x20, 0xff, 0x76, 0x78, 0x20, 0xff, 0x49, 0x51, + 0x55, 0x88, 0x21, 0x00, 0x00, 0xb0, 0x9a, 0x03, + 0x50, 0x11, 0x20, 0x00, 0x99, 0x05, 0x00, 0x89, + 0x4a, 0x4b, 0x50, 0x50, 0x24, 0x00, 0x2c, 0x0c, + 0xdb, 0x06, 0xe0, 0x09, 0xe0, 0x00, 0xe0, 0x0e, + 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf6, + 0x20, 0x00, 0x19, 0x39, 0x73, 0x08, 0xe7, 0xf7, + 0x20, 0x00, 0x83, 0x38, 0x20, 0x00, 0x70, 0xf8, + 0x20, 0x00, 0xb0, 0x08, 0xe7, 0x66, 0x99, 0x05, + 0x00, 0x88, 0x49, 0x3f, 0x58, 0x08, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0xb0, 0xb0, 0x08, 0xe7, 0x5d, + 0x99, 0x07, 0x29, 0x11, 0xdb, 0x02, 0x99, 0x07, + 0x29, 0x13, 0xdd, 0x02, 0x20, 0xb1, 0xb0, 0x08, + 0xe7, 0x54, 0x99, 0x09, 0x00, 0x88, 0x1f, 0xc1, + 0x39, 0x21, 0x91, 0x01, 0x20, 0xff, 0x30, 0x81, + 0x90, 0x00, 0x99, 0x01, 0x98, 0x00, 0x42, 0x81, + 0xda, 0x02, 0x20, 0xb5, 0xb0, 0x08, 0xe7, 0x45, + 0x9d, 0x08, 0x98, 0x08, 0x30, 0x1c, 0x90, 0x08, + 0x98, 0x08, 0x90, 0x04, 0x98, 0x08, 0x30, 0x0c, + 0x90, 0x08, 0x98, 0x08, 0x90, 0x02, 0x9a, 0x02, + 0x98, 0x04, 0x60, 0x02, 0x99, 0x09, 0x98, 0x04, + 0x60, 0x41, 0x20, 0x00, 0x99, 0x04, 0x60, 0x88, + 0x20, 0x00, 0x61, 0xa8, 0x1d, 0xe8, 0x30, 0x11, + 0x9a, 0x02, 0x99, 0x01, 0xf0, 0x00, 0xf8, 0x56, + 0x20, 0x00, 0x70, 0x28, 0x98, 0x06, 0x99, 0x07, + 0x43, 0x08, 0x70, 0x68, 0x20, 0x00, 0x70, 0xa8, + 0x20, 0x02, 0x70, 0xe8, 0x20, 0x00, 0x71, 0x28, + 0x98, 0x04, 0x60, 0xa8, 0x20, 0x00, 0x60, 0xe8, + 0x9a, 0x02, 0x61, 0x2a, 0x9a, 0x02, 0x61, 0x6a, + 0x99, 0x05, 0x00, 0x88, 0x49, 0x16, 0x50, 0x0d, + 0x20, 0x00, 0x60, 0xf8, 0x88, 0x38, 0x4b, 0x1c, + 0x40, 0x18, 0x80, 0x38, 0x20, 0x00, 0x60, 0xb8, + 0x9a, 0x02, 0x60, 0x7a, 0x98, 0x06, 0x99, 0x07, + 0x43, 0x08, 0x70, 0xb8, 0x24, 0x00, 0x2c, 0x0c, + 0xdb, 0x04, 0xe0, 0x07, 0x1c, 0x60, 0x06, 0x04, + 0x0e, 0x24, 0xe7, 0xf8, 0x20, 0x00, 0x19, 0x39, + 0x74, 0x08, 0xe7, 0xf7, 0x20, 0x00, 0x83, 0x38, + 0x20, 0x00, 0x70, 0xf8, 0x20, 0xff, 0x76, 0x38, + 0x20, 0xff, 0x76, 0x78, 0x20, 0x00, 0xb0, 0x08, + 0xe6, 0xec, 0xb0, 0x05, 0xb0, 0x03, 0xe6, 0xe9, + 0x2e, 0x08, 0x9b, 0x30, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9d, 0x10, + 0x2e, 0x08, 0x9c, 0x48, 0x2e, 0x08, 0x9c, 0x50, + 0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x9c, 0xd0, + 0x2e, 0x08, 0x9c, 0x4c, 0x2e, 0x08, 0x9d, 0x30, + 0xff, 0xff, 0xfb, 0xff, 0xb4, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0x1c, 0x13, 0x21, 0x00, 0x68, 0x22, + 0x2a, 0x00, 0xd0, 0x00, 0x60, 0x13, 0x1d, 0xd8, + 0x30, 0xb9, 0x60, 0x18, 0x33, 0xc0, 0x31, 0x01, + 0x3f, 0xc0, 0x2f, 0xc0, 0xd8, 0xf7, 0x20, 0x00, + 0x60, 0x18, 0x60, 0x23, 0x31, 0x01, 0x1c, 0x08, + 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0xb4, 0x90, + 0x1c, 0x03, 0x1c, 0x0a, 0x6b, 0x18, 0x68, 0xd1, + 0x68, 0x07, 0x2f, 0x00, 0xd0, 0x0c, 0x68, 0x07, + 0x60, 0x0f, 0x68, 0x41, 0x68, 0x57, 0x68, 0x84, + 0x19, 0x3f, 0x60, 0x57, 0x27, 0x00, 0x60, 0x07, + 0x27, 0x00, 0x60, 0x47, 0x27, 0x00, 0x60, 0x87, + 0x6a, 0xc7, 0x2f, 0x00, 0xd0, 0x0c, 0x6a, 0xc7, + 0x60, 0x0f, 0x6b, 0x01, 0x68, 0x57, 0x6b, 0x44, + 0x19, 0x3f, 0x60, 0x57, 0x27, 0x00, 0x62, 0xc7, + 0x27, 0x00, 0x63, 0x07, 0x27, 0x00, 0x63, 0x47, + 0x60, 0xd1, 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, + 0x20, 0x00, 0x49, 0x01, 0x70, 0x08, 0x47, 0x70, + 0x2e, 0x08, 0xb9, 0x80, 0xb5, 0xff, 0xb0, 0x82, + 0x9b, 0x05, 0x06, 0x18, 0x16, 0x00, 0x90, 0x00, + 0x98, 0x0c, 0x06, 0x01, 0x16, 0x09, 0x91, 0x01, + 0x98, 0x00, 0x28, 0x1f, 0xdd, 0x05, 0x20, 0xaf, + 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x48, 0x37, 0x78, 0x00, 0x28, 0x00, + 0xd0, 0x03, 0x20, 0xd2, 0xb0, 0x02, 0xe7, 0xf4, + 0xe0, 0x64, 0x20, 0xff, 0x49, 0x32, 0x70, 0x08, + 0x49, 0x32, 0x98, 0x00, 0xf0, 0x0a, 0xff, 0x04, + 0x9a, 0x04, 0x2a, 0x00, 0xd9, 0x52, 0x20, 0xff, + 0x49, 0x2f, 0x70, 0x08, 0x9d, 0x02, 0x98, 0x0b, + 0x99, 0x01, 0x18, 0x44, 0x99, 0x01, 0x20, 0xc0, + 0x1a, 0x40, 0x9a, 0x04, 0x42, 0x90, 0xd9, 0x01, + 0x9f, 0x04, 0xe0, 0x02, 0x99, 0x01, 0x20, 0xc0, + 0x1a, 0x47, 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, + 0x23, 0xfe, 0xf0, 0x05, 0xfa, 0xa5, 0x1c, 0x06, + 0x2e, 0xd0, 0xd1, 0x0a, 0x20, 0x03, 0xf0, 0x04, + 0xf9, 0xa9, 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, + 0x23, 0xfe, 0xf0, 0x05, 0xfa, 0x99, 0x1c, 0x06, + 0xe7, 0xf2, 0x98, 0x02, 0x19, 0xc0, 0x90, 0x02, + 0x9a, 0x04, 0x1b, 0xd2, 0x92, 0x04, 0x9d, 0x0b, + 0x9c, 0x03, 0x9b, 0x00, 0x1c, 0x3a, 0x1c, 0x21, + 0x1c, 0x28, 0xf0, 0x05, 0xfa, 0x89, 0x1c, 0x06, + 0x2e, 0xd0, 0xd1, 0x0a, 0x20, 0x03, 0xf0, 0x04, + 0xf9, 0x8d, 0x9b, 0x00, 0x1c, 0x3a, 0x1c, 0x21, + 0x1c, 0x28, 0xf0, 0x05, 0xfa, 0x7d, 0x1c, 0x06, + 0xe7, 0xf2, 0x99, 0x03, 0x29, 0x20, 0xd3, 0x04, + 0x99, 0x01, 0x18, 0x78, 0x99, 0x03, 0x18, 0x41, + 0x91, 0x03, 0x48, 0x0b, 0x78, 0x00, 0x28, 0x00, + 0xd0, 0x03, 0x20, 0x03, 0xf0, 0x04, 0xf9, 0x76, + 0xe7, 0xf7, 0xe7, 0xa9, 0x20, 0x00, 0x49, 0x04, + 0x70, 0x08, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x90, + 0xb0, 0x02, 0xe7, 0x8e, 0xe7, 0x8d, 0x00, 0x00, + 0x2e, 0x08, 0x20, 0x20, 0x2e, 0x01, 0x8b, 0x35, + 0x2e, 0x08, 0xb9, 0x80, 0xb5, 0xff, 0x1c, 0x0f, + 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, 0x9b, 0x03, + 0x06, 0x1d, 0x0e, 0x2d, 0x2c, 0x1f, 0xdb, 0x04, + 0x20, 0xb3, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x04, 0x3a, 0x0c, 0x12, 0x2d, 0x01, + 0xd1, 0x73, 0x20, 0x01, 0x03, 0x40, 0x40, 0x10, + 0xd0, 0x0a, 0x4b, 0x6f, 0x40, 0x1a, 0x48, 0x6f, + 0x68, 0x00, 0x68, 0x00, 0x23, 0x02, 0x43, 0xdb, + 0x40, 0x18, 0x4b, 0x6c, 0x68, 0x1b, 0x60, 0x18, + 0x20, 0x01, 0x02, 0x40, 0x40, 0x10, 0xd0, 0x0a, + 0x4b, 0x69, 0x40, 0x1a, 0x48, 0x67, 0x68, 0x00, + 0x68, 0x00, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, + 0x4b, 0x64, 0x68, 0x1b, 0x60, 0x18, 0x20, 0x01, + 0x05, 0x00, 0x40, 0x38, 0xd0, 0x08, 0x48, 0x63, + 0x68, 0x00, 0x69, 0x80, 0x23, 0x01, 0x05, 0x1b, + 0x43, 0x18, 0x4b, 0x60, 0x68, 0x1b, 0x61, 0x98, + 0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x08, + 0x48, 0x5c, 0x68, 0x00, 0x69, 0x80, 0x23, 0x01, + 0x05, 0x5b, 0x43, 0x18, 0x4b, 0x59, 0x68, 0x1b, + 0x61, 0x98, 0x0a, 0x12, 0x48, 0x55, 0x68, 0x00, + 0x68, 0x00, 0x43, 0x90, 0x4b, 0x53, 0x68, 0x1b, + 0x60, 0x18, 0x48, 0x52, 0x68, 0x00, 0x68, 0x00, + 0x4b, 0x53, 0x65, 0x18, 0x48, 0x51, 0x68, 0x00, + 0x77, 0x04, 0x20, 0x09, 0x04, 0x80, 0x40, 0x38, + 0xd0, 0x35, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, + 0xe0, 0x31, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x20, 0x01, 0x40, 0x88, 0x9b, 0x00, + 0x40, 0x18, 0xd0, 0x27, 0x20, 0x01, 0x05, 0x40, + 0x40, 0x38, 0xd0, 0x0e, 0x00, 0xc8, 0x1a, 0x40, + 0x00, 0x80, 0x4b, 0x46, 0x68, 0x1b, 0x5a, 0x18, + 0x23, 0xff, 0x33, 0x01, 0x43, 0x18, 0x00, 0xcb, + 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x41, 0x68, 0x36, + 0x52, 0xf0, 0x20, 0x01, 0x04, 0x80, 0x40, 0x38, + 0xd0, 0x10, 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, + 0xe0, 0x00, 0xe0, 0x0d, 0x4b, 0x3b, 0x68, 0x1b, + 0x5a, 0x18, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, + 0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x37, + 0x68, 0x36, 0x52, 0xf0, 0xe7, 0xcd, 0xe0, 0x5c, + 0x2d, 0x02, 0xd1, 0x5a, 0x0a, 0x12, 0x48, 0x2f, + 0x68, 0x00, 0x68, 0x00, 0x43, 0x10, 0x4b, 0x2d, + 0x68, 0x1b, 0x60, 0x18, 0x48, 0x2b, 0x68, 0x00, + 0x68, 0x00, 0x4b, 0x2d, 0x65, 0x18, 0x20, 0x01, + 0x05, 0x00, 0x40, 0x38, 0xd0, 0x07, 0x48, 0x29, + 0x68, 0x00, 0x69, 0x80, 0x4b, 0x2a, 0x40, 0x18, + 0x4b, 0x26, 0x68, 0x1b, 0x61, 0x98, 0x20, 0x01, + 0x05, 0x40, 0x40, 0x38, 0xd0, 0x07, 0x48, 0x23, + 0x68, 0x00, 0x69, 0x80, 0x4b, 0x25, 0x40, 0x18, + 0x4b, 0x20, 0x68, 0x1b, 0x61, 0x98, 0x21, 0x00, + 0x29, 0x20, 0xdb, 0x04, 0xe0, 0x31, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x09, + 0x04, 0x80, 0x40, 0x38, 0xd0, 0x28, 0x20, 0x01, + 0x40, 0x88, 0x9b, 0x00, 0x40, 0x18, 0xd0, 0x23, + 0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x0d, + 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, 0x4b, 0x15, + 0x68, 0x1b, 0x5a, 0x18, 0x4b, 0x16, 0x40, 0x18, + 0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x11, + 0x68, 0x36, 0x52, 0xf0, 0x20, 0x01, 0x04, 0x80, + 0x40, 0x38, 0xd0, 0x0d, 0x00, 0xc8, 0x1a, 0x40, + 0x00, 0x80, 0x4b, 0x0c, 0x68, 0x1b, 0x5a, 0x18, + 0x4b, 0x05, 0x40, 0x18, 0x00, 0xcb, 0x1a, 0x5b, + 0x00, 0x9b, 0x4e, 0x08, 0x68, 0x36, 0x52, 0xf0, + 0xe7, 0xcd, 0x20, 0x00, 0xe7, 0x15, 0xe7, 0x14, + 0xff, 0xff, 0xfd, 0xff, 0x2e, 0x08, 0xb9, 0x84, + 0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x9b, 0x78, + 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x9b, 0x30, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xb5, 0x80, 0x1c, 0x07, + 0x48, 0x17, 0x68, 0x01, 0x20, 0x00, 0xf0, 0x13, + 0xfc, 0xa3, 0x60, 0x38, 0x48, 0x14, 0x68, 0x00, + 0x1d, 0x01, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x9c, + 0x60, 0x78, 0x48, 0x11, 0x68, 0x00, 0x1d, 0xc1, + 0x31, 0x05, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x94, + 0x60, 0xf8, 0x48, 0x0d, 0x68, 0x00, 0x1d, 0xc1, + 0x31, 0x09, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x8c, + 0x61, 0x38, 0x48, 0x09, 0x68, 0x00, 0x1d, 0xc1, + 0x31, 0x0d, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x84, + 0x61, 0x78, 0x48, 0x05, 0x68, 0x00, 0x1d, 0xc1, + 0x31, 0x01, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x7c, + 0x60, 0xb8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x9b, 0x78, 0xb5, 0xf0, 0x1c, 0x07, + 0xb0, 0x82, 0x26, 0x00, 0x89, 0xb8, 0x23, 0x08, + 0x40, 0x18, 0xd0, 0x08, 0x48, 0x59, 0x6e, 0xc2, + 0x48, 0x58, 0x6f, 0x01, 0x48, 0x57, 0x6a, 0x00, + 0xf7, 0xfd, 0xff, 0x5c, 0x1c, 0x06, 0x89, 0xb8, + 0x23, 0x10, 0x40, 0x18, 0xd0, 0x02, 0x48, 0x53, + 0x69, 0x40, 0x1c, 0x06, 0x89, 0xb8, 0x07, 0xc0, + 0x0f, 0xc0, 0xd0, 0x21, 0x48, 0x50, 0x68, 0xc0, + 0x90, 0x00, 0x68, 0x78, 0x02, 0x40, 0x99, 0x00, + 0x1a, 0x08, 0x90, 0x01, 0x98, 0x01, 0x21, 0x33, + 0x06, 0x49, 0x65, 0xc8, 0x98, 0x00, 0x21, 0x33, + 0x06, 0x49, 0x66, 0x08, 0x98, 0x01, 0x49, 0x48, + 0x60, 0x88, 0x98, 0x00, 0x49, 0x46, 0x60, 0xc8, + 0x20, 0x01, 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, + 0x20, 0x00, 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, + 0x89, 0xb8, 0x23, 0x02, 0x43, 0x18, 0x81, 0xb8, + 0x89, 0xb8, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x3e, + 0x48, 0x3d, 0x68, 0x80, 0x1f, 0xc4, 0x3c, 0xff, + 0x3c, 0xfa, 0x68, 0x38, 0x02, 0x40, 0x1a, 0x25, + 0x48, 0x38, 0x60, 0x45, 0x48, 0x37, 0x60, 0x84, + 0x20, 0x33, 0x06, 0x40, 0x65, 0x45, 0x20, 0x33, + 0x06, 0x40, 0x65, 0x84, 0x1b, 0x60, 0x38, 0xc0, + 0x21, 0x33, 0x06, 0x49, 0x66, 0x88, 0x21, 0x00, + 0x48, 0x32, 0xf7, 0xfd, 0xfb, 0x89, 0x48, 0x32, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x00, 0xe7, 0xfa, + 0x48, 0x30, 0x68, 0x01, 0x23, 0xff, 0x33, 0x01, + 0x43, 0x19, 0x60, 0x01, 0x48, 0x2e, 0x6d, 0x80, + 0x49, 0x2d, 0x65, 0x88, 0x48, 0x2c, 0x6b, 0xc0, + 0x23, 0x01, 0x07, 0x9b, 0x40, 0x18, 0xd0, 0x00, + 0xe7, 0xf8, 0x20, 0x33, 0x06, 0x40, 0x66, 0x45, + 0x20, 0x33, 0x06, 0x40, 0x66, 0x84, 0x21, 0x00, + 0x20, 0xff, 0xf7, 0xfd, 0xfb, 0x69, 0x48, 0x20, + 0x60, 0x05, 0x48, 0x1f, 0x60, 0x44, 0x89, 0xb8, + 0x23, 0x04, 0x40, 0x18, 0xd0, 0x21, 0x68, 0xb8, + 0x28, 0x00, 0xd1, 0x06, 0x48, 0x1f, 0x68, 0x01, + 0x23, 0x02, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, + 0xe0, 0x17, 0x69, 0x38, 0x49, 0x1a, 0x65, 0x88, + 0x69, 0x38, 0x68, 0xb9, 0x02, 0x49, 0x18, 0x40, + 0x49, 0x17, 0x65, 0xc8, 0x20, 0x03, 0x02, 0x00, + 0x49, 0x15, 0x67, 0x48, 0x20, 0x02, 0x49, 0x14, + 0x67, 0x88, 0x20, 0x40, 0x49, 0x12, 0x66, 0x08, + 0x48, 0x12, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, + 0x60, 0x01, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, + 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x60, 0x38, + 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d, + 0x06, 0x9b, 0x1a, 0xc0, 0x60, 0x78, 0x48, 0x0a, + 0x43, 0x30, 0x60, 0xb8, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0f, 0x80, + 0x2e, 0x08, 0xb9, 0x88, 0x00, 0x00, 0x80, 0x0f, + 0xcc, 0x00, 0x05, 0x00, 0x66, 0x00, 0x00, 0xe0, + 0x66, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0xf0, + 0xcc, 0x00, 0x00, 0x00, 0xb5, 0xf3, 0x1c, 0x02, + 0xb0, 0x81, 0x68, 0x93, 0x68, 0x54, 0x21, 0x00, + 0x1d, 0xd8, 0x30, 0xb9, 0x1b, 0x00, 0x06, 0x05, + 0x0e, 0x2d, 0x2d, 0x12, 0xda, 0x12, 0x21, 0x00, + 0x42, 0xa9, 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x78, 0x26, + 0x34, 0x01, 0x98, 0x02, 0x54, 0x46, 0xe7, 0xf6, + 0x68, 0x1b, 0x1d, 0x18, 0x90, 0x00, 0x98, 0x00, + 0x78, 0x80, 0x18, 0xc4, 0x1c, 0x0f, 0x2f, 0x12, + 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0xe7, 0xf8, 0x78, 0x26, 0x34, 0x01, + 0x98, 0x02, 0x55, 0xc6, 0xe7, 0xf6, 0x20, 0x00, + 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0xb4, 0xf0, + 0x1c, 0x07, 0x1c, 0x0d, 0x1c, 0x14, 0xb0, 0x82, + 0x20, 0x00, 0x70, 0x20, 0x78, 0x78, 0x23, 0x80, + 0x40, 0x18, 0xd0, 0x03, 0x20, 0xb1, 0xb0, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x78, 0xba, 0x20, 0x40, + 0x40, 0x10, 0xd0, 0x2a, 0x07, 0x12, 0x0f, 0x12, + 0x07, 0xd0, 0x0f, 0xc0, 0xd0, 0x25, 0x20, 0x40, + 0x70, 0x20, 0x35, 0x0a, 0x21, 0x00, 0x1d, 0xf8, + 0x30, 0x0d, 0x90, 0x01, 0x1d, 0xf8, 0x30, 0x1d, + 0x90, 0x00, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, + 0xe0, 0x14, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x78, 0x2e, 0x35, 0x01, 0x98, 0x00, + 0x78, 0x03, 0x30, 0x01, 0x90, 0x00, 0x40, 0x33, + 0x98, 0x01, 0x78, 0x06, 0x30, 0x01, 0x90, 0x01, + 0x42, 0xb3, 0xd0, 0x02, 0x20, 0x00, 0x70, 0x20, + 0xe0, 0x00, 0xe7, 0xea, 0x20, 0x00, 0xb0, 0x02, + 0xe7, 0xce, 0x20, 0xb1, 0xb0, 0x02, 0xe7, 0xcb, + 0xb0, 0x02, 0xe7, 0xc9, 0xb5, 0xf7, 0x1c, 0x07, + 0xb0, 0x8d, 0x20, 0x00, 0x9a, 0x0f, 0x70, 0x10, + 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x05, + 0x20, 0xb1, 0xb0, 0x0d, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x78, 0xb8, 0x90, 0x05, + 0x98, 0x05, 0x23, 0x40, 0x40, 0x18, 0xd0, 0x73, + 0x98, 0x05, 0x07, 0x00, 0x0f, 0x00, 0x90, 0x05, + 0x98, 0x05, 0x23, 0x02, 0x40, 0x18, 0xd1, 0x03, + 0x98, 0x05, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x68, + 0x99, 0x0e, 0x79, 0x48, 0x23, 0x3e, 0x40, 0x18, + 0x90, 0x0c, 0x78, 0xf8, 0x90, 0x04, 0x98, 0x04, + 0x01, 0x00, 0x4b, 0x81, 0x18, 0xc0, 0x90, 0x02, + 0x98, 0x02, 0x68, 0x00, 0x90, 0x01, 0x78, 0x7c, + 0x23, 0xbf, 0x40, 0x1c, 0x23, 0xfe, 0x40, 0x1c, + 0x20, 0x00, 0x90, 0x03, 0x98, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x99, 0x0c, 0x42, 0x88, 0xd0, 0x08, + 0x06, 0x20, 0x0e, 0x00, 0x24, 0x01, 0x43, 0x04, + 0x20, 0x01, 0x90, 0x03, 0x23, 0xdf, 0x40, 0x1c, + 0xe0, 0x06, 0x20, 0x02, 0x40, 0x20, 0xd0, 0x03, + 0x70, 0x7c, 0x20, 0x00, 0xb0, 0x0d, 0xe7, 0xbd, + 0x23, 0xfd, 0x40, 0x1c, 0x98, 0x05, 0x23, 0x04, + 0x40, 0x18, 0xd0, 0x73, 0x6a, 0xfd, 0x98, 0x03, + 0x28, 0x00, 0xd0, 0x14, 0x26, 0x00, 0x2e, 0x08, + 0xdb, 0x04, 0xe0, 0x0e, 0x1c, 0x70, 0x06, 0x06, + 0x0e, 0x36, 0xe7, 0xf8, 0x00, 0xb0, 0x19, 0x40, + 0x68, 0x40, 0x00, 0xb1, 0x19, 0x49, 0x64, 0x48, + 0x20, 0x00, 0x00, 0xb1, 0x19, 0x49, 0x62, 0x48, + 0xe7, 0xf0, 0x88, 0x28, 0x80, 0x68, 0x20, 0x20, + 0x40, 0x20, 0xd1, 0x3e, 0x99, 0x0e, 0x79, 0xc8, + 0x09, 0x40, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x0a, + 0x99, 0x0e, 0x79, 0xc8, 0x06, 0xc0, 0x0e, 0xc0, + 0x90, 0x09, 0x98, 0x0a, 0x30, 0x01, 0x06, 0x06, + 0x0e, 0x36, 0x2e, 0x08, 0xdb, 0x04, 0xe0, 0x10, + 0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0xe7, 0xf8, + 0x20, 0x00, 0x00, 0xb1, 0x19, 0x49, 0xe0, 0x01, + 0xe0, 0x9d, 0xe0, 0x9c, 0x64, 0x48, 0x88, 0x68, + 0x21, 0x80, 0x41, 0x31, 0x43, 0x88, 0x80, 0x68, + 0xe7, 0xee, 0x98, 0x0a, 0x00, 0x80, 0x19, 0x40, + 0x6c, 0x41, 0x98, 0x09, 0x00, 0x80, 0x4a, 0x4b, + 0x58, 0x10, 0x40, 0x08, 0x99, 0x0a, 0x00, 0x89, + 0x19, 0x49, 0x64, 0x48, 0x06, 0x20, 0x0e, 0x00, + 0x24, 0x20, 0x43, 0x04, 0x98, 0x01, 0x0a, 0x00, + 0x02, 0x00, 0x90, 0x01, 0x98, 0x01, 0x99, 0x0c, + 0x43, 0x08, 0x90, 0x01, 0x98, 0x01, 0x99, 0x02, + 0x60, 0x08, 0x78, 0x38, 0x23, 0x80, 0x40, 0x18, + 0xd0, 0x19, 0x99, 0x0e, 0x7b, 0x08, 0x07, 0x42, + 0x0f, 0x52, 0x92, 0x07, 0x99, 0x0e, 0x7b, 0x08, + 0x08, 0xc0, 0x06, 0x02, 0x0e, 0x12, 0x92, 0x08, + 0x1d, 0xe9, 0x31, 0x3d, 0x91, 0x06, 0x99, 0x06, + 0x9a, 0x08, 0x5c, 0x88, 0x49, 0x36, 0x9a, 0x07, + 0x5c, 0x89, 0xe0, 0x00, 0xe0, 0x4e, 0x40, 0x08, + 0x99, 0x06, 0x9a, 0x08, 0x54, 0x88, 0x99, 0x0e, + 0x79, 0x88, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x00, + 0x98, 0x00, 0x49, 0x30, 0x40, 0xc1, 0x91, 0x00, + 0x99, 0x0e, 0x79, 0x88, 0x09, 0x40, 0x06, 0x02, + 0x0e, 0x12, 0x92, 0x0b, 0x9a, 0x0b, 0x00, 0x90, + 0x19, 0x40, 0x6c, 0x40, 0x99, 0x00, 0x40, 0x08, + 0xd0, 0x33, 0x06, 0x20, 0x0e, 0x00, 0x24, 0x40, + 0x43, 0x04, 0x9a, 0x0b, 0x00, 0x90, 0x19, 0x40, + 0x6c, 0x40, 0x99, 0x00, 0x40, 0x41, 0x00, 0x90, + 0x19, 0x40, 0x64, 0x41, 0x9a, 0x0b, 0x00, 0x90, + 0x19, 0x40, 0x6a, 0x40, 0x99, 0x00, 0x43, 0x01, + 0x00, 0x90, 0x19, 0x40, 0x62, 0x41, 0x9a, 0x0b, + 0x00, 0x90, 0x19, 0x40, 0x6c, 0x40, 0x28, 0x00, + 0xd1, 0x17, 0x88, 0x68, 0x9a, 0x0b, 0x21, 0x80, + 0x41, 0x11, 0x43, 0x88, 0x80, 0x68, 0x88, 0x68, + 0x28, 0x00, 0xd1, 0x0e, 0x06, 0x20, 0x0e, 0x00, + 0x24, 0x02, 0x43, 0x04, 0x23, 0xfe, 0x40, 0x1c, + 0x98, 0x0c, 0x30, 0x02, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x0c, 0x98, 0x0c, 0x23, 0x3e, 0x40, 0x18, + 0x90, 0x0c, 0xe0, 0x0a, 0x06, 0x20, 0x0e, 0x00, + 0x24, 0x40, 0x43, 0x04, 0x23, 0xfe, 0x40, 0x1c, + 0x98, 0x0c, 0x1c, 0x41, 0x98, 0x04, 0xf0, 0x00, + 0xf8, 0x13, 0x9a, 0x0f, 0x70, 0x14, 0x70, 0x7c, + 0x20, 0x00, 0xb0, 0x0d, 0xe6, 0xe2, 0x20, 0xb1, + 0xb0, 0x0d, 0xe6, 0xdf, 0xb0, 0x0d, 0xe6, 0xdd, + 0x64, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x20, 0x90, + 0x2e, 0x08, 0x21, 0x10, 0x80, 0x00, 0x00, 0x00, + 0xb5, 0xf3, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f, + 0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, 0x00, 0xf8, + 0x4b, 0x13, 0x18, 0xc5, 0x01, 0x38, 0x4b, 0x13, + 0x18, 0xc4, 0x01, 0x38, 0x4b, 0x12, 0x18, 0xc2, + 0x68, 0x10, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, + 0x60, 0x10, 0x2e, 0x3e, 0xdc, 0x15, 0x68, 0x20, + 0x1c, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x31, + 0x60, 0x21, 0x68, 0x28, 0x1c, 0x01, 0x0a, 0x09, + 0x02, 0x09, 0x23, 0x3e, 0x43, 0x19, 0x60, 0x29, + 0x68, 0x10, 0x23, 0x40, 0x43, 0x18, 0x60, 0x10, + 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0xbd, 0xe7, 0xf9, 0xe7, 0xf8, + 0x64, 0x00, 0x10, 0x00, 0x64, 0x00, 0x08, 0x00, + 0x64, 0x00, 0x08, 0x08, 0xb5, 0xf3, 0xb0, 0x93, + 0x98, 0x13, 0x69, 0x00, 0x90, 0x01, 0x98, 0x01, + 0x78, 0x40, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x05, + 0x20, 0xbe, 0xb0, 0x13, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x78, 0x80, + 0x90, 0x08, 0x98, 0x08, 0x23, 0x40, 0x40, 0x18, + 0xd0, 0x73, 0x98, 0x08, 0x23, 0x20, 0x40, 0x18, + 0xd0, 0x6f, 0x98, 0x01, 0x6b, 0x07, 0x98, 0x01, + 0x79, 0xc0, 0x00, 0x80, 0x49, 0x76, 0x58, 0x08, + 0x90, 0x00, 0x98, 0x00, 0x68, 0xc0, 0x1c, 0x06, + 0xd1, 0x02, 0x20, 0xb6, 0xb0, 0x13, 0xe7, 0xe1, + 0x78, 0xb0, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x02, + 0x20, 0xb6, 0xb0, 0x13, 0xe7, 0xda, 0xa9, 0x11, + 0x1c, 0x30, 0xf0, 0x00, 0xf9, 0x2b, 0x90, 0x02, + 0x98, 0x11, 0x28, 0x00, 0xd1, 0x02, 0x98, 0x02, + 0xb0, 0x13, 0xe7, 0xcf, 0x98, 0x11, 0x90, 0x0e, + 0x20, 0x01, 0x90, 0x0b, 0x98, 0x13, 0x88, 0x40, + 0x90, 0x0d, 0x98, 0x13, 0x68, 0x40, 0x90, 0x06, + 0x98, 0x13, 0x68, 0x81, 0x91, 0x10, 0x99, 0x10, + 0x1d, 0xc8, 0x30, 0xb9, 0x90, 0x05, 0x98, 0x05, + 0x99, 0x06, 0x1a, 0x40, 0x04, 0x04, 0x0c, 0x24, + 0x99, 0x14, 0x79, 0x88, 0x90, 0x03, 0x98, 0x03, + 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x0a, 0x98, 0x0a, + 0x49, 0x5a, 0x40, 0xc1, 0x91, 0x0a, 0x98, 0x03, + 0x09, 0x40, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x09, + 0x98, 0x09, 0x00, 0x80, 0x19, 0xc0, 0x6b, 0x80, + 0x99, 0x0a, 0x40, 0x08, 0xd0, 0x02, 0x20, 0xb1, + 0xb0, 0x13, 0xe7, 0x9f, 0x20, 0xb8, 0x90, 0x0c, + 0x98, 0x11, 0x30, 0x08, 0x90, 0x04, 0x20, 0x00, + 0x90, 0x07, 0x98, 0x07, 0x28, 0x00, 0xd0, 0x10, + 0x99, 0x10, 0x68, 0x09, 0x91, 0x10, 0x99, 0x10, + 0x1d, 0x08, 0x90, 0x12, 0x98, 0x12, 0x78, 0x80, + 0x99, 0x10, 0x18, 0x40, 0x90, 0x06, 0x98, 0x12, + 0x78, 0x81, 0x20, 0xc0, 0x1a, 0x40, 0x04, 0x04, + 0x0c, 0x24, 0x98, 0x0d, 0x42, 0x84, 0xdb, 0x05, + 0xe0, 0x00, 0xe0, 0x7c, 0x9c, 0x0d, 0x20, 0x00, + 0x90, 0x0d, 0xe0, 0x06, 0x98, 0x0d, 0x1b, 0x00, + 0x04, 0x00, 0x0c, 0x00, 0x90, 0x0d, 0x20, 0x01, + 0x90, 0x07, 0x98, 0x0c, 0x42, 0xa0, 0xda, 0x2e, + 0x25, 0x00, 0x98, 0x0c, 0x42, 0x85, 0xdb, 0x04, + 0xe0, 0x0c, 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, + 0xe7, 0xf7, 0x98, 0x06, 0x78, 0x01, 0x30, 0x01, + 0x90, 0x06, 0x98, 0x04, 0x70, 0x01, 0x30, 0x01, + 0x90, 0x04, 0xe7, 0xf2, 0x98, 0x0c, 0x1a, 0x20, + 0x04, 0x04, 0x0c, 0x24, 0xa9, 0x11, 0x1c, 0x30, + 0xf0, 0x00, 0xf8, 0xac, 0x90, 0x02, 0x98, 0x11, + 0x28, 0x00, 0xd1, 0x08, 0x98, 0x0e, 0x60, 0xb0, + 0x68, 0x70, 0x99, 0x0b, 0x18, 0x40, 0x60, 0x70, + 0x98, 0x02, 0xb0, 0x13, 0xe7, 0x4a, 0x98, 0x0b, + 0x30, 0x01, 0x90, 0x0b, 0x20, 0xb8, 0x90, 0x0c, + 0x98, 0x11, 0x30, 0x08, 0x90, 0x04, 0x25, 0x00, + 0x42, 0xa5, 0xdb, 0x04, 0xe0, 0x0c, 0x1c, 0x68, + 0x06, 0x05, 0x0e, 0x2d, 0xe7, 0xf8, 0x98, 0x06, + 0x78, 0x01, 0x30, 0x01, 0x90, 0x06, 0x98, 0x04, + 0x70, 0x01, 0x30, 0x01, 0x90, 0x04, 0xe7, 0xf2, + 0x98, 0x0c, 0x1b, 0x00, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x0c, 0x98, 0x0d, 0x28, 0x00, 0xd1, 0x90, + 0x6b, 0x39, 0x91, 0x0f, 0x6a, 0xf8, 0x28, 0x00, + 0xd1, 0x02, 0x98, 0x0e, 0x62, 0xf8, 0xe0, 0x05, + 0x98, 0x0e, 0x99, 0x0f, 0x60, 0x08, 0x98, 0x0e, + 0x6d, 0xb9, 0x60, 0x08, 0x98, 0x09, 0x00, 0x80, + 0x19, 0xc0, 0x6b, 0x80, 0x99, 0x0a, 0x43, 0x01, + 0x98, 0x09, 0x00, 0x80, 0x19, 0xc0, 0x63, 0x81, + 0x6b, 0x78, 0x99, 0x0b, 0x18, 0x40, 0x63, 0x78, + 0x20, 0x00, 0x99, 0x11, 0x60, 0x08, 0x98, 0x11, + 0x63, 0x38, 0x98, 0x0e, 0x30, 0x04, 0x65, 0xb8, + 0x98, 0x02, 0xb0, 0x13, 0xe7, 0x02, 0x20, 0xb1, + 0xb0, 0x13, 0xe6, 0xff, 0xb0, 0x13, 0xe6, 0xfd, + 0x2e, 0x08, 0x9b, 0xc8, 0x80, 0x00, 0x00, 0x00, + 0xb4, 0xf0, 0x1c, 0x01, 0x78, 0x88, 0x23, 0x20, + 0x40, 0x18, 0xd0, 0x42, 0x79, 0xc8, 0x00, 0x80, + 0x4b, 0x21, 0x58, 0x1d, 0x6b, 0x0a, 0x68, 0xef, + 0x68, 0x10, 0x28, 0x00, 0xd0, 0x17, 0x68, 0xfe, + 0x68, 0x10, 0x60, 0x30, 0x68, 0x50, 0x60, 0xf8, + 0x68, 0x78, 0x68, 0x93, 0x18, 0xc0, 0x60, 0x78, + 0x20, 0x00, 0x60, 0x10, 0x20, 0x00, 0x60, 0x50, + 0x20, 0x00, 0x60, 0x90, 0x68, 0x78, 0x78, 0x3b, + 0x42, 0x98, 0xd9, 0x04, 0x78, 0xb8, 0x23, 0x02, + 0x43, 0xdb, 0x40, 0x18, 0x70, 0xb8, 0x6a, 0xd0, + 0x60, 0x10, 0x6b, 0x10, 0x60, 0x50, 0x6b, 0x50, + 0x60, 0x90, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04, + 0xe0, 0x0e, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, + 0xe7, 0xf8, 0x00, 0xa0, 0x18, 0x80, 0x6b, 0x80, + 0x00, 0xa3, 0x18, 0x9b, 0x60, 0xd8, 0x23, 0x00, + 0x00, 0xa0, 0x18, 0x80, 0x63, 0x83, 0xe7, 0xf0, + 0x20, 0x00, 0x62, 0xd0, 0x20, 0x00, 0x63, 0x10, + 0x20, 0x00, 0x63, 0x50, 0x20, 0x00, 0xbc, 0xf0, + 0x47, 0x70, 0x20, 0xb1, 0xe7, 0xfb, 0xe7, 0xfa, + 0x2e, 0x08, 0x9b, 0xc8, 0xb4, 0x90, 0x1c, 0x02, + 0x1c, 0x0f, 0x78, 0x14, 0x68, 0x90, 0x1c, 0x01, + 0xd1, 0x08, 0x20, 0x00, 0x60, 0x38, 0x78, 0x90, + 0x23, 0x01, 0x43, 0x18, 0x70, 0x90, 0x20, 0xb7, + 0xbc, 0x90, 0x47, 0x70, 0x68, 0x08, 0x60, 0x90, + 0x20, 0x00, 0x60, 0x48, 0x60, 0x39, 0x68, 0x50, + 0x38, 0x01, 0x60, 0x50, 0x68, 0x50, 0x42, 0xa0, + 0xd1, 0x02, 0x20, 0xbf, 0xe7, 0xf0, 0xe0, 0x01, + 0x20, 0x00, 0xe7, 0xed, 0xe7, 0xec, 0x00, 0x00, + 0x1c, 0x01, 0x22, 0x00, 0x6a, 0x50, 0x68, 0x02, + 0x60, 0x0a, 0x4a, 0x05, 0x6f, 0xd2, 0x60, 0x8a, + 0x4a, 0x04, 0x68, 0x12, 0x60, 0x4a, 0x22, 0x1d, + 0x02, 0x92, 0x68, 0x12, 0x60, 0xca, 0x47, 0x70, + 0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0x20, 0x24, + 0x1c, 0x01, 0x48, 0x02, 0x60, 0x01, 0x20, 0x00, + 0x47, 0x70, 0xe7, 0xfd, 0x66, 0x00, 0x01, 0x00, + 0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, 0x62, 0x01, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, + 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 0x23, 0x7f, + 0x03, 0x9b, 0x40, 0x18, 0x03, 0x8a, 0x43, 0x10, + 0x22, 0x33, 0x06, 0x52, 0x62, 0xd0, 0x20, 0x00, + 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x20, 0x33, + 0x06, 0x40, 0x6a, 0xc0, 0x23, 0x03, 0x03, 0x1b, + 0x40, 0x18, 0x43, 0x08, 0x22, 0x33, 0x06, 0x52, + 0x62, 0xd0, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, + 0x1c, 0x01, 0x06, 0x0a, 0x0e, 0x12, 0x2a, 0x00, + 0xd0, 0x06, 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, + 0x23, 0x01, 0x05, 0x5b, 0x43, 0x18, 0xe0, 0x04, + 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 0x4b, 0x04, + 0x40, 0x18, 0x23, 0x33, 0x06, 0x5b, 0x62, 0xd8, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, + 0xff, 0xdf, 0xff, 0xff, 0x48, 0x04, 0x69, 0x80, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x20, 0xff, + 0x47, 0x70, 0x20, 0x00, 0xe7, 0xfc, 0xe7, 0xfb, + 0x66, 0x00, 0x00, 0x80, 0xb4, 0x80, 0x1c, 0x01, + 0x06, 0x0f, 0x0e, 0x3f, 0x4a, 0x08, 0x2f, 0x00, + 0xd0, 0x03, 0x68, 0x10, 0x23, 0x01, 0x43, 0x18, + 0xe0, 0x02, 0x68, 0x10, 0x08, 0x40, 0x00, 0x40, + 0x68, 0x13, 0x43, 0x18, 0x60, 0x10, 0x20, 0x00, + 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x98, 0xb4, 0x80, 0x1c, 0x07, + 0x1c, 0x0a, 0x4b, 0x06, 0x40, 0x1a, 0x4b, 0x06, + 0x40, 0x1f, 0x0b, 0x10, 0x02, 0x39, 0x43, 0x08, + 0x49, 0x04, 0x61, 0xc8, 0x20, 0x00, 0xbc, 0x80, + 0x47, 0x70, 0xe7, 0xfc, 0x01, 0xff, 0xf0, 0x00, + 0x00, 0xff, 0xf0, 0x00, 0x66, 0x00, 0x00, 0x80, + 0x48, 0x01, 0x69, 0xc0, 0x47, 0x70, 0xe7, 0xfd, + 0x66, 0x00, 0x00, 0x80, 0x1c, 0x01, 0x48, 0x07, + 0x68, 0x02, 0x4b, 0x07, 0x40, 0x1a, 0x60, 0x02, + 0x23, 0x01, 0x05, 0x9b, 0x42, 0x99, 0xd1, 0x03, + 0x48, 0x02, 0x68, 0x02, 0x43, 0x0a, 0x60, 0x02, + 0x47, 0x70, 0x00, 0x00, 0x66, 0x00, 0x00, 0x2c, + 0xff, 0xbf, 0xff, 0xff, 0x1c, 0x01, 0x20, 0x33, + 0x06, 0x40, 0x67, 0x41, 0x47, 0x70, 0x1c, 0x01, + 0x20, 0x33, 0x06, 0x40, 0x67, 0x81, 0x47, 0x70, + 0xb5, 0x90, 0x4c, 0x21, 0x20, 0x01, 0x60, 0x20, + 0xf0, 0x12, 0xff, 0xa4, 0x48, 0x1f, 0x69, 0x84, + 0x27, 0x00, 0x2f, 0x04, 0xd3, 0x04, 0xe0, 0x06, + 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, + 0x21, 0x00, 0xc4, 0x02, 0xe7, 0xf8, 0x20, 0x00, + 0x49, 0x18, 0x69, 0x49, 0x60, 0x08, 0x20, 0x00, + 0x49, 0x16, 0x69, 0x49, 0x60, 0x48, 0x20, 0x00, + 0x49, 0x14, 0x69, 0x49, 0x60, 0x88, 0x20, 0x00, + 0x49, 0x12, 0x69, 0x49, 0x60, 0xc8, 0x20, 0x00, + 0x49, 0x10, 0x69, 0x49, 0x61, 0x08, 0x20, 0x00, + 0x49, 0x0e, 0x69, 0x49, 0x61, 0x48, 0x20, 0x00, + 0x49, 0x0c, 0x69, 0x49, 0x61, 0x88, 0x20, 0x00, + 0x49, 0x0a, 0x69, 0x49, 0x61, 0xc8, 0x20, 0x00, + 0x49, 0x08, 0x69, 0x49, 0x62, 0x08, 0x20, 0x00, + 0x49, 0x06, 0x69, 0x49, 0x62, 0x48, 0x20, 0x18, + 0x49, 0x04, 0x69, 0x49, 0x62, 0x88, 0x20, 0x00, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xfb, + 0x70, 0x00, 0x00, 0x38, 0x2e, 0x08, 0x20, 0x28, + 0xb5, 0xff, 0x1c, 0x0f, 0xb0, 0x81, 0x9c, 0x01, + 0x69, 0x20, 0x28, 0x08, 0xd1, 0x01, 0x08, 0x7f, + 0x00, 0x7f, 0x6b, 0xa0, 0x9a, 0x03, 0x43, 0x50, + 0x19, 0xc6, 0x69, 0x20, 0x00, 0x80, 0x49, 0x34, + 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, + 0x08, 0x76, 0x69, 0x20, 0x00, 0x80, 0x49, 0x31, + 0x58, 0x08, 0x43, 0x70, 0x90, 0x00, 0x69, 0xa0, + 0x99, 0x00, 0x09, 0x49, 0x18, 0x45, 0x6b, 0xe0, + 0x28, 0x00, 0xd1, 0x02, 0x03, 0x28, 0x0b, 0x00, + 0xe0, 0x01, 0x02, 0x28, 0x0a, 0x00, 0x1c, 0x05, + 0xf0, 0x12, 0xff, 0x42, 0xf0, 0x12, 0xff, 0x1e, + 0x48, 0x27, 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, + 0x00, 0xc0, 0x49, 0x25, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x40, 0x48, 0x23, 0x69, 0x80, 0x68, 0x00, + 0x01, 0x40, 0x09, 0x40, 0x49, 0x20, 0x69, 0x89, + 0x60, 0x08, 0x6b, 0xe0, 0x49, 0x1e, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x1e, 0x40, 0x19, 0x07, 0xc0, + 0x0c, 0x80, 0x43, 0x08, 0x49, 0x1a, 0x69, 0x89, + 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x21, + 0x1c, 0x20, 0xf0, 0x00, 0xfe, 0x51, 0x48, 0x16, + 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x16, 0x40, 0x18, + 0x02, 0x29, 0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, + 0x49, 0x11, 0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, + 0x48, 0x0f, 0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, + 0x09, 0x40, 0x99, 0x00, 0x06, 0xc9, 0x43, 0x08, + 0x49, 0x0b, 0x69, 0xc9, 0x60, 0x08, 0x99, 0x04, + 0x1c, 0x20, 0x22, 0x00, 0xf0, 0x00, 0xfe, 0xbc, + 0xf0, 0x00, 0xff, 0x9d, 0xf0, 0x12, 0xff, 0x14, + 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, + 0x2e, 0x03, 0xa8, 0x78, 0x2e, 0x03, 0xa8, 0xc8, + 0x2e, 0x08, 0x20, 0x28, 0xff, 0xff, 0xdf, 0xff, + 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0x1c, 0x0f, + 0xb0, 0x81, 0x9c, 0x01, 0x69, 0x20, 0x28, 0x08, + 0xd1, 0x01, 0x08, 0x7f, 0x00, 0x7f, 0x6b, 0xa0, + 0x9a, 0x03, 0x43, 0x50, 0x19, 0xc6, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x37, 0x58, 0x08, 0x23, 0x04, + 0x40, 0x18, 0xd0, 0x00, 0x08, 0x76, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x43, 0x70, + 0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x09, 0x49, + 0x18, 0x45, 0x6b, 0xe0, 0x28, 0x00, 0xd1, 0x02, + 0x03, 0x28, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x28, + 0x0a, 0x00, 0x1c, 0x05, 0xf0, 0x12, 0xfe, 0xc0, + 0xf0, 0x12, 0xfe, 0x9c, 0x48, 0x2a, 0x69, 0x80, + 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x01, + 0x43, 0x18, 0x49, 0x27, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x40, 0x6b, 0xe0, 0x49, 0x24, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x24, 0x40, 0x19, 0x07, 0xc0, + 0x0c, 0x80, 0x43, 0x08, 0x49, 0x20, 0x69, 0x89, + 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x48, 0x1e, + 0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, + 0x99, 0x00, 0x06, 0xc9, 0x43, 0x01, 0x48, 0x1a, + 0x69, 0x80, 0x60, 0x01, 0x1c, 0x21, 0x1c, 0x20, + 0xf0, 0x00, 0xfd, 0xca, 0x48, 0x16, 0x69, 0xc0, + 0x68, 0x00, 0x4b, 0x17, 0x40, 0x18, 0x02, 0x29, + 0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 0x49, 0x12, + 0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 0x48, 0x10, + 0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, + 0x49, 0x0d, 0x69, 0xc9, 0x60, 0x08, 0xf0, 0x00, + 0xff, 0x1e, 0xf0, 0x12, 0xfe, 0x73, 0x48, 0x0a, + 0x6b, 0x81, 0x1c, 0x20, 0xf0, 0x00, 0xfe, 0xf0, + 0x9b, 0x04, 0x60, 0x18, 0xf0, 0x12, 0xfe, 0x8c, + 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, + 0x2e, 0x03, 0xa8, 0x78, 0x2e, 0x03, 0xa8, 0xc8, + 0x2e, 0x08, 0x20, 0x28, 0xff, 0xff, 0xdf, 0xff, + 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0x1c, 0x0c, + 0x1c, 0x1f, 0xb0, 0x83, 0x9d, 0x03, 0x6b, 0x28, + 0x6a, 0xa9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, + 0x19, 0xe0, 0x99, 0x00, 0x42, 0x88, 0xd9, 0x01, + 0x98, 0x00, 0x1b, 0x07, 0x69, 0x28, 0x28, 0x08, + 0xd1, 0x02, 0x08, 0x7f, 0x08, 0x64, 0x00, 0x64, + 0x6b, 0xa8, 0x9a, 0x05, 0x43, 0x50, 0x19, 0x01, + 0x91, 0x01, 0x69, 0x28, 0x00, 0x80, 0x49, 0x38, + 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, + 0x99, 0x01, 0x08, 0x49, 0x91, 0x01, 0x69, 0x28, + 0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x99, 0x01, + 0x43, 0x48, 0x90, 0x02, 0x69, 0xa8, 0x99, 0x02, + 0x09, 0x49, 0x18, 0x46, 0x6b, 0xe8, 0x28, 0x00, + 0xd1, 0x02, 0x03, 0x30, 0x0b, 0x00, 0xe0, 0x01, + 0x02, 0x30, 0x0a, 0x00, 0x1c, 0x06, 0xf0, 0x12, + 0xfe, 0x27, 0xf0, 0x12, 0xfe, 0x03, 0x48, 0x2a, + 0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, + 0x49, 0x27, 0x69, 0x89, 0x60, 0x08, 0x48, 0x26, + 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, + 0x23, 0x02, 0x43, 0x18, 0x49, 0x22, 0x69, 0x89, + 0x60, 0x08, 0x07, 0x40, 0x6b, 0xe8, 0x49, 0x20, + 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1f, 0x40, 0x19, + 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 0x49, 0x1c, + 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, + 0x1c, 0x29, 0x1c, 0x28, 0xf0, 0x00, 0xfd, 0x34, + 0x48, 0x17, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x18, + 0x40, 0x18, 0x02, 0x31, 0x0a, 0x09, 0x00, 0x89, + 0x43, 0x08, 0x49, 0x13, 0x69, 0xc9, 0x60, 0x08, + 0x01, 0x80, 0x48, 0x11, 0x69, 0xc0, 0x68, 0x00, + 0x01, 0x40, 0x09, 0x40, 0x99, 0x02, 0x06, 0xc9, + 0x43, 0x08, 0x49, 0x0d, 0x69, 0xc9, 0x60, 0x08, + 0x99, 0x0c, 0x1c, 0x28, 0x22, 0x02, 0xf0, 0x00, + 0xfd, 0x9f, 0x48, 0x09, 0x69, 0x40, 0x62, 0x07, + 0xf0, 0x00, 0xfe, 0x7d, 0xf0, 0x12, 0xfd, 0xf4, + 0x20, 0x00, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x03, 0xe7, 0xf9, + 0x2e, 0x03, 0xa8, 0x78, 0x2e, 0x03, 0xa8, 0xc8, + 0x2e, 0x08, 0x20, 0x28, 0xff, 0xff, 0xdf, 0xff, + 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0xb0, 0x81, + 0x9f, 0x01, 0x6b, 0x78, 0x6a, 0xf9, 0x1a, 0x40, + 0x30, 0x01, 0x90, 0x00, 0x9a, 0x03, 0x9b, 0x04, + 0x18, 0xd0, 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, + 0x98, 0x00, 0x9a, 0x03, 0x1a, 0x83, 0x93, 0x04, + 0x69, 0x38, 0x28, 0x08, 0xd1, 0x03, 0x99, 0x02, + 0x08, 0x49, 0x00, 0x49, 0x91, 0x02, 0x6b, 0xb8, + 0x9a, 0x03, 0x43, 0x50, 0x99, 0x02, 0x18, 0x45, + 0x69, 0x38, 0x00, 0x80, 0x49, 0x3c, 0x58, 0x08, + 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, 0x08, 0x6d, + 0x69, 0x38, 0x00, 0x80, 0x49, 0x39, 0x58, 0x08, + 0x1c, 0x06, 0x43, 0x6e, 0x69, 0xb8, 0x09, 0x71, + 0x18, 0x44, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x02, + 0x03, 0x20, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x20, + 0x0a, 0x00, 0x1c, 0x04, 0xf0, 0x12, 0xfd, 0x90, + 0xf0, 0x12, 0xfd, 0x6c, 0x48, 0x30, 0x69, 0x80, + 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x49, 0x2e, + 0x69, 0x89, 0x60, 0x08, 0x48, 0x2c, 0x69, 0x80, + 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x03, + 0x43, 0x18, 0x49, 0x29, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x40, 0x6b, 0xf8, 0x49, 0x26, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x26, 0x40, 0x19, 0x07, 0xc0, + 0x0c, 0x80, 0x43, 0x08, 0x49, 0x22, 0x69, 0x89, + 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x39, + 0x1c, 0x38, 0xf0, 0x00, 0xfc, 0x9d, 0x99, 0x0a, + 0x1c, 0x38, 0x22, 0x03, 0xf0, 0x00, 0xfd, 0x20, + 0x69, 0xf8, 0x49, 0x1b, 0x69, 0x49, 0x61, 0x08, + 0x48, 0x19, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x1a, + 0x40, 0x18, 0x02, 0x21, 0x0a, 0x09, 0x00, 0x89, + 0x43, 0x08, 0x49, 0x15, 0x69, 0xc9, 0x60, 0x08, + 0x01, 0x80, 0x48, 0x13, 0x69, 0xc0, 0x68, 0x00, + 0x01, 0x40, 0x09, 0x40, 0x06, 0xf1, 0x43, 0x08, + 0x49, 0x0f, 0x69, 0xc9, 0x60, 0x08, 0x48, 0x0e, + 0x69, 0x40, 0x61, 0x84, 0x06, 0xf0, 0x0e, 0xc0, + 0x49, 0x0b, 0x69, 0x49, 0x61, 0x48, 0x9b, 0x04, + 0x48, 0x09, 0x69, 0x40, 0x62, 0x43, 0xf0, 0x00, + 0xfd, 0xda, 0xf0, 0x12, 0xfd, 0x51, 0x20, 0x00, + 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0x00, 0x00, + 0x2e, 0x03, 0xa8, 0x78, 0x2e, 0x03, 0xa8, 0xc8, + 0x2e, 0x08, 0x20, 0x28, 0xff, 0xff, 0xdf, 0xff, + 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xf3, 0xb0, 0x86, + 0x9f, 0x06, 0x99, 0x07, 0x68, 0x8c, 0x99, 0x07, + 0x68, 0xc8, 0x90, 0x03, 0x99, 0x07, 0x68, 0x0d, + 0x99, 0x07, 0x68, 0x49, 0x91, 0x02, 0x6b, 0x78, + 0x6a, 0xf9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x01, + 0x6b, 0x38, 0x6a, 0xb9, 0x1a, 0x40, 0x30, 0x01, + 0x90, 0x00, 0x99, 0x02, 0x98, 0x03, 0x18, 0x08, + 0x99, 0x01, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x01, + 0x99, 0x02, 0x1a, 0x40, 0x90, 0x03, 0x19, 0x28, + 0x99, 0x00, 0x42, 0x88, 0xd9, 0x01, 0x98, 0x00, + 0x1b, 0x44, 0x69, 0x38, 0x28, 0x08, 0xd1, 0x02, + 0x08, 0x64, 0x08, 0x6d, 0x00, 0x6d, 0x6b, 0xb8, + 0x99, 0x02, 0x43, 0x48, 0x19, 0x41, 0x91, 0x04, + 0x69, 0x38, 0x00, 0x80, 0x49, 0x41, 0x58, 0x08, + 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 0x99, 0x04, + 0x08, 0x49, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80, + 0x49, 0x3d, 0x58, 0x08, 0x99, 0x04, 0x43, 0x48, + 0x90, 0x05, 0x69, 0xb8, 0x99, 0x05, 0x09, 0x49, + 0x18, 0x46, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x02, + 0x03, 0x30, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x30, + 0x0a, 0x00, 0x1c, 0x06, 0xf0, 0x12, 0xfc, 0xd4, + 0xf0, 0x12, 0xfc, 0xb0, 0x48, 0x33, 0x69, 0x80, + 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x49, 0x31, + 0x69, 0x89, 0x60, 0x08, 0x48, 0x2f, 0x69, 0x80, + 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x04, + 0x43, 0x18, 0x49, 0x2c, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x40, 0x48, 0x2a, 0x69, 0xc0, 0x68, 0x00, + 0x01, 0x40, 0x09, 0x40, 0x99, 0x05, 0x06, 0xc9, + 0x43, 0x08, 0x49, 0x26, 0x69, 0xc9, 0x60, 0x08, + 0x48, 0x24, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x24, + 0x40, 0x18, 0x02, 0x31, 0x0a, 0x09, 0x00, 0x89, + 0x43, 0x08, 0x49, 0x20, 0x69, 0xc9, 0x60, 0x08, + 0x01, 0x80, 0x1c, 0x39, 0x1c, 0x38, 0xf0, 0x00, + 0xfb, 0xd7, 0x6b, 0xf8, 0x49, 0x1b, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x1c, 0x40, 0x19, 0x07, 0xc0, + 0x0c, 0x80, 0x43, 0x08, 0x49, 0x17, 0x69, 0x89, + 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x99, 0x07, + 0x69, 0x09, 0x1c, 0x38, 0x22, 0x04, 0xf0, 0x00, + 0xfc, 0x4b, 0x69, 0xf8, 0x49, 0x11, 0x69, 0x49, + 0x61, 0x08, 0x98, 0x05, 0x06, 0xc0, 0x0e, 0xc0, + 0x49, 0x0e, 0x69, 0x49, 0x61, 0x48, 0x48, 0x0d, + 0x69, 0x40, 0x61, 0x86, 0x48, 0x0b, 0x69, 0x40, + 0x62, 0x04, 0x98, 0x03, 0x49, 0x09, 0x69, 0x49, + 0x62, 0x48, 0xf0, 0x00, 0xfd, 0x18, 0xf0, 0x12, + 0xfc, 0x8f, 0x20, 0x00, 0xb0, 0x06, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x06, + 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x03, 0xa8, 0x78, + 0x2e, 0x03, 0xa8, 0xc8, 0x2e, 0x08, 0x20, 0x28, + 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xdf, 0xff, + 0xb5, 0xff, 0x9d, 0x09, 0xb0, 0x81, 0x98, 0x0b, + 0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x93, + 0x98, 0x14, 0x90, 0x12, 0x99, 0x15, 0x91, 0x11, + 0xaf, 0x0c, 0x1c, 0x38, 0x9a, 0x16, 0xca, 0x5e, + 0xc0, 0x5e, 0x68, 0x39, 0x91, 0x04, 0x68, 0x79, + 0x91, 0x03, 0x98, 0x12, 0x99, 0x11, 0x42, 0x88, + 0xd1, 0x73, 0x99, 0x03, 0x42, 0x8d, 0xd9, 0x71, + 0x68, 0xb8, 0x90, 0x01, 0x68, 0xf8, 0x90, 0x02, + 0x99, 0x11, 0x6b, 0x48, 0x6a, 0xc9, 0x1a, 0x40, + 0x1c, 0x44, 0x99, 0x11, 0x6b, 0x08, 0x6a, 0x89, + 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x98, 0x02, + 0x18, 0x28, 0x42, 0xa0, 0xd9, 0x01, 0x1b, 0x61, + 0x91, 0x02, 0x9b, 0x17, 0x98, 0x01, 0x18, 0x18, + 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x00, + 0x9b, 0x17, 0x1a, 0xc0, 0x90, 0x01, 0x98, 0x01, + 0x60, 0xb8, 0x98, 0x02, 0x60, 0xf8, 0x98, 0x12, + 0x69, 0xc0, 0x90, 0x0a, 0x98, 0x12, 0x6b, 0x80, + 0x99, 0x03, 0x43, 0x48, 0x99, 0x04, 0x18, 0x41, + 0x91, 0x05, 0x98, 0x12, 0x69, 0x00, 0x00, 0x80, + 0x49, 0x48, 0x58, 0x08, 0x99, 0x05, 0x43, 0x48, + 0x90, 0x0b, 0x98, 0x12, 0x69, 0x80, 0x99, 0x0b, + 0x09, 0x49, 0x18, 0x41, 0x91, 0x07, 0x98, 0x0a, + 0x99, 0x02, 0x43, 0x48, 0x90, 0x0b, 0x98, 0x0b, + 0x09, 0x40, 0x99, 0x07, 0x18, 0x40, 0x90, 0x06, + 0x98, 0x06, 0x0b, 0xc0, 0x99, 0x07, 0x0b, 0xc9, + 0x1a, 0x40, 0x90, 0x09, 0x98, 0x09, 0x28, 0x00, + 0xd0, 0x56, 0x9e, 0x02, 0x98, 0x06, 0x04, 0x40, + 0x0c, 0x40, 0x01, 0x41, 0x91, 0x08, 0x99, 0x08, + 0x98, 0x0a, 0xf0, 0x04, 0xf9, 0x17, 0x1c, 0x04, + 0x2c, 0x00, 0xd1, 0x00, 0x34, 0x01, 0x99, 0x03, + 0x98, 0x02, 0x18, 0x08, 0x1b, 0x00, 0x60, 0x78, + 0x60, 0xfc, 0x98, 0x02, 0x18, 0x28, 0x1b, 0x05, + 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, + 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, + 0xf8, 0x57, 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x09, + 0xe0, 0x01, 0xe0, 0x3c, 0xe0, 0x3b, 0x38, 0x01, + 0x90, 0x09, 0x98, 0x09, 0x28, 0x00, 0xd0, 0x1a, + 0x98, 0x0a, 0x21, 0x01, 0x03, 0x09, 0xf0, 0x04, + 0xf8, 0xf1, 0x1c, 0x04, 0x68, 0x78, 0x1b, 0x80, + 0x60, 0x78, 0x60, 0xfc, 0x68, 0xf8, 0x1a, 0x2d, + 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, + 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, + 0xf8, 0x37, 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x09, + 0x38, 0x01, 0x90, 0x09, 0xe7, 0xe1, 0x68, 0x78, + 0x1b, 0x80, 0x60, 0x78, 0x60, 0xfe, 0x68, 0xf8, + 0x1a, 0x2d, 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, + 0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, + 0xf0, 0x00, 0xf8, 0x22, 0xb0, 0x02, 0xe0, 0x09, + 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, + 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, + 0xf8, 0x17, 0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x13, + 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a, + 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 0xf8, 0xb8, + 0xb0, 0x02, 0x20, 0x00, 0xb0, 0x14, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x13, + 0xb0, 0x01, 0xe7, 0xf8, 0x2e, 0x03, 0xa8, 0xc8, + 0xb5, 0xff, 0x9d, 0x09, 0xb0, 0x81, 0x98, 0x0b, + 0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x92, + 0x98, 0x13, 0x90, 0x11, 0x99, 0x14, 0x91, 0x10, + 0xaf, 0x0b, 0x1c, 0x38, 0x9a, 0x15, 0xca, 0x5e, + 0xc0, 0x5e, 0x68, 0x38, 0x90, 0x03, 0x68, 0x78, + 0x90, 0x02, 0x68, 0xb8, 0x90, 0x00, 0x68, 0xf9, + 0x91, 0x01, 0x98, 0x11, 0x69, 0xc0, 0x90, 0x09, + 0x99, 0x10, 0x6b, 0x88, 0x43, 0x68, 0x9b, 0x16, + 0x18, 0xc1, 0x91, 0x04, 0x99, 0x10, 0x69, 0x08, + 0x00, 0x80, 0x49, 0x42, 0x58, 0x08, 0x99, 0x04, + 0x43, 0x48, 0x90, 0x0a, 0x99, 0x10, 0x69, 0x88, + 0x99, 0x0a, 0x09, 0x49, 0x18, 0x40, 0x90, 0x06, + 0x98, 0x09, 0x99, 0x01, 0x43, 0x48, 0x90, 0x0a, + 0x98, 0x0a, 0x09, 0x40, 0x99, 0x06, 0x18, 0x40, + 0x90, 0x05, 0x98, 0x05, 0x0b, 0xc0, 0x99, 0x06, + 0x0b, 0xc9, 0x1a, 0x40, 0x90, 0x08, 0x98, 0x08, + 0x28, 0x00, 0xd0, 0x53, 0x9e, 0x01, 0x98, 0x05, + 0x04, 0x40, 0x0c, 0x40, 0x01, 0x41, 0x91, 0x07, + 0x99, 0x07, 0x98, 0x09, 0xf0, 0x04, 0xf8, 0x5e, + 0x1c, 0x04, 0x2c, 0x00, 0xd1, 0x00, 0x34, 0x01, + 0x98, 0x02, 0x99, 0x01, 0x18, 0x40, 0x1b, 0x00, + 0x60, 0x78, 0x60, 0xfc, 0x99, 0x01, 0x18, 0x68, + 0x1b, 0x05, 0x9a, 0x12, 0x1c, 0x29, 0xb4, 0x06, + 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, 0x98, 0x15, + 0xf0, 0x00, 0xf8, 0x4a, 0xb0, 0x02, 0x1b, 0x36, + 0x98, 0x08, 0x38, 0x01, 0x90, 0x08, 0x98, 0x08, + 0x28, 0x00, 0xd0, 0x1a, 0x98, 0x09, 0x21, 0x01, + 0x03, 0x09, 0xf0, 0x04, 0xf8, 0x3b, 0x1c, 0x04, + 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, 0x60, 0xfc, + 0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x12, 0x1c, 0x29, + 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, + 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x2d, 0xb0, 0x02, + 0x1b, 0x36, 0x98, 0x08, 0x38, 0x01, 0x90, 0x08, + 0xe7, 0xe1, 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, + 0x60, 0xfe, 0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x12, + 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, + 0x99, 0x16, 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x18, + 0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x12, 0x1c, 0x29, + 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, + 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x0d, 0xb0, 0x02, + 0x20, 0x00, 0xb0, 0x13, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x12, 0xb0, 0x01, + 0xe7, 0xf8, 0x00, 0x00, 0x2e, 0x03, 0xa8, 0xc8, + 0xb5, 0xff, 0xb0, 0x81, 0x98, 0x0b, 0x06, 0x02, + 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x8e, 0x9f, 0x0f, + 0x9c, 0x10, 0x9a, 0x11, 0x68, 0x10, 0x90, 0x07, + 0x9a, 0x11, 0x68, 0x50, 0x90, 0x06, 0x9a, 0x11, + 0x68, 0x91, 0x91, 0x08, 0x9a, 0x11, 0x68, 0xd0, + 0x90, 0x09, 0x6b, 0x60, 0x6a, 0xe1, 0x1a, 0x40, + 0x30, 0x01, 0x90, 0x01, 0x6b, 0x20, 0x6a, 0xa1, + 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x99, 0x18, + 0x98, 0x09, 0x18, 0x08, 0x99, 0x01, 0x42, 0x88, + 0xd9, 0x03, 0x98, 0x01, 0x99, 0x18, 0x1a, 0x41, + 0x91, 0x09, 0x9b, 0x12, 0x99, 0x08, 0x18, 0x58, + 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x00, + 0x9b, 0x12, 0x1a, 0xc1, 0x91, 0x08, 0x22, 0x00, + 0x92, 0x05, 0x42, 0xa7, 0xd1, 0x20, 0x99, 0x18, + 0x98, 0x06, 0x42, 0x81, 0xd9, 0x0c, 0x22, 0x02, + 0x92, 0x05, 0x99, 0x06, 0x98, 0x09, 0x18, 0x08, + 0x1e, 0x41, 0x91, 0x06, 0x99, 0x18, 0x98, 0x09, + 0x18, 0x08, 0x1e, 0x41, 0x91, 0x18, 0xe0, 0x0f, + 0x9b, 0x12, 0x98, 0x07, 0x42, 0x83, 0xd9, 0x0b, + 0x22, 0x01, 0x92, 0x05, 0x98, 0x07, 0x99, 0x08, + 0x18, 0x40, 0x38, 0x01, 0x90, 0x07, 0x9b, 0x12, + 0x99, 0x08, 0x18, 0x58, 0x1e, 0x43, 0x93, 0x12, + 0x69, 0x38, 0x28, 0x08, 0xd1, 0x0a, 0x99, 0x08, + 0x08, 0x49, 0x91, 0x08, 0x98, 0x07, 0x08, 0x40, + 0x00, 0x40, 0x90, 0x07, 0x9b, 0x12, 0x08, 0x5b, + 0x00, 0x5b, 0x93, 0x12, 0x69, 0x38, 0x00, 0x80, + 0x49, 0xc6, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, + 0x08, 0x80, 0x90, 0x03, 0x69, 0x20, 0x00, 0x80, + 0x49, 0xc2, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, + 0x08, 0x80, 0x90, 0x02, 0x6b, 0xb8, 0x99, 0x06, + 0x43, 0x48, 0x99, 0x07, 0x18, 0x41, 0x91, 0x04, + 0x98, 0x03, 0x28, 0x00, 0xd0, 0x02, 0x99, 0x04, + 0x08, 0x49, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80, + 0x49, 0xb9, 0x58, 0x08, 0x99, 0x04, 0x1c, 0x06, + 0x43, 0x4e, 0x6b, 0xa0, 0x99, 0x18, 0x43, 0x48, + 0x9b, 0x12, 0x18, 0xc1, 0x91, 0x04, 0x98, 0x02, + 0x28, 0x00, 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, + 0x91, 0x04, 0x69, 0x20, 0x00, 0x80, 0x49, 0xb0, + 0x58, 0x08, 0x99, 0x04, 0x1c, 0x05, 0x43, 0x4d, + 0x9a, 0x05, 0x2a, 0x01, 0xd1, 0x3d, 0x69, 0x38, + 0x28, 0x08, 0xd0, 0x3a, 0x69, 0x38, 0x28, 0x09, + 0xd0, 0x02, 0x69, 0x38, 0x28, 0x0a, 0xd1, 0x0a, + 0x36, 0x10, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41, + 0x91, 0x0b, 0x06, 0xf0, 0x0e, 0xc0, 0x1d, 0xc1, + 0x31, 0x01, 0x91, 0x0a, 0xe0, 0x0b, 0x69, 0xb8, + 0x09, 0x71, 0x18, 0x41, 0x91, 0x0b, 0x69, 0x38, + 0x00, 0x80, 0x49, 0x9f, 0x58, 0x08, 0x19, 0x86, + 0x06, 0xf1, 0x0e, 0xc9, 0x91, 0x0a, 0x69, 0x20, + 0x28, 0x09, 0xd0, 0x02, 0x69, 0x20, 0x28, 0x0a, + 0xd1, 0x0a, 0x35, 0x10, 0x69, 0xa0, 0x09, 0x69, + 0x18, 0x41, 0x91, 0x0d, 0x06, 0xe8, 0x0e, 0xc0, + 0x1d, 0xc1, 0x31, 0x01, 0x91, 0x0c, 0xe0, 0x0b, + 0x69, 0xa0, 0x09, 0x69, 0x18, 0x41, 0x91, 0x0d, + 0x69, 0x20, 0x00, 0x80, 0x49, 0x90, 0x58, 0x08, + 0x19, 0x45, 0x06, 0xe9, 0x0e, 0xc9, 0x91, 0x0c, + 0xe0, 0x0d, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41, + 0x91, 0x0b, 0x69, 0xa0, 0x09, 0x69, 0x18, 0x41, + 0x91, 0x0d, 0x06, 0xf1, 0x0e, 0xc9, 0x91, 0x0a, + 0x06, 0xe9, 0x0e, 0xc9, 0x91, 0x0c, 0x6b, 0xf8, + 0x28, 0x00, 0xd1, 0x03, 0x99, 0x0b, 0x03, 0x09, + 0x0b, 0x09, 0xe0, 0x02, 0x99, 0x0b, 0x02, 0x09, + 0x0a, 0x09, 0x91, 0x0b, 0x6b, 0xe0, 0x28, 0x00, + 0xd1, 0x03, 0x99, 0x0d, 0x03, 0x09, 0x0b, 0x09, + 0xe0, 0x02, 0x99, 0x0d, 0x02, 0x09, 0x0a, 0x09, + 0x91, 0x0d, 0xf0, 0x12, 0xf9, 0xd5, 0xf0, 0x12, + 0xf9, 0xb1, 0x48, 0x7a, 0x69, 0x80, 0x68, 0x00, + 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x05, 0x43, 0x18, + 0x49, 0x76, 0x69, 0x89, 0x60, 0x08, 0x07, 0x40, + 0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xf8, + 0x98, 0x03, 0x28, 0x00, 0xd0, 0x18, 0x98, 0x02, + 0x28, 0x00, 0xd0, 0x15, 0x48, 0x6f, 0x69, 0x80, + 0x68, 0x00, 0x23, 0x08, 0x43, 0xdb, 0x40, 0x18, + 0x49, 0x6c, 0x69, 0x89, 0x60, 0x08, 0x07, 0x00, + 0x48, 0x6a, 0x69, 0x80, 0x68, 0x00, 0x4b, 0x6a, + 0x40, 0x18, 0x49, 0x68, 0x69, 0x89, 0x60, 0x08, + 0x05, 0xc0, 0x99, 0x08, 0x08, 0x49, 0x91, 0x08, + 0x6b, 0xf8, 0x49, 0x64, 0x69, 0x89, 0x68, 0x09, + 0x4b, 0x64, 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x40, + 0x43, 0x08, 0x49, 0x60, 0x69, 0x89, 0x60, 0x08, + 0x04, 0x40, 0x0f, 0xc0, 0x6b, 0xe0, 0x49, 0x5d, + 0x69, 0x89, 0x68, 0x09, 0x4b, 0x5e, 0x40, 0x19, + 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 0x49, 0x59, + 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, + 0x68, 0x38, 0x28, 0x00, 0xd0, 0x0d, 0x79, 0x38, + 0x49, 0x54, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x57, + 0x40, 0x19, 0x03, 0xc0, 0x43, 0x08, 0x49, 0x51, + 0x69, 0x89, 0x60, 0x08, 0x02, 0x40, 0x0e, 0x00, + 0xe0, 0x0d, 0x6a, 0x78, 0x78, 0x00, 0x49, 0x4d, + 0x69, 0x89, 0x68, 0x09, 0x4b, 0x4f, 0x40, 0x19, + 0x03, 0xc0, 0x43, 0x08, 0x49, 0x49, 0x69, 0x89, + 0x60, 0x08, 0x02, 0x40, 0x0e, 0x00, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x45, 0x58, 0x08, 0x99, 0x08, + 0x43, 0x48, 0x28, 0x40, 0xd9, 0x01, 0x21, 0x00, + 0xe0, 0x00, 0x21, 0x01, 0x1c, 0x08, 0x49, 0x41, + 0x69, 0x89, 0x68, 0x09, 0x4b, 0x44, 0x40, 0x19, + 0x07, 0xc2, 0x09, 0x52, 0x43, 0x11, 0x4a, 0x3d, + 0x69, 0x92, 0x60, 0x11, 0x01, 0x49, 0x0f, 0xc9, + 0x49, 0x3a, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x3f, + 0x40, 0x19, 0x9a, 0x05, 0x07, 0x92, 0x0f, 0x92, + 0x05, 0xd2, 0x43, 0x11, 0x4a, 0x35, 0x69, 0x92, + 0x60, 0x11, 0x01, 0xc9, 0x49, 0x33, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x39, 0x40, 0x19, 0x9a, 0x0e, + 0x07, 0xd2, 0x09, 0x92, 0x43, 0x11, 0x4a, 0x2f, + 0x69, 0x92, 0x60, 0x11, 0x01, 0x89, 0x69, 0xf9, + 0x4a, 0x2c, 0x69, 0x52, 0x60, 0x11, 0x49, 0x2b, + 0x69, 0x89, 0x68, 0x09, 0x01, 0x49, 0x09, 0x49, + 0x9a, 0x0a, 0x06, 0xd2, 0x43, 0x11, 0x4a, 0x27, + 0x69, 0x92, 0x60, 0x11, 0x99, 0x0a, 0x4a, 0x25, + 0x69, 0x52, 0x60, 0x51, 0x99, 0x0b, 0x4a, 0x23, + 0x69, 0x52, 0x60, 0x91, 0x99, 0x0b, 0x4a, 0x21, + 0x69, 0x52, 0x60, 0xd1, 0x69, 0xe1, 0x4a, 0x1f, + 0x69, 0x52, 0x61, 0x11, 0x49, 0x1d, 0x69, 0xc9, + 0x68, 0x09, 0x01, 0x49, 0x09, 0x49, 0x9a, 0x0c, + 0x06, 0xd2, 0x43, 0x11, 0x4a, 0x19, 0x69, 0xd2, + 0x60, 0x11, 0x99, 0x0c, 0x4a, 0x17, 0x69, 0x52, + 0x61, 0x51, 0x99, 0x0d, 0x4a, 0x15, 0x69, 0x52, + 0x61, 0x91, 0x99, 0x0d, 0x4a, 0x13, 0x69, 0x52, + 0x61, 0xd1, 0x99, 0x09, 0x4a, 0x11, 0x69, 0x52, + 0x62, 0x51, 0x99, 0x08, 0x4a, 0x0f, 0x69, 0x52, + 0x62, 0x11, 0x68, 0x38, 0x28, 0x00, 0xd0, 0x05, + 0x48, 0x14, 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, + 0x60, 0x01, 0xe0, 0x02, 0x48, 0x11, 0x21, 0x00, + 0x60, 0x01, 0xf0, 0x00, 0xf9, 0x8c, 0xf0, 0x12, + 0xf9, 0x03, 0x20, 0x00, 0xb0, 0x0f, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x0e, + 0xb0, 0x01, 0xe7, 0xf8, 0x2e, 0x03, 0xa8, 0x78, + 0x2e, 0x03, 0xa8, 0xc8, 0x2e, 0x08, 0x20, 0x28, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0x80, 0x7f, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x40, + 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x69, 0x38, + 0x00, 0x80, 0x49, 0x3c, 0x58, 0x08, 0x23, 0x18, + 0x40, 0x18, 0x08, 0xc0, 0x49, 0x3a, 0x69, 0x89, + 0x68, 0x09, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x19, + 0x07, 0x80, 0x0f, 0x80, 0x01, 0x80, 0x43, 0x08, + 0x49, 0x35, 0x69, 0x89, 0x60, 0x08, 0x06, 0x00, + 0x0f, 0x80, 0x69, 0x38, 0x00, 0x80, 0x49, 0x31, + 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0x08, 0x80, + 0x49, 0x2f, 0x69, 0x89, 0x68, 0x09, 0x23, 0x08, + 0x43, 0xdb, 0x40, 0x19, 0x07, 0xc0, 0x0f, 0x00, + 0x43, 0x08, 0x49, 0x2b, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x00, 0x0f, 0xc0, 0x69, 0x38, 0x00, 0x80, + 0x49, 0x26, 0x58, 0x08, 0x49, 0x26, 0x69, 0x89, + 0x68, 0x09, 0x23, 0x30, 0x43, 0xdb, 0x40, 0x19, + 0x07, 0x80, 0x0f, 0x80, 0x01, 0x00, 0x43, 0x08, + 0x49, 0x21, 0x69, 0x89, 0x60, 0x08, 0x06, 0x80, + 0x0f, 0x80, 0x69, 0x10, 0x00, 0x80, 0x49, 0x1d, + 0x58, 0x08, 0x23, 0x18, 0x40, 0x18, 0x08, 0xc0, + 0x49, 0x1b, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1b, + 0x40, 0x19, 0x07, 0x80, 0x0f, 0x80, 0x02, 0xc0, + 0x43, 0x08, 0x49, 0x17, 0x69, 0x89, 0x60, 0x08, + 0x04, 0xc0, 0x0f, 0x80, 0x69, 0x10, 0x00, 0x80, + 0x49, 0x12, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, + 0x08, 0x80, 0x49, 0x11, 0x69, 0x89, 0x68, 0x09, + 0x4b, 0x11, 0x40, 0x19, 0x07, 0xc0, 0x0d, 0xc0, + 0x43, 0x08, 0x49, 0x0d, 0x69, 0x89, 0x60, 0x08, + 0x05, 0xc0, 0x0f, 0xc0, 0x69, 0x10, 0x00, 0x80, + 0x49, 0x08, 0x58, 0x08, 0x49, 0x08, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x0a, 0x40, 0x19, 0x07, 0x80, + 0x0f, 0x80, 0x02, 0x40, 0x43, 0x08, 0x49, 0x04, + 0x69, 0x89, 0x60, 0x08, 0x05, 0x40, 0x0f, 0x80, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x03, 0xa8, 0x78, + 0x2e, 0x08, 0x20, 0x28, 0xff, 0xff, 0xe7, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xb4, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x15, + 0x2d, 0x00, 0xd0, 0x06, 0x2d, 0x02, 0xd0, 0x21, + 0x2d, 0x03, 0xd0, 0x02, 0x2d, 0x04, 0xd0, 0x1d, + 0xe0, 0xa3, 0x69, 0x20, 0x28, 0x0b, 0xd2, 0x14, + 0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, + 0x05, 0x07, 0x09, 0x0b, 0x05, 0x07, 0x09, 0x0b, + 0x0d, 0x0e, 0x0e, 0x00, 0x07, 0xff, 0xe0, 0x09, + 0x07, 0xbf, 0xe0, 0x07, 0x07, 0x3f, 0xe0, 0x05, + 0x06, 0x3f, 0xe0, 0x03, 0xe0, 0x02, 0x02, 0x3f, + 0xe0, 0x00, 0xe7, 0xff, 0x48, 0x46, 0x6a, 0x00, + 0x60, 0x07, 0xe0, 0x86, 0x69, 0x20, 0x28, 0x0b, + 0xd2, 0x73, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x06, 0x15, 0x24, 0x33, + 0x06, 0x15, 0x24, 0x33, 0x41, 0x45, 0x45, 0x00, + 0x01, 0xff, 0x48, 0x3d, 0x6a, 0x40, 0x68, 0x00, + 0x4b, 0x3c, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, + 0x00, 0x89, 0x43, 0x08, 0x49, 0x38, 0x6a, 0x49, + 0x60, 0x08, 0x05, 0x80, 0xe0, 0x69, 0x01, 0xbf, + 0x48, 0x35, 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x35, + 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, + 0x43, 0x08, 0x49, 0x31, 0x6a, 0x49, 0x60, 0x08, + 0x05, 0x80, 0xe0, 0x5a, 0x01, 0x3f, 0x48, 0x2e, + 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x2d, 0x40, 0x18, + 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 0x43, 0x08, + 0x49, 0x29, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80, + 0xe0, 0x4b, 0x48, 0x27, 0x6a, 0x40, 0x68, 0x00, + 0x4b, 0x26, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, + 0x00, 0x89, 0x43, 0x08, 0x49, 0x22, 0x6a, 0x49, + 0x60, 0x08, 0x05, 0x80, 0xe0, 0x3d, 0x48, 0x20, + 0x6a, 0x00, 0x60, 0x07, 0xe0, 0x39, 0x48, 0x1e, + 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x1d, 0x40, 0x18, + 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 0x43, 0x08, + 0x49, 0x19, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80, + 0x48, 0x17, 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x18, + 0x40, 0x18, 0x21, 0xff, 0x02, 0x09, 0x40, 0x39, + 0x00, 0x89, 0x43, 0x08, 0x49, 0x12, 0x6a, 0x49, + 0x60, 0x08, 0x03, 0x80, 0x48, 0x10, 0x6a, 0x40, + 0x68, 0x00, 0x4b, 0x12, 0x40, 0x18, 0x21, 0xff, + 0x04, 0x09, 0x40, 0x39, 0x00, 0x89, 0x43, 0x01, + 0x48, 0x0b, 0x6a, 0x40, 0x60, 0x01, 0x01, 0x88, + 0xe0, 0x00, 0xe0, 0x0d, 0x48, 0x08, 0x6a, 0x40, + 0x68, 0x00, 0x01, 0x80, 0x09, 0x80, 0x21, 0x3f, + 0x06, 0x09, 0x40, 0x39, 0x00, 0x89, 0x43, 0x08, + 0x49, 0x03, 0x6a, 0x49, 0x60, 0x08, 0xe0, 0x00, + 0xe7, 0xff, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x20, 0x28, 0xff, 0xff, 0xfc, 0x03, + 0xff, 0xfc, 0x03, 0xff, 0xfc, 0x03, 0xff, 0xff, + 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x69, 0x38, + 0x28, 0x0b, 0xd2, 0x1a, 0xa3, 0x01, 0x5c, 0x1b, + 0x00, 0x5b, 0x44, 0x9f, 0x05, 0x08, 0x0b, 0x0e, + 0x05, 0x08, 0x0b, 0x0e, 0x11, 0x13, 0x13, 0x00, + 0x68, 0x10, 0x0f, 0xc1, 0xe0, 0x0f, 0x68, 0x10, + 0x0f, 0x81, 0xe0, 0x0c, 0x68, 0x10, 0x0f, 0x01, + 0xe0, 0x09, 0x68, 0x10, 0x0e, 0x01, 0xe0, 0x06, + 0x68, 0x11, 0xe0, 0x04, 0x68, 0x10, 0x0a, 0x01, + 0xe0, 0x01, 0x68, 0x11, 0xe7, 0xff, 0x1c, 0x08, + 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x48, 0x14, + 0x69, 0x80, 0x68, 0x00, 0x49, 0x12, 0x6a, 0x89, + 0x60, 0x08, 0x48, 0x11, 0x69, 0xc0, 0x68, 0x00, + 0x49, 0x0f, 0x6a, 0xc9, 0x60, 0x08, 0x48, 0x0e, + 0x6a, 0x00, 0x68, 0x00, 0x49, 0x0c, 0x6b, 0x09, + 0x60, 0x08, 0x48, 0x0b, 0x6a, 0x40, 0x68, 0x00, + 0x49, 0x09, 0x6b, 0x49, 0x60, 0x08, 0x20, 0x01, + 0x49, 0x07, 0x6b, 0xc9, 0x60, 0x08, 0x20, 0x00, + 0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0x49, 0x05, + 0x60, 0x48, 0x20, 0x00, 0x49, 0x03, 0x60, 0x88, + 0x20, 0x00, 0x49, 0x02, 0x60, 0xc8, 0x47, 0x70, + 0x2e, 0x08, 0x20, 0x28, 0x2e, 0x08, 0x20, 0x2c, + 0xb4, 0x90, 0x1c, 0x01, 0x29, 0x00, 0xd1, 0x02, + 0x20, 0x8d, 0xbc, 0x90, 0x47, 0x70, 0x4c, 0x08, + 0x1c, 0x0f, 0x22, 0x00, 0x23, 0xff, 0x33, 0x01, + 0x42, 0x9a, 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, + 0xe7, 0xf8, 0xcf, 0x08, 0xc4, 0x08, 0xe7, 0xfa, + 0x20, 0x00, 0xe7, 0xee, 0xe7, 0xed, 0x00, 0x00, + 0x68, 0x00, 0x18, 0x00, 0xb4, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x1a, 0x0e, 0x12, + 0x1c, 0x21, 0x60, 0x0f, 0x71, 0x0a, 0x20, 0x00, + 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, + 0xb5, 0x00, 0x48, 0x1d, 0x69, 0x00, 0x23, 0x04, + 0x40, 0x18, 0xd0, 0x19, 0x48, 0x1a, 0x69, 0x00, + 0x23, 0x02, 0x40, 0x18, 0xd0, 0x09, 0x48, 0x18, + 0x69, 0x40, 0x49, 0x18, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x17, 0x68, 0x09, 0x70, 0x08, + 0xe0, 0x03, 0x20, 0x00, 0x49, 0x14, 0x68, 0x09, + 0x70, 0x08, 0x48, 0x14, 0x78, 0x01, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x08, 0xff, 0x9f, 0xe0, 0x18, + 0x48, 0x11, 0x6a, 0x80, 0x23, 0x02, 0x40, 0x18, + 0xd0, 0x13, 0x48, 0x0f, 0x6a, 0x80, 0x07, 0xc0, + 0x0f, 0xc0, 0xd0, 0x04, 0x20, 0xfe, 0x49, 0x0d, + 0x68, 0x09, 0x70, 0x08, 0xe0, 0x03, 0x20, 0x0e, + 0x49, 0x0a, 0x68, 0x09, 0x70, 0x08, 0x48, 0x0a, + 0x78, 0x01, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x08, + 0xff, 0x85, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x6e, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0xb9, 0x98, + 0x2e, 0x08, 0xb9, 0x9c, 0x2e, 0x08, 0xb9, 0xa0, + 0x6e, 0x00, 0x0e, 0x00, 0x2e, 0x08, 0xb9, 0xa4, + 0x2e, 0x08, 0xb9, 0xa8, 0xb5, 0xf0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2e, 0x0e, 0x36, + 0x2e, 0x1f, 0xdd, 0x03, 0x20, 0xaf, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x49, 0x08, 0x20, 0x0d, + 0xf0, 0x08, 0xff, 0x76, 0x48, 0x07, 0x60, 0x04, + 0x20, 0x00, 0x49, 0x06, 0x68, 0x09, 0x70, 0x08, + 0x48, 0x05, 0x60, 0x07, 0x48, 0x05, 0x70, 0x06, + 0x20, 0x00, 0xe7, 0xec, 0xe7, 0xeb, 0x00, 0x00, + 0x2e, 0x01, 0xa9, 0xed, 0x2e, 0x08, 0xb9, 0x9c, + 0x2e, 0x08, 0xb9, 0x98, 0x2e, 0x08, 0xb9, 0xa0, + 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, + 0x0e, 0x2d, 0x2d, 0x1f, 0xdd, 0x03, 0x20, 0xaf, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x49, 0x07, + 0x20, 0x0d, 0xf0, 0x08, 0xff, 0x51, 0x48, 0x06, + 0x60, 0x07, 0x20, 0x00, 0x49, 0x04, 0x68, 0x09, + 0x70, 0x08, 0x48, 0x04, 0x70, 0x05, 0x20, 0x00, + 0xe7, 0xee, 0xe7, 0xed, 0x2e, 0x01, 0xa9, 0xed, + 0x2e, 0x08, 0xb9, 0xa4, 0x2e, 0x08, 0xb9, 0xa8, + 0xb4, 0xb0, 0x1c, 0x01, 0x4a, 0x35, 0x23, 0x01, + 0x60, 0x13, 0x4a, 0x35, 0x1c, 0x0f, 0x68, 0x3d, + 0xc2, 0x20, 0x88, 0x8d, 0xc2, 0x20, 0x88, 0xcb, + 0x60, 0x13, 0x68, 0x8c, 0x2c, 0x00, 0xd0, 0x57, + 0x4a, 0x30, 0x1c, 0x27, 0x20, 0x00, 0x28, 0x13, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x2c, + 0x1d, 0xe7, 0x37, 0x45, 0x20, 0x00, 0x28, 0x0b, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x27, + 0x1d, 0xe7, 0x37, 0x71, 0x20, 0x00, 0x28, 0x07, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x22, + 0x1d, 0xe7, 0x37, 0x8d, 0x20, 0x00, 0x28, 0x09, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x1d, + 0x1d, 0xe7, 0x37, 0xb1, 0x20, 0x00, 0x28, 0x09, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x68, 0x0d, + 0x23, 0x01, 0x02, 0x9b, 0x40, 0x2b, 0xd0, 0x17, + 0x4a, 0x15, 0x1d, 0xe7, 0x37, 0xd5, 0x20, 0x00, + 0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, + 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, + 0x4a, 0x10, 0x1d, 0xe7, 0x37, 0xf9, 0x20, 0x00, + 0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, + 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, + 0x4a, 0x02, 0x23, 0x00, 0x60, 0x13, 0xbc, 0xb0, + 0x47, 0x70, 0x00, 0x00, 0x6e, 0x00, 0x0c, 0x0c, + 0x6e, 0x00, 0x0c, 0x00, 0x6e, 0x00, 0x08, 0x00, + 0x6e, 0x00, 0x08, 0x50, 0x6e, 0x00, 0x08, 0x80, + 0x6e, 0x00, 0x08, 0xa0, 0x6e, 0x00, 0x08, 0xd0, + 0x6e, 0x00, 0x09, 0x00, 0x6e, 0x00, 0x09, 0x30, + 0xb4, 0xf0, 0x1c, 0x01, 0x69, 0x08, 0x06, 0xc0, + 0x0e, 0xc0, 0x28, 0x01, 0xdb, 0x04, 0x69, 0x08, + 0x06, 0xc0, 0x0e, 0xc0, 0x28, 0x0a, 0xdd, 0x02, + 0x20, 0xc3, 0xbc, 0xf0, 0x47, 0x70, 0x69, 0x08, + 0x05, 0x80, 0x0e, 0xc0, 0x28, 0x01, 0xdb, 0x04, + 0x69, 0x08, 0x05, 0x80, 0x0e, 0xc0, 0x28, 0x0a, + 0xdd, 0x01, 0x20, 0xc4, 0xe7, 0xf1, 0x48, 0x4f, + 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x01, + 0x20, 0xc0, 0xe7, 0xea, 0x68, 0x08, 0x07, 0x00, + 0x0f, 0xc0, 0x4b, 0x4b, 0x70, 0x18, 0x4f, 0x49, + 0x1c, 0x0c, 0x22, 0x00, 0x2a, 0x04, 0xd3, 0x02, + 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, + 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x45, 0x69, 0x08, + 0x06, 0xc0, 0x0e, 0xc0, 0x00, 0x43, 0x18, 0x18, + 0x38, 0x03, 0x69, 0x0b, 0x05, 0x9b, 0x0e, 0xde, + 0x00, 0x73, 0x19, 0x9b, 0x3b, 0x03, 0x01, 0x5b, + 0x43, 0x18, 0x60, 0x38, 0x4f, 0x3e, 0x69, 0x48, + 0x60, 0x38, 0x4f, 0x3e, 0x69, 0x88, 0x05, 0x40, + 0x0d, 0x40, 0x69, 0x8b, 0x02, 0x9b, 0x0d, 0x5b, + 0x02, 0xdb, 0x43, 0x18, 0x60, 0x38, 0x69, 0xcd, + 0x2d, 0x00, 0xd0, 0x63, 0x4f, 0x38, 0x1c, 0x2c, + 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x34, 0x1d, 0xec, 0x34, 0x1d, + 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x2f, 0x1d, 0xec, 0x34, 0x41, + 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x2a, 0x1d, 0xec, 0x34, 0x65, + 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x25, 0x1d, 0xec, 0x34, 0x89, + 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x20, 0x1d, 0xec, 0x34, 0x9d, + 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x68, 0x08, 0x23, 0x01, 0x02, 0x9b, + 0x40, 0x18, 0xd0, 0x17, 0x4f, 0x18, 0x1d, 0xec, + 0x34, 0xb1, 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, + 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, + 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x13, 0x1d, 0xec, + 0x34, 0xc5, 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, + 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, + 0xc7, 0x08, 0xe7, 0xfa, 0x20, 0x00, 0xe7, 0x54, + 0xe7, 0x53, 0x00, 0x00, 0x6e, 0x00, 0x0e, 0x00, + 0x2e, 0x08, 0xb9, 0xa9, 0x6e, 0x00, 0x0e, 0x10, + 0x6e, 0x00, 0x0e, 0x14, 0x6e, 0x00, 0x0e, 0x18, + 0x6e, 0x00, 0x0a, 0x00, 0x6e, 0x00, 0x0a, 0x24, + 0x6e, 0x00, 0x0a, 0x48, 0x6e, 0x00, 0x0a, 0x90, + 0x6e, 0x00, 0x0a, 0xc0, 0x6e, 0x00, 0x0a, 0xe4, + 0x6e, 0x00, 0x09, 0xc0, 0x6e, 0x00, 0x09, 0xe4, + 0x1c, 0x01, 0x48, 0x0c, 0x78, 0x00, 0x28, 0x00, + 0xd0, 0x01, 0x20, 0xc1, 0x47, 0x70, 0x48, 0x0a, + 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x01, + 0x20, 0xc0, 0xe7, 0xf7, 0x20, 0x00, 0x4b, 0x06, + 0x61, 0x58, 0x4a, 0x06, 0x68, 0x08, 0x60, 0x10, + 0x4a, 0x05, 0x68, 0x48, 0x60, 0x10, 0x20, 0x00, + 0xe7, 0xec, 0xe7, 0xeb, 0x2e, 0x08, 0xb9, 0xa9, + 0x6e, 0x00, 0x0e, 0x00, 0x6e, 0x00, 0x0e, 0x20, + 0x6e, 0x00, 0x0e, 0x24, 0x48, 0x09, 0x78, 0x00, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0xc1, 0x47, 0x70, + 0x48, 0x07, 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, + 0xd0, 0x01, 0x20, 0xc2, 0xe7, 0xf7, 0x20, 0x01, + 0x49, 0x03, 0x61, 0x48, 0x20, 0x00, 0xe7, 0xf2, + 0xe7, 0xf1, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xa9, + 0x6e, 0x00, 0x0e, 0x00, 0xb5, 0xff, 0x1c, 0x04, + 0x1c, 0x0d, 0x1c, 0x17, 0x9e, 0x09, 0x20, 0x00, + 0x60, 0x30, 0x48, 0x13, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x07, 0x9b, 0x03, 0x2b, 0x00, 0xd1, 0x04, + 0x20, 0x8a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c, + 0xdd, 0x01, 0x20, 0x87, 0xe7, 0xf5, 0x19, 0x28, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 0xd9, 0x01, + 0x20, 0x88, 0xe7, 0xee, 0x68, 0x79, 0x1c, 0x20, + 0x80, 0x48, 0x70, 0x0d, 0x9b, 0x03, 0x60, 0x4b, + 0x68, 0x78, 0x60, 0xc8, 0x68, 0x38, 0x60, 0x88, + 0x60, 0x31, 0x20, 0x00, 0xe7, 0xe1, 0xe7, 0xe0, + 0x2e, 0x08, 0x9d, 0xf0, 0x1c, 0x03, 0x1c, 0x0a, + 0x1c, 0x19, 0x68, 0xc8, 0x60, 0x50, 0x68, 0x88, + 0x60, 0x10, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, + 0xb5, 0xf3, 0xb0, 0x87, 0x21, 0x00, 0x91, 0x06, + 0x26, 0x00, 0x98, 0x07, 0xf0, 0x00, 0xfa, 0xcb, + 0x90, 0x03, 0x9c, 0x07, 0x9d, 0x08, 0x88, 0x69, + 0x91, 0x04, 0x98, 0x03, 0x99, 0x04, 0x42, 0x88, + 0xd0, 0x09, 0x48, 0xbb, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x05, 0x20, 0xff, 0xb0, 0x07, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x28, + 0x90, 0x05, 0x99, 0x04, 0x23, 0xff, 0x33, 0x01, + 0x42, 0x99, 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x07, + 0xe7, 0xf1, 0x98, 0x05, 0x99, 0x04, 0x18, 0x40, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 0xdd, 0x02, + 0x20, 0xff, 0xb0, 0x07, 0xe7, 0xe7, 0x48, 0xad, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0a, 0x68, 0xa0, + 0x23, 0x01, 0x06, 0x1b, 0x40, 0x18, 0xd0, 0x05, + 0x68, 0x68, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x8a, + 0xb0, 0x07, 0xe7, 0xd8, 0x62, 0x65, 0x69, 0x60, + 0x4b, 0xa5, 0x40, 0x18, 0x99, 0x05, 0x06, 0x09, + 0x0e, 0x09, 0x04, 0x09, 0x43, 0x08, 0x61, 0x60, + 0x02, 0x00, 0x68, 0xe0, 0x90, 0x00, 0x48, 0x9e, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x98, 0x00, + 0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0xe0, 0x05, 0x98, 0x00, 0x28, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x07, + 0xe7, 0xb5, 0x48, 0x94, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x1e, 0x48, 0x91, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x1a, 0x68, 0xa0, 0x02, 0x00, 0x0e, 0x00, + 0x06, 0x01, 0x0e, 0x09, 0x91, 0x06, 0x99, 0x04, + 0x29, 0x04, 0xd0, 0x06, 0x29, 0x10, 0xd0, 0x07, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xd0, 0x06, + 0xe0, 0x08, 0x26, 0xff, 0x36, 0x01, 0xe0, 0x07, + 0x26, 0x01, 0x02, 0x76, 0xe0, 0x04, 0x26, 0x03, + 0x02, 0x36, 0xe0, 0x01, 0x26, 0x00, 0xe7, 0xff, + 0x49, 0x84, 0x20, 0x91, 0xf0, 0x11, 0xfc, 0x04, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, + 0xff, 0xb1, 0xe7, 0xf5, 0x98, 0x00, 0x00, 0x80, + 0x49, 0x7f, 0x58, 0x08, 0x99, 0x07, 0x42, 0x88, + 0xd0, 0x05, 0x20, 0x92, 0x49, 0x7b, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x07, 0xe7, 0x7b, 0x48, 0x77, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x73, 0x48, 0x74, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x6f, 0x98, 0x00, + 0xf0, 0x02, 0xfe, 0xd6, 0x28, 0x00, 0xd0, 0x6a, + 0xb0, 0x82, 0x49, 0x74, 0x20, 0x91, 0xf0, 0x11, + 0xfb, 0xdf, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0xf0, 0x02, 0xff, 0x25, 0x20, 0x92, 0x49, 0x6f, + 0x60, 0x08, 0x20, 0x01, 0x49, 0x6e, 0x68, 0x09, + 0x60, 0x08, 0x27, 0x00, 0x20, 0x00, 0x90, 0x00, + 0x98, 0x00, 0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07, + 0xd2, 0x13, 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 0x18, 0x18, + 0x00, 0xc0, 0x4a, 0x65, 0x68, 0x12, 0x18, 0x80, + 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, + 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x00, + 0xe7, 0xe6, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x14, + 0x2f, 0x18, 0xd2, 0x12, 0x6a, 0xe0, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, + 0x43, 0x58, 0x4a, 0x59, 0x68, 0x12, 0x18, 0x80, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, + 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x00, + 0xe7, 0xe7, 0x3f, 0x01, 0x2f, 0x07, 0xd2, 0x10, + 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x50, + 0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b, + 0x18, 0xc0, 0x1c, 0x21, 0xf0, 0x02, 0xfb, 0x38, + 0x48, 0x4b, 0x68, 0x00, 0xf0, 0x02, 0xfe, 0xee, + 0xe0, 0x46, 0x2f, 0x18, 0xd2, 0x44, 0x20, 0x4c, + 0x43, 0x78, 0x49, 0x47, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x1c, 0x21, + 0xf0, 0x02, 0xfb, 0x26, 0x20, 0x4c, 0x43, 0x78, + 0x49, 0x41, 0x68, 0x09, 0xe0, 0x00, 0xe0, 0x48, + 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x82, + 0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c, + 0x43, 0x78, 0x49, 0x3b, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, + 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c, + 0x43, 0x78, 0x49, 0x35, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, + 0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x2e, 0x68, 0x12, + 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, + 0x67, 0x48, 0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x29, 0x68, 0x12, 0x18, 0x89, + 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, + 0x49, 0x24, 0x20, 0x91, 0xf0, 0x11, 0xfb, 0x40, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x22, + 0x68, 0x00, 0x90, 0x01, 0x48, 0x21, 0x68, 0x00, + 0x49, 0x1f, 0x60, 0x08, 0x98, 0x01, 0x49, 0x1f, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, + 0xb0, 0x02, 0x48, 0x15, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x1d, 0x98, 0x00, 0x01, 0x00, 0x4b, 0x1a, + 0x18, 0xc1, 0x91, 0x01, 0x1d, 0xe0, 0x30, 0x0d, + 0x90, 0x02, 0x98, 0x02, 0x68, 0x00, 0x99, 0x01, + 0x60, 0x08, 0x48, 0x0e, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x0d, 0x68, 0x68, 0x08, 0x80, 0x99, 0x06, + 0x00, 0x89, 0x4b, 0x12, 0x18, 0xc9, 0x67, 0x08, + 0x98, 0x05, 0x43, 0x30, 0x99, 0x06, 0x00, 0x89, + 0x4b, 0x0f, 0x18, 0xc9, 0x61, 0x08, 0x20, 0x92, + 0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x07, + 0xe6, 0x91, 0xb0, 0x07, 0xe6, 0x8f, 0x00, 0x00, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0x9d, 0xf0, + 0xff, 0x00, 0xff, 0xff, 0x2e, 0x08, 0xba, 0x2c, + 0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0xd1, 0xf4, + 0x2e, 0x08, 0xbb, 0x20, 0x2e, 0x08, 0xbb, 0x24, + 0x68, 0x00, 0x0c, 0x00, 0x68, 0x00, 0x0e, 0x00, + 0x68, 0x00, 0x0e, 0x80, 0x1c, 0x01, 0x1c, 0x0a, + 0x6a, 0x53, 0x1c, 0x18, 0x47, 0x70, 0xe7, 0xfd, + 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x82, 0x48, 0x2b, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x8a, + 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x98, 0x02, 0x90, 0x01, 0x98, 0x01, + 0x88, 0x44, 0x98, 0x01, 0x78, 0x06, 0x23, 0xff, + 0x33, 0x01, 0x42, 0x9c, 0xdd, 0x02, 0x20, 0xff, + 0xb0, 0x02, 0xe7, 0xee, 0x19, 0x30, 0x23, 0xff, + 0x33, 0x01, 0x42, 0x98, 0xdd, 0x02, 0x20, 0xff, + 0xb0, 0x02, 0xe7, 0xe6, 0x49, 0x1c, 0x20, 0x91, + 0xf0, 0x11, 0xfa, 0xc2, 0x28, 0x92, 0xd0, 0x03, + 0x20, 0x01, 0xf0, 0x01, 0xfe, 0x6f, 0xe7, 0xf5, + 0x2c, 0x10, 0xda, 0x0d, 0x25, 0x00, 0x42, 0xa5, + 0xdb, 0x02, 0xe0, 0x08, 0x35, 0x01, 0xe7, 0xfa, + 0xcf, 0x01, 0x19, 0x71, 0x00, 0x89, 0x4b, 0x13, + 0x18, 0xc9, 0x60, 0x08, 0xe7, 0xf6, 0xe0, 0x15, + 0x4a, 0x11, 0x43, 0x22, 0x92, 0x00, 0x20, 0x91, + 0x49, 0x10, 0x60, 0x08, 0x00, 0xb0, 0x4b, 0x0d, + 0x18, 0xc1, 0x9a, 0x00, 0x1c, 0x38, 0x23, 0x02, + 0xf0, 0x00, 0xfa, 0xfe, 0x28, 0x00, 0xd0, 0x00, + 0xe7, 0xf4, 0x48, 0x0a, 0x68, 0x00, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xfa, 0x20, 0x92, 0x49, 0x04, + 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xb0, + 0xb0, 0x02, 0xe7, 0xae, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xba, 0x30, 0x68, 0x00, 0x08, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x2e, 0x08, 0xba, 0x34, + 0x21, 0x04, 0xe0, 0x00, 0x31, 0x01, 0x1c, 0x08, + 0x47, 0x70, 0xe7, 0xfd, 0xb5, 0xf3, 0x1c, 0x0f, + 0xb0, 0x82, 0x48, 0x2b, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x20, 0x8a, 0xb0, 0x02, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, + 0x90, 0x01, 0x98, 0x01, 0x88, 0x44, 0x98, 0x01, + 0x78, 0x06, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c, + 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xee, + 0x19, 0x30, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, + 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, + 0x49, 0x1c, 0x20, 0x91, 0xf0, 0x11, 0xfa, 0x58, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, + 0xfe, 0x05, 0xe7, 0xf5, 0x2c, 0x10, 0xda, 0x0d, + 0x25, 0x00, 0x42, 0xa5, 0xdb, 0x02, 0xe0, 0x08, + 0x35, 0x01, 0xe7, 0xfa, 0x19, 0x70, 0x00, 0x80, + 0x4b, 0x13, 0x18, 0xc0, 0x68, 0x01, 0xc7, 0x02, + 0xe7, 0xf6, 0xe0, 0x15, 0x4a, 0x11, 0x43, 0x22, + 0x92, 0x00, 0x20, 0x91, 0x49, 0x10, 0x60, 0x08, + 0x00, 0xb0, 0x4b, 0x0d, 0x18, 0xc0, 0x9a, 0x00, + 0x1c, 0x39, 0x23, 0x02, 0xf0, 0x00, 0xfa, 0x94, + 0x28, 0x00, 0xd0, 0x00, 0xe7, 0xf4, 0x48, 0x0a, + 0x68, 0x00, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xfa, + 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x02, 0xe7, 0xb0, 0xb0, 0x02, 0xe7, 0xae, + 0x2e, 0x08, 0x9d, 0xf0, 0x2e, 0x08, 0xba, 0x30, + 0x68, 0x00, 0x08, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0xba, 0x34, 0xb5, 0xf7, 0x9a, 0x02, + 0x06, 0x15, 0x0e, 0x2d, 0x9c, 0x00, 0x88, 0x66, + 0x42, 0xb5, 0xdd, 0x04, 0x20, 0xff, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x20, + 0x19, 0x40, 0x06, 0x07, 0x0e, 0x3f, 0x23, 0xff, + 0x33, 0x01, 0x42, 0x9f, 0xdd, 0x01, 0x20, 0xff, + 0xe7, 0xf1, 0x49, 0x0a, 0x20, 0x91, 0xf0, 0x11, + 0xf9, 0xff, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x01, 0xfd, 0xac, 0xe7, 0xf5, 0x99, 0x01, + 0x00, 0xb8, 0x4b, 0x05, 0x18, 0xc0, 0x60, 0x01, + 0x20, 0x92, 0x49, 0x02, 0x60, 0x08, 0x20, 0x00, + 0xe7, 0xdd, 0xe7, 0xdc, 0x2e, 0x08, 0xba, 0x30, + 0x68, 0x00, 0x08, 0x00, 0xb5, 0xf7, 0x9a, 0x02, + 0x06, 0x14, 0x0e, 0x24, 0x9f, 0x00, 0x88, 0x7d, + 0x78, 0x38, 0x19, 0x00, 0x06, 0x06, 0x0e, 0x36, + 0x42, 0xac, 0xdd, 0x04, 0x20, 0xff, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x49, 0x0b, + 0x20, 0x91, 0xf0, 0x11, 0xf9, 0xd5, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfd, 0x82, + 0xe7, 0xf5, 0x00, 0xb0, 0x4b, 0x06, 0x18, 0xc0, + 0x68, 0x00, 0x99, 0x01, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x02, 0x60, 0x08, 0x20, 0x00, 0xe7, 0xe6, + 0xe7, 0xe5, 0x00, 0x00, 0x2e, 0x08, 0xba, 0x30, + 0x68, 0x00, 0x08, 0x00, 0x1c, 0x01, 0x1c, 0x0a, + 0x88, 0x50, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x80, + 0x1c, 0x01, 0x1c, 0x0f, 0x69, 0x3a, 0x2a, 0x08, + 0xd2, 0x12, 0xa3, 0x02, 0x5c, 0x9b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x07, 0x09, 0x0b, + 0x04, 0x07, 0x09, 0x0b, 0x20, 0x02, 0xbc, 0x80, + 0x47, 0x70, 0x20, 0x04, 0xe7, 0xfb, 0x20, 0x10, + 0xe7, 0xf9, 0x20, 0xff, 0x30, 0x01, 0xe7, 0xf6, + 0x20, 0x00, 0xe7, 0xf4, 0xe7, 0xf3, 0xb5, 0xf3, + 0x98, 0x00, 0x06, 0x05, 0x0e, 0x2d, 0x48, 0x89, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x8b, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x48, 0x85, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x04, + 0x2d, 0x17, 0xdd, 0x02, 0x20, 0x8c, 0xe7, 0xf3, + 0xe0, 0xfe, 0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c, + 0xe7, 0xee, 0x49, 0x80, 0x20, 0x91, 0xf0, 0x11, + 0xf9, 0x7f, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x01, 0xfd, 0x2c, 0xe7, 0xf5, 0x1c, 0x28, + 0xf7, 0xf8, 0xfc, 0xd8, 0x1c, 0x04, 0x2c, 0x00, + 0xd0, 0x09, 0x68, 0xa0, 0x4b, 0x78, 0x40, 0x18, + 0x99, 0x01, 0x07, 0xc9, 0x09, 0xc9, 0x43, 0x08, + 0x60, 0xa0, 0x01, 0xc0, 0xe0, 0x04, 0x20, 0x92, + 0x49, 0x72, 0x60, 0x08, 0x20, 0xff, 0xe7, 0xcf, + 0x48, 0x6f, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x11, + 0x99, 0x01, 0x29, 0x00, 0xd0, 0x06, 0x48, 0x6f, + 0x21, 0x01, 0x40, 0xa9, 0x68, 0x02, 0x43, 0x11, + 0x60, 0x01, 0xe0, 0x06, 0x48, 0x6b, 0x21, 0x01, + 0x40, 0xa9, 0x43, 0xc9, 0x68, 0x02, 0x40, 0x11, + 0x60, 0x01, 0xe0, 0xbf, 0x68, 0xe0, 0xf0, 0x02, + 0xfc, 0x3b, 0x28, 0x00, 0xd0, 0x73, 0xb0, 0x81, + 0x49, 0x65, 0x20, 0x91, 0xf0, 0x11, 0xf9, 0x44, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x02, + 0xfc, 0x8a, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x60, 0x68, 0x09, 0x60, 0x08, + 0x27, 0x00, 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x14, + 0x2f, 0x07, 0xd2, 0x12, 0x6a, 0xe0, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, + 0x18, 0x18, 0x00, 0xc0, 0x4a, 0x57, 0x68, 0x12, + 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, + 0x6f, 0xc0, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01, + 0xe7, 0xe8, 0x2e, 0x00, 0xd1, 0x13, 0x2f, 0x18, + 0xd2, 0x11, 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, 0x43, 0x58, + 0x4a, 0x4c, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, + 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, + 0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe9, 0x3f, 0x01, + 0x2f, 0x07, 0xd2, 0x32, 0x99, 0x02, 0x29, 0x00, + 0xd0, 0x16, 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, + 0x49, 0x42, 0x68, 0x09, 0x18, 0x40, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc0, 0x6e, 0x80, 0x4b, 0x40, + 0x43, 0x18, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, + 0x4a, 0x3c, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x17, + 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x37, + 0x68, 0x09, 0x18, 0x40, 0x23, 0x05, 0x02, 0x1b, + 0x18, 0xc0, 0x6e, 0x80, 0x04, 0x00, 0x0c, 0x00, + 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x31, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, + 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x00, 0xe0, 0x45, + 0xe0, 0x2b, 0x99, 0x02, 0x29, 0x00, 0xd0, 0x14, + 0x20, 0x4c, 0x43, 0x78, 0x49, 0x29, 0x68, 0x09, + 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x68, 0x00, 0x4b, 0x27, 0x43, 0x18, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x24, 0x68, 0x12, 0x18, 0x89, + 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 0x60, 0x08, + 0xe0, 0x13, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x1f, + 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x19, 0x68, 0x12, + 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, + 0x60, 0x08, 0x48, 0x16, 0x68, 0x00, 0xf0, 0x02, + 0xfc, 0x05, 0x49, 0x13, 0x20, 0x91, 0xf0, 0x11, + 0xf8, 0x9f, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0x48, 0x10, 0x68, 0x00, 0x90, 0x00, 0x48, 0x11, + 0x68, 0x00, 0x49, 0x0e, 0x60, 0x08, 0x98, 0x00, + 0x49, 0x0e, 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, + 0x60, 0x08, 0xb0, 0x01, 0x20, 0x92, 0x49, 0x05, + 0x60, 0x08, 0x20, 0x00, 0xe6, 0xf4, 0xe6, 0xf3, + 0xe6, 0xf2, 0x00, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x30, + 0xfe, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x20, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0xff, 0xff, 0x00, 0x00, 0x2e, 0x08, 0xbb, 0x24, + 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x26, + 0x0e, 0x36, 0x48, 0x0f, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x2e, 0x07, 0xdd, 0x01, 0x20, 0x8c, + 0xe7, 0xf8, 0x1c, 0x30, 0xf7, 0xf8, 0xfb, 0xc2, + 0x1c, 0x05, 0x2d, 0x00, 0xd0, 0x04, 0x68, 0xa8, + 0x01, 0xc0, 0x0f, 0xc0, 0x60, 0x38, 0xe0, 0x04, + 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0xff, + 0xe7, 0xe8, 0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5, + 0x2e, 0x08, 0x9d, 0xf0, 0x2e, 0x08, 0xba, 0x30, + 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, + 0x0e, 0x2d, 0x48, 0x20, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x48, 0x1d, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x04, 0x2d, 0x17, 0xdd, 0x02, 0x20, 0x8c, + 0xe7, 0xf4, 0xe0, 0x2d, 0x2d, 0x07, 0xdd, 0x01, + 0x20, 0x8c, 0xe7, 0xef, 0x48, 0x16, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xe9, + 0x49, 0x14, 0x20, 0x91, 0xf0, 0x11, 0xf8, 0x28, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, + 0xfb, 0xd5, 0xe7, 0xf5, 0x2f, 0x00, 0xd0, 0x08, + 0x48, 0x0f, 0x1d, 0xe9, 0x31, 0x01, 0x22, 0x01, + 0x40, 0x8a, 0x68, 0x01, 0x43, 0x11, 0x60, 0x01, + 0xe0, 0x08, 0x48, 0x0b, 0x1d, 0xea, 0x32, 0x01, + 0x21, 0x01, 0x40, 0x91, 0x43, 0xc9, 0x68, 0x02, + 0x40, 0x11, 0x60, 0x01, 0x20, 0x92, 0x49, 0x05, + 0x60, 0x08, 0x20, 0x00, 0xe7, 0xc6, 0xe7, 0xc5, + 0xe7, 0xc4, 0x00, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x30, + 0x68, 0x00, 0x00, 0x20, 0xb4, 0x90, 0x1c, 0x07, + 0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x48, 0x10, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x8b, + 0xbc, 0x90, 0x47, 0x70, 0x29, 0x07, 0xdd, 0x01, + 0x20, 0x8c, 0xe7, 0xf9, 0x48, 0x0b, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xf3, + 0x1d, 0xc8, 0x30, 0x01, 0x24, 0x01, 0x40, 0x84, + 0x1c, 0x23, 0x20, 0x0d, 0x06, 0xc0, 0x6a, 0x00, + 0x40, 0x18, 0x1d, 0xcc, 0x34, 0x01, 0x40, 0xe0, + 0x60, 0x10, 0x20, 0x00, 0xe7, 0xe4, 0xe7, 0xe3, + 0x2e, 0x08, 0x9d, 0xf0, 0x2e, 0x08, 0xd1, 0xf0, + 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, + 0x0e, 0x2d, 0x48, 0x13, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c, + 0xe7, 0xf8, 0x48, 0x0e, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xf2, 0x49, 0x0c, + 0x20, 0x91, 0xf0, 0x10, 0xff, 0xb9, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfb, 0x66, + 0xe7, 0xf5, 0x08, 0xb8, 0x00, 0xa9, 0x4b, 0x07, + 0x18, 0xc9, 0x67, 0x08, 0x20, 0x92, 0x49, 0x04, + 0x60, 0x08, 0x20, 0x00, 0xe7, 0xde, 0xe7, 0xdd, + 0x2e, 0x08, 0x9d, 0xf0, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x30, 0x68, 0x00, 0x0e, 0x00, + 0xb4, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, + 0x1c, 0x1e, 0x04, 0x3f, 0x0c, 0x3f, 0x1c, 0x39, + 0x29, 0x00, 0xd8, 0x02, 0xe0, 0x04, 0x39, 0x01, + 0xe7, 0xfa, 0xcd, 0x04, 0xc4, 0x04, 0xe7, 0xfa, + 0x20, 0x92, 0x4a, 0x03, 0x60, 0x10, 0x20, 0x00, + 0xbc, 0xf0, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, + 0x2e, 0x08, 0xba, 0x34, 0x20, 0x00, 0x6b, 0x00, + 0x49, 0x63, 0x60, 0x08, 0x20, 0x00, 0x6b, 0x40, + 0x49, 0x62, 0x60, 0x08, 0x48, 0x62, 0x49, 0x63, + 0x60, 0x08, 0x48, 0x63, 0x49, 0x63, 0x60, 0x08, + 0x20, 0x00, 0x6a, 0xc0, 0x49, 0x62, 0x60, 0x08, + 0x48, 0x62, 0x49, 0x63, 0x60, 0x08, 0x48, 0x63, + 0x49, 0x63, 0x60, 0x08, 0x48, 0x63, 0x49, 0x64, + 0x60, 0x08, 0x20, 0x00, 0x6b, 0x80, 0x49, 0x63, + 0x60, 0x08, 0x20, 0x00, 0x6b, 0xc0, 0x49, 0x62, + 0x60, 0x08, 0x20, 0x00, 0x6c, 0x00, 0x49, 0x61, + 0x60, 0x08, 0x20, 0x00, 0x6c, 0x40, 0x49, 0x60, + 0x60, 0x08, 0x20, 0x00, 0x6c, 0x80, 0x49, 0x5f, + 0x60, 0x08, 0x20, 0x00, 0x6c, 0xc0, 0x49, 0x5e, + 0x60, 0x08, 0x20, 0x00, 0x6e, 0xc0, 0x49, 0x5d, + 0x60, 0x08, 0x20, 0x80, 0x6d, 0x00, 0x49, 0x5c, + 0x60, 0x08, 0x20, 0x80, 0x6d, 0x40, 0x49, 0x5b, + 0x60, 0x08, 0x20, 0x80, 0x6d, 0x80, 0x49, 0x5a, + 0x60, 0x08, 0x20, 0x00, 0x6d, 0x00, 0x49, 0x59, + 0x60, 0x08, 0x20, 0x00, 0x6d, 0x40, 0x49, 0x58, + 0x60, 0x08, 0x20, 0x00, 0x6d, 0x80, 0x49, 0x57, + 0x60, 0x08, 0x20, 0x00, 0x6d, 0xc0, 0x49, 0x56, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0xc0, 0x49, 0x55, + 0x60, 0x08, 0x20, 0x80, 0x6d, 0xc0, 0x49, 0x54, + 0x60, 0x08, 0x20, 0x80, 0x6c, 0xc0, 0x49, 0x53, + 0x60, 0x08, 0x20, 0x80, 0x68, 0x40, 0x49, 0x52, + 0x60, 0x08, 0x20, 0x80, 0x68, 0x80, 0x49, 0x51, + 0x60, 0x08, 0x20, 0x80, 0x68, 0xc0, 0x49, 0x50, + 0x60, 0x08, 0x20, 0x80, 0x69, 0x00, 0x49, 0x4f, + 0x60, 0x08, 0x20, 0x80, 0x69, 0x40, 0x49, 0x4e, + 0x60, 0x08, 0x20, 0x80, 0x69, 0x80, 0x49, 0x4d, + 0x60, 0x08, 0x20, 0x80, 0x69, 0xc0, 0x49, 0x4c, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0x00, 0x49, 0x4b, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0x40, 0x49, 0x4a, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0x80, 0x49, 0x49, + 0x60, 0x08, 0x20, 0x00, 0x6f, 0x00, 0x49, 0x48, + 0x60, 0x08, 0x20, 0x00, 0x6f, 0x40, 0x49, 0x47, + 0x60, 0x08, 0x20, 0x80, 0x6c, 0x40, 0x49, 0x46, + 0x60, 0x08, 0x20, 0x80, 0x6c, 0x80, 0x49, 0x45, + 0x60, 0x08, 0x20, 0x80, 0x6e, 0x40, 0x49, 0x44, + 0x60, 0x08, 0x20, 0x80, 0x6e, 0x80, 0x49, 0x43, + 0x60, 0x08, 0x20, 0x00, 0x49, 0x42, 0x60, 0x08, + 0x20, 0x00, 0x49, 0x41, 0x60, 0x48, 0x48, 0x41, + 0x49, 0x3f, 0x60, 0x88, 0x48, 0x40, 0x49, 0x3e, + 0x60, 0xc8, 0x20, 0xff, 0x30, 0x01, 0x68, 0x40, + 0x49, 0x3e, 0x60, 0x08, 0x20, 0x80, 0x6e, 0xc0, + 0x49, 0x3d, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x00, + 0x49, 0x3c, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x40, + 0x49, 0x3b, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x80, + 0x49, 0x3a, 0x60, 0x08, 0x20, 0x80, 0x6f, 0xc0, + 0x49, 0x39, 0x60, 0x08, 0x20, 0xff, 0x30, 0x01, + 0x68, 0x80, 0x49, 0x38, 0x60, 0x08, 0x47, 0x70, + 0x2e, 0x08, 0x9b, 0x28, 0x2e, 0x08, 0x9b, 0x2c, + 0x64, 0x00, 0x05, 0x00, 0x2e, 0x08, 0x9b, 0x34, + 0x64, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x9b, 0x38, + 0x2e, 0x08, 0x9b, 0x30, 0x64, 0x00, 0x04, 0x00, + 0x2e, 0x08, 0x9b, 0x3c, 0x9e, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0x54, 0x9e, 0x00, 0x05, 0x00, + 0x2e, 0x08, 0x9b, 0x40, 0x2e, 0x08, 0xd2, 0x08, + 0x2e, 0x08, 0xd2, 0x0c, 0x2e, 0x08, 0xd2, 0x10, + 0x2e, 0x08, 0xd2, 0x14, 0x2e, 0x08, 0x9b, 0x44, + 0x2e, 0x08, 0x9b, 0x48, 0x2e, 0x08, 0x9b, 0x58, + 0x2e, 0x08, 0x9b, 0x5c, 0x2e, 0x08, 0x9b, 0x60, + 0x2e, 0x08, 0x9b, 0x64, 0x2e, 0x08, 0x9b, 0x4c, + 0x2e, 0x08, 0x9b, 0x50, 0x2e, 0x08, 0x9d, 0xd8, + 0x2e, 0x08, 0x9d, 0xdc, 0x2e, 0x08, 0x9b, 0x68, + 0x2e, 0x08, 0x9b, 0x6c, 0x2e, 0x08, 0x9b, 0x98, + 0x2e, 0x08, 0x9b, 0x70, 0x2e, 0x08, 0x9b, 0x74, + 0x2e, 0x08, 0x9b, 0x78, 0x2e, 0x08, 0x9b, 0x7c, + 0x2e, 0x08, 0x9b, 0x80, 0x2e, 0x08, 0x9b, 0x84, + 0x2e, 0x08, 0x9b, 0x88, 0x2e, 0x08, 0x9b, 0x8c, + 0x2e, 0x08, 0x9b, 0x90, 0x2e, 0x08, 0x9b, 0x94, + 0x2e, 0x08, 0x9b, 0x1c, 0x2e, 0x08, 0x9b, 0x20, + 0x2e, 0x08, 0xb9, 0xb0, 0x2e, 0x08, 0x9b, 0xc0, + 0x2e, 0x08, 0x9b, 0xa0, 0x2e, 0x08, 0x9d, 0xe0, + 0x2e, 0x08, 0xb9, 0x88, 0xcc, 0x1f, 0xe0, 0x00, + 0xcc, 0x1f, 0xfe, 0x00, 0x2e, 0x08, 0x9b, 0xac, + 0x2e, 0x08, 0x9b, 0xc4, 0x2e, 0x08, 0x9b, 0xa4, + 0x2e, 0x08, 0x9b, 0xa8, 0x2e, 0x08, 0xb9, 0xac, + 0x2e, 0x08, 0xb9, 0x84, 0x2e, 0x08, 0x9b, 0xb4, + 0x49, 0x4f, 0x68, 0x0a, 0x23, 0x04, 0x43, 0x1a, + 0x60, 0x0a, 0x21, 0xff, 0x4a, 0x4d, 0x68, 0x12, + 0x32, 0x40, 0x72, 0x11, 0x21, 0xff, 0x4a, 0x4b, + 0x68, 0x12, 0x32, 0x40, 0x76, 0x11, 0x21, 0xff, + 0x4a, 0x48, 0x68, 0x12, 0x32, 0x60, 0x72, 0x11, + 0x21, 0xff, 0x4a, 0x46, 0x68, 0x12, 0x32, 0x20, + 0x72, 0x11, 0x21, 0xff, 0x4a, 0x43, 0x68, 0x12, + 0x32, 0x20, 0x76, 0x11, 0x21, 0xff, 0x4a, 0x41, + 0x68, 0x12, 0x32, 0x60, 0x76, 0x11, 0x21, 0x00, + 0x4a, 0x3e, 0x68, 0x12, 0x32, 0x40, 0x72, 0x91, + 0x21, 0x00, 0x4a, 0x3c, 0x68, 0x12, 0x32, 0x40, + 0x76, 0x91, 0x21, 0x00, 0x4a, 0x39, 0x68, 0x12, + 0x32, 0x60, 0x72, 0x91, 0x21, 0x00, 0x4a, 0x37, + 0x68, 0x12, 0x32, 0x20, 0x72, 0x91, 0x21, 0x00, + 0x4a, 0x34, 0x68, 0x12, 0x32, 0x20, 0x76, 0x91, + 0x21, 0x00, 0x4a, 0x32, 0x68, 0x12, 0x32, 0x60, + 0x76, 0x91, 0x21, 0x00, 0x4a, 0x2f, 0x68, 0x12, + 0x32, 0x80, 0x70, 0xd1, 0x21, 0x00, 0x4a, 0x2d, + 0x68, 0x12, 0x32, 0x80, 0x70, 0x51, 0x21, 0x00, + 0x4a, 0x2a, 0x68, 0x12, 0x32, 0x80, 0x70, 0x91, + 0x21, 0x00, 0x4a, 0x29, 0x60, 0x11, 0x21, 0x00, + 0x4a, 0x28, 0x64, 0x11, 0x21, 0x03, 0x4a, 0x28, + 0x61, 0x11, 0x49, 0x28, 0x68, 0x0a, 0x4b, 0x28, + 0x43, 0x1a, 0x60, 0x0a, 0x49, 0x26, 0x22, 0x33, + 0x06, 0x52, 0x60, 0x51, 0x21, 0x00, 0x4a, 0x25, + 0x70, 0x11, 0x21, 0x00, 0x4a, 0x23, 0x70, 0x51, + 0x21, 0x00, 0x4a, 0x22, 0x70, 0x91, 0x21, 0x00, + 0x4a, 0x20, 0x70, 0xd1, 0x21, 0x00, 0x4a, 0x1f, + 0x71, 0x11, 0x21, 0x00, 0x4a, 0x1d, 0x71, 0x51, + 0x21, 0x00, 0x4a, 0x1c, 0x71, 0x91, 0x21, 0x00, + 0x4a, 0x1a, 0x71, 0xd1, 0x21, 0x00, 0x4a, 0x19, + 0x72, 0x11, 0x21, 0x00, 0x4a, 0x17, 0x72, 0x51, + 0x21, 0x00, 0x4a, 0x16, 0x72, 0x91, 0x21, 0x00, + 0x4a, 0x14, 0x72, 0xd1, 0x21, 0x00, 0x4a, 0x13, + 0x73, 0x11, 0x21, 0xff, 0x4a, 0x11, 0x70, 0x11, + 0x21, 0x00, 0x4a, 0x10, 0x70, 0x11, 0x21, 0x00, + 0x4a, 0x0e, 0x70, 0x51, 0x20, 0x00, 0x28, 0x20, + 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x41, 0x06, 0x08, + 0x0e, 0x00, 0xe7, 0xf8, 0x21, 0xff, 0x4a, 0x03, + 0x68, 0x12, 0x54, 0x11, 0xe7, 0xf6, 0x47, 0x70, + 0x66, 0x00, 0x01, 0x18, 0x2e, 0x08, 0xb9, 0xb0, + 0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, + 0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, + 0x23, 0x48, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xb4, + 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x39, + 0x0e, 0x09, 0x29, 0x05, 0xd2, 0x40, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x03, 0x14, 0x07, 0x0d, 0x13, 0x00, 0x78, 0x10, + 0x4b, 0x1f, 0x70, 0x18, 0xe0, 0x38, 0x78, 0x50, + 0x4b, 0x1e, 0x68, 0x1b, 0x33, 0x80, 0x71, 0x58, + 0xe0, 0x32, 0x78, 0x10, 0x4b, 0x1b, 0x68, 0x1b, + 0x33, 0x80, 0x71, 0x18, 0xe0, 0x2c, 0xe0, 0x2b, + 0x78, 0x10, 0x4b, 0x17, 0x70, 0x18, 0x78, 0x50, + 0x4b, 0x15, 0x70, 0x58, 0x78, 0x90, 0x4b, 0x14, + 0x70, 0x98, 0x78, 0xd0, 0x4b, 0x12, 0x70, 0xd8, + 0x79, 0x10, 0x4b, 0x11, 0x71, 0x18, 0x79, 0x50, + 0x4b, 0x0f, 0x71, 0x58, 0x79, 0x90, 0x4b, 0x0e, + 0x71, 0x98, 0x79, 0xd0, 0x4b, 0x0c, 0x71, 0xd8, + 0x7a, 0x10, 0x4b, 0x0b, 0x72, 0x18, 0x7a, 0x50, + 0x4b, 0x09, 0x72, 0x58, 0x7a, 0x90, 0x4b, 0x08, + 0x72, 0x98, 0x7a, 0xd0, 0x4b, 0x06, 0x72, 0xd8, + 0x7b, 0x10, 0x4b, 0x05, 0x73, 0x18, 0xe0, 0x03, + 0x20, 0x4a, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xff, + 0x20, 0x00, 0xe7, 0xfa, 0xe7, 0xf9, 0x00, 0x00, + 0x2e, 0x08, 0xb9, 0xb4, 0x2e, 0x08, 0xb9, 0xb0, + 0xb5, 0xf3, 0x1c, 0x07, 0x06, 0x3e, 0x0e, 0x36, + 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0x2e, 0x20, + 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x02, 0xd0, 0x03, + 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, + 0x48, 0xb8, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x39, 0x48, 0xb5, 0x68, 0x00, + 0x30, 0x20, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x33, + 0x2c, 0x00, 0xd1, 0x17, 0x48, 0xb1, 0x68, 0x00, + 0x30, 0x40, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x2b, + 0x48, 0xae, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80, + 0x28, 0x00, 0xd1, 0x25, 0x48, 0xab, 0x68, 0x00, + 0x30, 0x60, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x1f, + 0x48, 0xa8, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80, + 0x28, 0x00, 0xd1, 0x19, 0x2c, 0x01, 0xd1, 0x19, + 0x48, 0xa4, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x11, 0x48, 0xa1, 0x68, 0x00, + 0x30, 0x40, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x0b, + 0x48, 0x9e, 0x68, 0x00, 0x30, 0x60, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x05, 0x48, 0x9b, 0x68, 0x00, + 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 0xd0, 0x01, + 0x20, 0x49, 0xe7, 0xb3, 0x48, 0x97, 0x68, 0x00, + 0x55, 0x84, 0x2c, 0xff, 0xd0, 0x73, 0x20, 0x01, + 0x49, 0x95, 0x60, 0x48, 0x2c, 0x05, 0xd2, 0x6f, + 0xa3, 0x01, 0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, + 0x02, 0x34, 0x30, 0x30, 0x30, 0x00, 0x20, 0x02, + 0x49, 0x90, 0x61, 0x88, 0x48, 0x90, 0x6a, 0xc0, + 0x49, 0x90, 0x60, 0x08, 0x48, 0x90, 0x68, 0x01, + 0x23, 0x01, 0x07, 0x5b, 0x43, 0x19, 0x60, 0x01, + 0x48, 0x8e, 0x49, 0x8b, 0x62, 0xc8, 0x48, 0x8c, + 0x68, 0x01, 0x4b, 0x8d, 0x40, 0x19, 0x60, 0x01, + 0x20, 0x01, 0x21, 0x31, 0x06, 0x49, 0x61, 0x88, + 0x20, 0x15, 0x21, 0x31, 0x06, 0x49, 0x61, 0x08, + 0x20, 0x0f, 0x21, 0x31, 0x06, 0x49, 0x61, 0xc8, + 0x20, 0x0c, 0x21, 0x31, 0x06, 0x49, 0x61, 0xc8, + 0x20, 0x54, 0x21, 0x31, 0x06, 0x49, 0x62, 0xc8, + 0x20, 0x37, 0x21, 0x31, 0x06, 0x49, 0x60, 0x88, + 0xe0, 0x56, 0x20, 0x00, 0x49, 0x79, 0x61, 0x88, + 0xe0, 0x52, 0x20, 0x01, 0x49, 0x77, 0x61, 0x88, + 0x20, 0x01, 0x49, 0x7c, 0x62, 0x88, 0x48, 0x7c, + 0x78, 0x00, 0x06, 0x80, 0x0e, 0x80, 0x02, 0x80, + 0x49, 0x79, 0x78, 0x49, 0x07, 0xc9, 0x0d, 0x89, + 0x43, 0x08, 0x49, 0x77, 0x78, 0x89, 0x07, 0xc9, + 0x0d, 0xc9, 0x43, 0x08, 0x49, 0x74, 0x78, 0xc9, + 0x07, 0x89, 0x0f, 0x89, 0x01, 0x89, 0x43, 0x08, + 0x49, 0x71, 0x79, 0x09, 0x07, 0x89, 0x0f, 0x89, + 0x01, 0x09, 0x43, 0x08, 0x49, 0x6e, 0x79, 0x49, + 0x07, 0x89, 0x0f, 0x89, 0x00, 0x89, 0x43, 0x08, + 0x49, 0x6b, 0x79, 0x89, 0x07, 0x89, 0x0f, 0x89, + 0x43, 0x08, 0x49, 0x68, 0x62, 0x08, 0x48, 0x68, + 0x79, 0xc0, 0x07, 0xc0, 0x0e, 0x40, 0x49, 0x66, + 0x7a, 0x09, 0x07, 0xc9, 0xe0, 0x01, 0xe0, 0x21, + 0xe0, 0x18, 0x0e, 0xc9, 0x43, 0x08, 0x49, 0x62, + 0x7a, 0x49, 0x07, 0xc9, 0x0f, 0x09, 0x43, 0x08, + 0x49, 0x5f, 0x7a, 0x89, 0x07, 0xc9, 0x0f, 0x49, + 0x43, 0x08, 0x49, 0x5d, 0x7a, 0xc9, 0x07, 0xc9, + 0x0f, 0x89, 0x43, 0x08, 0x49, 0x5a, 0x7b, 0x09, + 0x07, 0xc9, 0x0f, 0xc9, 0x43, 0x08, 0x49, 0x57, + 0x62, 0x48, 0xe0, 0x01, 0x20, 0x4a, 0xe7, 0x1d, + 0x48, 0x51, 0x68, 0x01, 0x4b, 0x55, 0x40, 0x19, + 0x60, 0x01, 0xe0, 0x8f, 0x48, 0x49, 0x68, 0x00, + 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x08, + 0x22, 0x00, 0xb4, 0x04, 0x1c, 0x30, 0x23, 0x00, + 0x22, 0x00, 0x49, 0x4f, 0xf7, 0xf4, 0xfc, 0x10, + 0xb0, 0x01, 0x20, 0x00, 0x49, 0x42, 0x60, 0x48, + 0x48, 0x45, 0x68, 0x01, 0x4b, 0x4b, 0x43, 0x19, + 0x60, 0x01, 0x48, 0x4a, 0x21, 0x33, 0x06, 0x49, + 0x60, 0x48, 0x48, 0x49, 0x68, 0x01, 0x23, 0x04, + 0x43, 0x19, 0x60, 0x01, 0x2c, 0x00, 0xd1, 0x0e, + 0x48, 0x3c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0a, + 0x48, 0x3a, 0x68, 0x00, 0x49, 0x38, 0x62, 0xc8, + 0x20, 0x00, 0x49, 0x38, 0x60, 0x08, 0x20, 0x00, + 0x21, 0x31, 0x06, 0x49, 0x61, 0x88, 0x20, 0x00, + 0x49, 0x30, 0x68, 0x09, 0x31, 0x80, 0x70, 0x48, + 0x20, 0x00, 0x49, 0x2e, 0x68, 0x09, 0x31, 0x80, + 0x70, 0x88, 0x20, 0x00, 0x49, 0x39, 0x60, 0x08, + 0x20, 0x00, 0x49, 0x39, 0x64, 0x08, 0x20, 0x03, + 0x49, 0x2a, 0x61, 0x08, 0x25, 0x00, 0x2d, 0x20, + 0xd3, 0x02, 0xe0, 0x06, 0x35, 0x01, 0xe7, 0xfa, + 0x20, 0xff, 0x49, 0x24, 0x68, 0x09, 0x55, 0x48, + 0xe7, 0xf8, 0x20, 0xff, 0x49, 0x21, 0x68, 0x09, + 0x31, 0x40, 0x72, 0x08, 0x20, 0xff, 0x49, 0x1f, + 0x68, 0x09, 0x31, 0x40, 0x76, 0x08, 0x20, 0xff, + 0x49, 0x1c, 0x68, 0x09, 0x31, 0x60, 0x72, 0x08, + 0x20, 0xff, 0x49, 0x1a, 0x68, 0x09, 0x31, 0x20, + 0x72, 0x08, 0x20, 0xff, 0x49, 0x17, 0x68, 0x09, + 0x31, 0x20, 0x76, 0x08, 0x20, 0xff, 0x49, 0x15, + 0x68, 0x09, 0x31, 0x60, 0x76, 0x08, 0x20, 0x00, + 0x49, 0x12, 0x68, 0x09, 0x31, 0x40, 0x72, 0x88, + 0x20, 0x00, 0x49, 0x10, 0x68, 0x09, 0x31, 0x40, + 0x76, 0x88, 0x20, 0x00, 0x49, 0x0d, 0x68, 0x09, + 0x31, 0x60, 0x72, 0x88, 0x20, 0x00, 0x49, 0x0b, + 0x68, 0x09, 0x31, 0x20, 0x72, 0x88, 0x20, 0x00, + 0x49, 0x08, 0x68, 0x09, 0x31, 0x20, 0x76, 0x88, + 0x20, 0x00, 0x49, 0x06, 0x68, 0x09, 0x31, 0x60, + 0x76, 0x88, 0x20, 0x00, 0x49, 0x03, 0x68, 0x09, + 0x31, 0x80, 0x70, 0xc8, 0x20, 0x00, 0xe6, 0x85, + 0xe6, 0x84, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xb0, + 0x62, 0x00, 0x03, 0x00, 0x66, 0x00, 0x01, 0x00, + 0xa0, 0x00, 0x0d, 0x80, 0x2e, 0x08, 0x20, 0x88, + 0x66, 0x00, 0x00, 0x08, 0x2e, 0x01, 0xe1, 0xa8, + 0xdf, 0xff, 0xff, 0xff, 0x62, 0x01, 0x00, 0x00, + 0x2e, 0x08, 0xb9, 0xb4, 0xfc, 0xb7, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x23, 0x48, 0x00, 0x00, + 0x66, 0x00, 0x01, 0x18, 0x9e, 0x00, 0x0a, 0x00, + 0x9e, 0x00, 0x0a, 0x80, 0xb5, 0xf7, 0x1c, 0x17, + 0x98, 0x00, 0x06, 0x02, 0x0e, 0x12, 0x99, 0x01, + 0x06, 0x0d, 0x0e, 0x2d, 0x48, 0x6a, 0x68, 0x00, + 0x5c, 0x81, 0x2a, 0x20, 0xdb, 0x04, 0x20, 0xa2, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x29, 0xff, 0xd1, 0x01, 0x20, 0x4b, 0xe7, 0xf7, + 0x48, 0x64, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x03, + 0x29, 0x04, 0xd1, 0x01, 0x20, 0x58, 0xe7, 0xef, + 0x48, 0x60, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x03, + 0x29, 0x02, 0xd0, 0x01, 0x29, 0x03, 0xd1, 0x0b, + 0x48, 0x5c, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, + 0x29, 0x00, 0xd1, 0x05, 0x48, 0x59, 0x69, 0x80, + 0x28, 0x01, 0xd1, 0x03, 0x29, 0x01, 0xd0, 0x01, + 0x20, 0x4d, 0xe7, 0xd9, 0x29, 0x02, 0xd1, 0x05, + 0x48, 0x53, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x17, 0x29, 0x03, 0xd1, 0x05, + 0x48, 0x4f, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80, + 0x28, 0x00, 0xd1, 0x0f, 0x29, 0x00, 0xd1, 0x05, + 0x48, 0x4b, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x07, 0x29, 0x01, 0xd1, 0x07, + 0x48, 0x47, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0x4e, 0xe7, 0xb7, + 0x68, 0x78, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x4c, + 0xe7, 0xb2, 0x23, 0x01, 0x01, 0x08, 0x4e, 0x40, + 0x68, 0x36, 0x19, 0x80, 0x30, 0x20, 0x72, 0x83, + 0x2d, 0x01, 0xd1, 0x0b, 0x20, 0x33, 0x06, 0x40, + 0x6e, 0x40, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, + 0x00, 0xd3, 0x4e, 0x3b, 0x68, 0x36, 0x19, 0x9b, + 0x60, 0x58, 0xe0, 0x12, 0x2d, 0x02, 0xd1, 0x0a, + 0x48, 0x38, 0x6c, 0xc0, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc3, 0x00, 0xd0, 0x4e, 0x34, 0x68, 0x36, + 0x19, 0x80, 0x60, 0x43, 0xe0, 0x05, 0x68, 0x3b, + 0x00, 0xd0, 0x4e, 0x31, 0x68, 0x36, 0x19, 0x80, + 0x60, 0x43, 0x68, 0x3b, 0x01, 0x08, 0x4e, 0x2c, + 0x68, 0x36, 0x19, 0x80, 0x62, 0x03, 0x68, 0x7b, + 0x01, 0x08, 0x4e, 0x29, 0x68, 0x36, 0x19, 0x80, + 0x62, 0x43, 0x01, 0x08, 0x4b, 0x26, 0x68, 0x1b, + 0x18, 0xc0, 0x62, 0xc7, 0x01, 0x08, 0x4b, 0x24, + 0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20, 0x72, 0x45, + 0x01, 0x08, 0x4b, 0x21, 0x68, 0x1b, 0x18, 0xc0, + 0x30, 0x20, 0x72, 0x02, 0x20, 0x00, 0x60, 0x78, + 0x20, 0x00, 0x72, 0x78, 0x20, 0x00, 0x4b, 0x20, + 0x60, 0x18, 0x20, 0x00, 0x4b, 0x1f, 0x64, 0x18, + 0x01, 0x08, 0x4b, 0x19, 0x68, 0x1b, 0x18, 0xc0, + 0x6a, 0x40, 0x28, 0xbc, 0xdd, 0x01, 0x24, 0xbc, + 0xe0, 0x04, 0x01, 0x08, 0x4b, 0x14, 0x68, 0x1b, + 0x18, 0xc0, 0x6a, 0x44, 0x48, 0x18, 0x60, 0x04, + 0x29, 0x01, 0xd1, 0x14, 0x20, 0x01, 0x4b, 0x17, + 0x62, 0x98, 0x48, 0x17, 0x68, 0x03, 0x04, 0x1b, + 0x0c, 0x1b, 0x60, 0x03, 0x48, 0x14, 0x04, 0x23, + 0x68, 0x06, 0x43, 0x33, 0x60, 0x03, 0x48, 0x13, + 0x68, 0x06, 0x23, 0x20, 0x43, 0x33, 0x60, 0x03, + 0x20, 0x01, 0x4b, 0x0e, 0x63, 0x18, 0x48, 0x07, + 0x69, 0x80, 0x28, 0x00, 0xd1, 0x04, 0x48, 0x0e, + 0x68, 0x06, 0x23, 0x28, 0x43, 0x33, 0x60, 0x03, + 0x20, 0x00, 0xe7, 0x31, 0xe7, 0x30, 0x00, 0x00, + 0x2e, 0x08, 0xb9, 0xb0, 0x66, 0x00, 0x01, 0x00, + 0x2e, 0x08, 0x9b, 0x40, 0x66, 0x00, 0x00, 0x80, + 0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, + 0x62, 0x00, 0x03, 0x00, 0x62, 0x01, 0x00, 0x00, + 0x62, 0x01, 0x00, 0x20, 0x62, 0x01, 0x00, 0x24, + 0x64, 0x00, 0x00, 0x60, 0xb5, 0xf3, 0x1c, 0x0f, + 0x98, 0x00, 0x06, 0x06, 0x0e, 0x36, 0xb0, 0x82, + 0x4d, 0x68, 0x49, 0x69, 0x91, 0x01, 0x48, 0x69, + 0x68, 0x00, 0x5d, 0x84, 0x2e, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, + 0x20, 0x4b, 0xb0, 0x02, 0xe7, 0xf6, 0x48, 0x62, + 0x69, 0x80, 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, + 0xd0, 0x03, 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, + 0xd1, 0x0b, 0x48, 0x5d, 0x69, 0x80, 0x28, 0x02, + 0xd1, 0x01, 0x2c, 0x00, 0xd1, 0x05, 0x48, 0x5a, + 0x69, 0x80, 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, + 0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x02, 0xe7, 0xdd, + 0x48, 0x54, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x4f, 0xb0, 0x02, + 0xe7, 0xd4, 0x48, 0x50, 0x68, 0x00, 0x30, 0x80, + 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x50, + 0xb0, 0x02, 0xe7, 0xcb, 0x68, 0x78, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0x4c, 0xb0, 0x02, 0xe7, 0xc5, + 0x2c, 0x04, 0xd1, 0x08, 0x68, 0x79, 0x20, 0xbc, + 0xf0, 0x01, 0xff, 0xac, 0x29, 0x00, 0xd0, 0x02, + 0x20, 0x59, 0xb0, 0x02, 0xe7, 0xba, 0x48, 0x43, + 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x21, 0x01, + 0x40, 0x81, 0x48, 0x41, 0x68, 0x40, 0x40, 0x08, + 0x07, 0x80, 0x0f, 0x80, 0xd0, 0x02, 0x20, 0x51, + 0xb0, 0x02, 0xe7, 0xab, 0x20, 0x33, 0x06, 0x40, + 0x6b, 0x80, 0x90, 0x00, 0x23, 0x04, 0x40, 0x18, + 0xd0, 0x02, 0x20, 0x52, 0xb0, 0x02, 0xe7, 0xa1, + 0x2c, 0x00, 0xd1, 0x04, 0x48, 0x37, 0x68, 0x01, + 0x23, 0xfd, 0x40, 0x19, 0x60, 0x01, 0x20, 0x01, + 0x49, 0x32, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, + 0x68, 0x38, 0x49, 0x30, 0x68, 0x09, 0x67, 0x08, + 0x68, 0x78, 0x49, 0x2e, 0x68, 0x09, 0x67, 0x48, + 0x48, 0x2c, 0x68, 0x00, 0x67, 0xc7, 0x20, 0x00, + 0x49, 0x2a, 0x68, 0x09, 0x31, 0x60, 0x76, 0x48, + 0x48, 0x28, 0x68, 0x00, 0x30, 0x60, 0x76, 0x06, + 0x20, 0x00, 0x60, 0x78, 0x20, 0x00, 0x72, 0x78, + 0x48, 0x24, 0x68, 0x00, 0x5d, 0x80, 0x28, 0x01, + 0xd1, 0x02, 0x20, 0x01, 0x49, 0x24, 0x62, 0x88, + 0x98, 0x00, 0x01, 0x00, 0x19, 0x45, 0x48, 0x1f, + 0x68, 0x00, 0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07, + 0x48, 0x20, 0x60, 0xa8, 0x20, 0xbc, 0x49, 0x1b, + 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 0xe0, 0x0d, + 0x48, 0x18, 0x68, 0x00, 0x6f, 0x40, 0x23, 0x01, + 0x07, 0x9b, 0x43, 0x18, 0x60, 0xa8, 0x48, 0x15, + 0x68, 0x00, 0x6f, 0x40, 0x49, 0x13, 0x68, 0x09, + 0x31, 0x80, 0x70, 0x08, 0x48, 0x11, 0x68, 0x00, + 0x30, 0x80, 0x78, 0x80, 0x00, 0x43, 0x18, 0x18, + 0x01, 0x80, 0x99, 0x01, 0x18, 0x41, 0x91, 0x01, + 0x48, 0x0c, 0x68, 0x00, 0x6f, 0x00, 0x60, 0x28, + 0x99, 0x01, 0x1d, 0x08, 0x60, 0x68, 0x20, 0x01, + 0x06, 0x00, 0x60, 0xe8, 0x99, 0x00, 0x20, 0x01, + 0x40, 0x88, 0x21, 0x33, 0x06, 0x49, 0x63, 0x48, + 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x3a, 0xb0, 0x02, + 0xe7, 0x38, 0x00, 0x00, 0x9e, 0x00, 0x09, 0x80, + 0x9e, 0x00, 0x0b, 0x80, 0x2e, 0x08, 0xb9, 0xb0, + 0x66, 0x00, 0x01, 0x00, 0x62, 0x00, 0x00, 0x1c, + 0x62, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0xbc, + 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x81, 0x98, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0xb0, 0x82, + 0x48, 0xf9, 0x68, 0x00, 0x99, 0x02, 0x5c, 0x44, + 0x98, 0x02, 0x28, 0x20, 0xdb, 0x05, 0x20, 0xa2, + 0xb0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, 0x20, 0x4b, + 0xb0, 0x03, 0xe7, 0xf6, 0x48, 0xf1, 0x69, 0x80, + 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03, + 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, + 0x48, 0xec, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, + 0x2c, 0x00, 0xd1, 0x05, 0x48, 0xe9, 0x69, 0x80, + 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02, + 0x20, 0x4d, 0xb0, 0x03, 0xe7, 0xdd, 0x48, 0xe4, + 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0x4f, 0xb0, 0x03, 0xe7, 0xd4, + 0x68, 0x78, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x4c, + 0xb0, 0x03, 0xe7, 0xce, 0x2c, 0x04, 0xd1, 0x08, + 0x68, 0x79, 0x20, 0xbc, 0xf0, 0x01, 0xfe, 0xce, + 0x29, 0x00, 0xd0, 0x02, 0x20, 0x59, 0xb0, 0x03, + 0xe7, 0xc3, 0x48, 0xd7, 0x68, 0x00, 0x30, 0x80, + 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x50, + 0xb0, 0x03, 0xe7, 0xba, 0x2c, 0x00, 0xd1, 0x04, + 0x48, 0xd3, 0x68, 0x01, 0x23, 0xfd, 0x40, 0x19, + 0x60, 0x01, 0x48, 0xd2, 0x68, 0x01, 0x23, 0x8d, + 0x05, 0x9b, 0x43, 0x19, 0x60, 0x01, 0x48, 0xd0, + 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x20, 0x01, + 0x49, 0xc9, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, + 0x68, 0x38, 0x49, 0xc7, 0x68, 0x09, 0x67, 0x08, + 0x68, 0x78, 0x49, 0xc5, 0x68, 0x09, 0x67, 0x48, + 0x48, 0xc3, 0x68, 0x00, 0x67, 0xc7, 0x20, 0x00, + 0x49, 0xc1, 0x68, 0x09, 0x31, 0x60, 0x76, 0x48, + 0x98, 0x02, 0x49, 0xbf, 0x68, 0x09, 0x31, 0x60, + 0x76, 0x08, 0x20, 0x00, 0x49, 0xbc, 0x68, 0x09, + 0x6f, 0xc9, 0x60, 0x48, 0x20, 0x00, 0x49, 0xba, + 0x68, 0x09, 0x6f, 0xc9, 0x72, 0x48, 0x48, 0xb8, + 0x68, 0x00, 0x99, 0x02, 0x5c, 0x40, 0x28, 0x01, + 0xd1, 0x02, 0x20, 0x01, 0x49, 0xb9, 0x62, 0x88, + 0x48, 0xb3, 0x68, 0x00, 0x30, 0x80, 0x78, 0x81, + 0x20, 0x01, 0x40, 0x88, 0x49, 0xb1, 0x68, 0x49, + 0x40, 0x08, 0x07, 0x80, 0x0f, 0x80, 0xd0, 0x1b, + 0x20, 0x00, 0x49, 0xad, 0x68, 0x09, 0x31, 0x60, + 0x76, 0x88, 0x20, 0x51, 0x49, 0xaa, 0x68, 0x09, + 0x6f, 0xc9, 0x72, 0x48, 0x48, 0xa8, 0x68, 0x00, + 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x07, + 0x48, 0xa5, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, + 0x20, 0x01, 0x40, 0x88, 0xf0, 0x07, 0xf9, 0xea, + 0x20, 0x51, 0xb0, 0x03, 0xe7, 0x55, 0xe1, 0x6c, + 0x20, 0x33, 0x06, 0x40, 0x6b, 0x81, 0x91, 0x00, + 0x99, 0x00, 0x20, 0x04, 0x40, 0x08, 0xd0, 0x07, + 0x20, 0x04, 0xf0, 0x00, 0xfc, 0xb3, 0x20, 0x33, + 0x06, 0x40, 0x6b, 0x81, 0x91, 0x00, 0xe7, 0xf3, + 0x4d, 0x9d, 0x99, 0x00, 0x01, 0x08, 0x19, 0x45, + 0x48, 0x95, 0x68, 0x00, 0x6f, 0x40, 0x28, 0xbc, + 0xdd, 0x07, 0x48, 0x9a, 0x60, 0xa8, 0x20, 0xbc, + 0x49, 0x91, 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, + 0xe0, 0x0d, 0x48, 0x8f, 0x68, 0x00, 0x6f, 0x40, + 0x23, 0x01, 0x07, 0x9b, 0x43, 0x18, 0x60, 0xa8, + 0x48, 0x8b, 0x68, 0x00, 0x6f, 0x40, 0x49, 0x8a, + 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 0x48, 0x90, + 0x90, 0x01, 0x48, 0x87, 0x68, 0x00, 0x30, 0x80, + 0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, + 0x99, 0x01, 0x18, 0x40, 0x90, 0x01, 0x48, 0x82, + 0x68, 0x00, 0x6f, 0x00, 0x60, 0x28, 0x98, 0x01, + 0x30, 0x04, 0x60, 0x68, 0x20, 0x01, 0x06, 0x00, + 0x60, 0xe8, 0x99, 0x00, 0x20, 0x01, 0x40, 0x88, + 0x21, 0x33, 0x06, 0x49, 0x63, 0x48, 0x48, 0x83, + 0x6b, 0x00, 0x23, 0x01, 0x06, 0x1b, 0x40, 0x18, + 0xd1, 0x03, 0x20, 0x04, 0xf0, 0x00, 0xfc, 0x6a, + 0xe7, 0xf5, 0x20, 0x01, 0x06, 0x00, 0x21, 0x33, + 0x06, 0x49, 0x60, 0x48, 0x4e, 0x7c, 0x48, 0x72, + 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x01, 0x00, + 0x19, 0x86, 0x98, 0x01, 0x30, 0x04, 0x60, 0x30, + 0x48, 0x78, 0x60, 0x70, 0x48, 0x6c, 0x68, 0x00, + 0x30, 0x80, 0x78, 0x00, 0x23, 0x01, 0x07, 0x9b, + 0x43, 0x18, 0x60, 0xb0, 0x20, 0x01, 0x05, 0x80, + 0x60, 0xf0, 0x48, 0x67, 0x68, 0x00, 0x30, 0x80, + 0x78, 0x81, 0x20, 0x01, 0x40, 0x88, 0x49, 0x65, + 0x60, 0xc8, 0x48, 0x63, 0x68, 0x00, 0x30, 0x60, + 0x7e, 0x00, 0x49, 0x61, 0x68, 0x09, 0x5c, 0x08, + 0x28, 0x00, 0xd0, 0x48, 0x28, 0x01, 0xd0, 0x47, + 0x28, 0x02, 0xd0, 0x02, 0x28, 0x03, 0xd0, 0x21, + 0xe0, 0x5a, 0x48, 0x67, 0x68, 0x01, 0x23, 0x02, + 0x43, 0x19, 0x60, 0x01, 0x48, 0x58, 0x68, 0x00, + 0x6f, 0x40, 0x49, 0x57, 0x68, 0x09, 0x31, 0x80, + 0x78, 0x09, 0x1a, 0x40, 0x28, 0xbc, 0xd8, 0x05, + 0x48, 0x5f, 0x68, 0x01, 0x23, 0x10, 0x43, 0x19, + 0x60, 0x01, 0xe0, 0x05, 0x48, 0x5c, 0x68, 0x01, + 0x23, 0x10, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, + 0x48, 0x59, 0x68, 0x01, 0x23, 0x08, 0x43, 0x19, + 0x60, 0x01, 0xe0, 0x39, 0x48, 0x56, 0x68, 0x01, + 0x23, 0x04, 0x43, 0x19, 0x60, 0x01, 0x48, 0x48, + 0x68, 0x00, 0x6f, 0x40, 0x49, 0x46, 0x68, 0x09, + 0x31, 0x80, 0x78, 0x09, 0x1a, 0x40, 0x28, 0xbc, + 0xd8, 0x05, 0x48, 0x4f, 0x68, 0x01, 0x23, 0x10, + 0x43, 0x19, 0x60, 0x01, 0xe0, 0x05, 0x48, 0x4c, + 0x68, 0x01, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x19, + 0x60, 0x01, 0x48, 0x49, 0x68, 0x01, 0x23, 0x08, + 0x43, 0x19, 0x60, 0x01, 0xe0, 0x18, 0xe0, 0x17, + 0x48, 0x46, 0x68, 0x01, 0x04, 0x09, 0x0c, 0x09, + 0x60, 0x01, 0x48, 0x44, 0x49, 0x36, 0x68, 0x09, + 0x31, 0x80, 0x78, 0x09, 0x04, 0x09, 0x68, 0x02, + 0x43, 0x11, 0x60, 0x01, 0x48, 0x40, 0x68, 0x01, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, + 0x20, 0x01, 0x49, 0x34, 0x63, 0x08, 0xe7, 0xff, + 0x48, 0x36, 0x6b, 0x00, 0x23, 0x01, 0x05, 0x9b, + 0x40, 0x18, 0xd1, 0x03, 0x20, 0x04, 0xf0, 0x00, + 0xfb, 0xd1, 0xe7, 0xf5, 0x20, 0x01, 0x05, 0x80, + 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x48, 0x26, + 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x23, 0x01, + 0x40, 0x58, 0x49, 0x23, 0x68, 0x09, 0x31, 0x80, + 0x70, 0x88, 0x48, 0x21, 0x68, 0x00, 0x6f, 0x40, + 0x49, 0x1f, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, + 0x1a, 0x40, 0x49, 0x1d, 0x68, 0x09, 0x67, 0x48, + 0x48, 0x1b, 0x68, 0x00, 0x6f, 0xc0, 0x30, 0x04, + 0x49, 0x19, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, + 0x68, 0x02, 0x18, 0x89, 0x60, 0x01, 0x48, 0x16, + 0x68, 0x00, 0x6f, 0x00, 0x49, 0x14, 0x68, 0x09, + 0x31, 0x80, 0x78, 0x09, 0x18, 0x40, 0x49, 0x12, + 0x68, 0x09, 0x67, 0x08, 0x48, 0x10, 0x68, 0x00, + 0x6f, 0x40, 0x28, 0x00, 0xd0, 0x00, 0xe6, 0xb3, + 0x48, 0x11, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, + 0x48, 0x0e, 0x68, 0x01, 0x4b, 0x19, 0x40, 0x19, + 0x60, 0x01, 0x20, 0x48, 0x49, 0x08, 0x68, 0x09, + 0x6f, 0xc9, 0x72, 0x48, 0x20, 0x00, 0x49, 0x06, + 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x48, 0x04, + 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, + 0xd0, 0x29, 0x48, 0x01, 0xe0, 0x20, 0x00, 0x00, + 0x2e, 0x08, 0xb9, 0xb0, 0x66, 0x00, 0x01, 0x00, + 0x62, 0x00, 0x00, 0x1c, 0x66, 0x00, 0x00, 0x08, + 0x23, 0x48, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, + 0x9e, 0x00, 0x09, 0x80, 0x40, 0x00, 0x00, 0xbc, + 0x9e, 0x00, 0x0b, 0x80, 0x66, 0x00, 0x00, 0x80, + 0x9e, 0x00, 0x09, 0xc0, 0x66, 0x00, 0x01, 0xf0, + 0x64, 0x00, 0x00, 0x60, 0x62, 0x01, 0x00, 0x20, + 0x62, 0x01, 0x00, 0x24, 0xfc, 0xb7, 0xff, 0xff, + 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x07, 0xf8, 0x7f, 0x20, 0x00, + 0xb0, 0x03, 0xe5, 0xea, 0xb0, 0x02, 0xb0, 0x01, + 0xe5, 0xe7, 0xe5, 0xe6, 0xb5, 0xb0, 0x1c, 0x07, + 0x06, 0x3d, 0x0e, 0x2d, 0x48, 0x5d, 0x68, 0x00, + 0x5d, 0x44, 0x2d, 0x20, 0xdb, 0x03, 0x20, 0xa2, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x59, + 0x68, 0x00, 0x5d, 0x40, 0x28, 0xff, 0xd1, 0x01, + 0x20, 0x4b, 0xe7, 0xf5, 0x48, 0x56, 0x69, 0x80, + 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03, + 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, + 0x48, 0x51, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, + 0x2c, 0x00, 0xd1, 0x05, 0x48, 0x4e, 0x69, 0x80, + 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02, + 0x20, 0x4d, 0xe7, 0xdd, 0xe0, 0x90, 0x48, 0x4b, + 0x68, 0x01, 0x4b, 0x4b, 0x43, 0x19, 0x60, 0x01, + 0x48, 0x49, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, + 0x48, 0x48, 0x68, 0x01, 0x23, 0x04, 0x43, 0x19, + 0x60, 0x01, 0x20, 0x00, 0x49, 0x41, 0x68, 0x09, + 0x31, 0x80, 0x70, 0x88, 0x20, 0x00, 0x49, 0x3f, + 0x68, 0x09, 0x31, 0x80, 0x70, 0x48, 0x20, 0xff, + 0x49, 0x3c, 0x68, 0x09, 0x55, 0x48, 0x2c, 0x00, + 0xd1, 0x03, 0x20, 0x18, 0x21, 0x31, 0x06, 0x49, + 0x62, 0x48, 0x01, 0x20, 0x49, 0x37, 0x68, 0x09, + 0x18, 0x40, 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, + 0xd0, 0x28, 0x20, 0x00, 0x49, 0x38, 0x60, 0x08, + 0x20, 0x00, 0x49, 0x38, 0x64, 0x08, 0x20, 0x03, + 0x49, 0x31, 0x61, 0x08, 0x21, 0x55, 0x01, 0x20, + 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x80, 0x6a, 0xc0, + 0x72, 0x41, 0x21, 0x00, 0x01, 0x20, 0x4a, 0x2b, + 0x68, 0x12, 0x18, 0x80, 0x30, 0x20, 0x72, 0x81, + 0x01, 0x20, 0x49, 0x28, 0x68, 0x09, 0x18, 0x40, + 0x6a, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x09, + 0x01, 0x20, 0x49, 0x24, 0x68, 0x09, 0x18, 0x40, + 0x6a, 0xc0, 0x7a, 0x01, 0x20, 0x01, 0x40, 0x88, + 0xf0, 0x06, 0xff, 0xf8, 0x48, 0x1f, 0x68, 0x00, + 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x2b, + 0x48, 0x1c, 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, + 0x28, 0x00, 0xd0, 0x0d, 0x20, 0x00, 0x49, 0x19, + 0x68, 0x09, 0x31, 0x80, 0x70, 0xc8, 0x22, 0x00, + 0xb4, 0x04, 0x1c, 0x28, 0x23, 0x00, 0x22, 0x00, + 0x49, 0x1b, 0xf7, 0xf3, 0xfe, 0xcd, 0xb0, 0x01, + 0x20, 0x55, 0x49, 0x12, 0x68, 0x09, 0x6f, 0xc9, + 0x72, 0x48, 0x20, 0x00, 0x49, 0x0f, 0x68, 0x09, + 0x31, 0x60, 0x76, 0x88, 0x48, 0x0d, 0x68, 0x00, + 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x07, + 0x48, 0x0a, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, + 0x20, 0x01, 0x40, 0x88, 0xf0, 0x06, 0xff, 0xc6, + 0x48, 0x09, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, + 0x48, 0x06, 0x68, 0x01, 0x4b, 0x0b, 0x40, 0x19, + 0x60, 0x01, 0x20, 0x00, 0xe7, 0x4c, 0xe7, 0x4b, + 0xe7, 0x4a, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xb0, + 0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, + 0x23, 0x48, 0x00, 0x00, 0x66, 0x00, 0x01, 0x18, + 0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, + 0x00, 0x00, 0xff, 0xff, 0xfc, 0xb7, 0xff, 0xff, + 0xb5, 0xff, 0x1c, 0x1f, 0x98, 0x00, 0x06, 0x02, + 0x0e, 0x12, 0x99, 0x01, 0x06, 0x0d, 0x0e, 0x2d, + 0x98, 0x02, 0x06, 0x04, 0x0e, 0x24, 0x48, 0x2d, + 0x68, 0x00, 0x5c, 0x81, 0x2a, 0x20, 0xdb, 0x04, + 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x29, 0xff, 0xd1, 0x01, 0x20, 0x4b, + 0xe7, 0xf7, 0x48, 0x27, 0x69, 0x80, 0x28, 0x00, + 0xd1, 0x05, 0x29, 0x02, 0xd0, 0x03, 0x29, 0x03, + 0xd0, 0x01, 0x29, 0x04, 0xd1, 0x0b, 0x48, 0x22, + 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x29, 0x00, + 0xd1, 0x05, 0x48, 0x1f, 0x69, 0x80, 0x28, 0x01, + 0xd1, 0x03, 0x29, 0x01, 0xd0, 0x01, 0x20, 0x4d, + 0xe7, 0xdf, 0x29, 0x05, 0xd2, 0x2a, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x03, 0x07, 0x04, 0x05, 0x06, 0x00, 0xe0, 0x24, + 0xe0, 0x23, 0xe0, 0x22, 0xe0, 0x21, 0x01, 0x08, + 0x4b, 0x12, 0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20, + 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x05, 0x48, 0x0f, + 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0x49, 0xe7, 0xc1, 0xe0, 0x13, + 0x2d, 0x00, 0xd1, 0x05, 0x00, 0xa0, 0x4b, 0x0b, + 0x18, 0xc0, 0x68, 0x00, 0x60, 0x38, 0xe0, 0x04, + 0x68, 0x38, 0x00, 0xa6, 0x4b, 0x07, 0x18, 0xf3, + 0x60, 0x18, 0xe0, 0x02, 0x20, 0x4a, 0xe7, 0xb0, + 0xe7, 0xff, 0x20, 0x00, 0xe7, 0xad, 0xe7, 0xac, + 0xe7, 0xab, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xb0, + 0x66, 0x00, 0x01, 0x00, 0x62, 0x01, 0x00, 0x80, + 0xb5, 0xf7, 0xb0, 0x82, 0x98, 0x02, 0x06, 0x03, + 0x0e, 0x1b, 0x93, 0x00, 0x99, 0x03, 0x06, 0x08, + 0x0e, 0x00, 0x90, 0x01, 0x9a, 0x04, 0x06, 0x15, + 0x0e, 0x2d, 0xb0, 0x84, 0x4a, 0xca, 0x4f, 0xcb, + 0x48, 0xcb, 0x68, 0x00, 0x9b, 0x04, 0x5c, 0xc4, + 0x48, 0xca, 0x90, 0x02, 0x21, 0x00, 0x23, 0x00, + 0x93, 0x01, 0x9b, 0x04, 0x2b, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, + 0x20, 0x4b, 0xb0, 0x06, 0xe7, 0xf6, 0x48, 0xc2, + 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x2c, 0x00, + 0xd1, 0x03, 0x48, 0xbf, 0x69, 0x80, 0x28, 0x02, + 0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x06, 0xe7, 0xe9, + 0x98, 0x05, 0x28, 0x01, 0xd1, 0x08, 0x48, 0xb8, + 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0x50, 0xb0, 0x06, 0xe7, 0xdd, + 0x98, 0x05, 0x28, 0x00, 0xd1, 0x05, 0x48, 0xb2, + 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, + 0xd0, 0x08, 0x98, 0x05, 0x28, 0x01, 0xd1, 0x08, + 0x48, 0xad, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, + 0x28, 0x00, 0xd1, 0x02, 0x20, 0x5a, 0xb0, 0x06, + 0xe7, 0xc8, 0x20, 0x00, 0x4b, 0xa8, 0x68, 0x1b, + 0x6f, 0xdb, 0x72, 0x58, 0x98, 0x05, 0x28, 0x00, + 0xd1, 0x50, 0x2d, 0x01, 0xd0, 0x01, 0x2d, 0x02, + 0xd1, 0x32, 0x4e, 0xa6, 0x68, 0x30, 0x23, 0x01, + 0x04, 0xdb, 0x43, 0x18, 0x60, 0x30, 0x20, 0x00, + 0x4b, 0xa3, 0x60, 0x18, 0x48, 0x9e, 0x68, 0x00, + 0x30, 0x80, 0x78, 0x40, 0x00, 0x43, 0x18, 0x18, + 0x01, 0x80, 0x9b, 0x02, 0x18, 0xc0, 0x90, 0x02, + 0x98, 0x02, 0x68, 0x01, 0x48, 0x9a, 0x69, 0x80, + 0x07, 0x80, 0x0f, 0x80, 0x01, 0x80, 0x43, 0x01, + 0x23, 0x20, 0x43, 0x19, 0x4b, 0x99, 0x43, 0x19, + 0x98, 0x02, 0x60, 0x01, 0x4e, 0x98, 0x68, 0x30, + 0x23, 0x01, 0x04, 0xdb, 0x43, 0x18, 0x60, 0x30, + 0x4e, 0x92, 0x68, 0x30, 0x4b, 0x95, 0x40, 0x18, + 0x60, 0x30, 0x2c, 0x00, 0xd1, 0x04, 0x20, 0x00, + 0x4b, 0x8b, 0x68, 0x1b, 0x33, 0x20, 0x72, 0x98, + 0x2d, 0x02, 0xd0, 0x04, 0x20, 0x01, 0x04, 0xc0, + 0x23, 0x33, 0x06, 0x5b, 0x60, 0x18, 0x2c, 0x00, + 0xd1, 0x0f, 0x20, 0xff, 0x02, 0x00, 0x40, 0x08, + 0xd1, 0x0b, 0x2d, 0x02, 0xd0, 0x09, 0x48, 0x82, + 0x68, 0x00, 0x30, 0x80, 0x78, 0x40, 0x23, 0x01, + 0x40, 0x58, 0x4b, 0x7f, 0x68, 0x1b, 0x33, 0x80, + 0x70, 0x58, 0xe0, 0xed, 0x2d, 0x01, 0xd1, 0x73, + 0x2c, 0x00, 0xd1, 0x72, 0x20, 0x31, 0x06, 0x40, + 0x68, 0x80, 0x23, 0x08, 0x40, 0x18, 0xd1, 0x3a, + 0x48, 0x7a, 0x68, 0x06, 0x23, 0x05, 0x05, 0x9b, + 0x43, 0x33, 0x60, 0x03, 0x68, 0x10, 0x4b, 0x7c, + 0x40, 0x18, 0x60, 0x10, 0x32, 0xc0, 0x68, 0x10, + 0x4b, 0x79, 0x40, 0x18, 0x60, 0x10, 0x20, 0x00, + 0x4b, 0x6f, 0x68, 0x1b, 0x67, 0x58, 0x20, 0x00, + 0x4b, 0x6d, 0x68, 0x1b, 0x33, 0x80, 0x70, 0x18, + 0x48, 0x6d, 0x68, 0x80, 0x23, 0x02, 0x40, 0x18, + 0xd1, 0x04, 0x20, 0x00, 0x4b, 0x68, 0x68, 0x1b, + 0x33, 0x60, 0x76, 0x98, 0x20, 0x5b, 0x4b, 0x66, + 0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, 0x4e, 0x6d, + 0x68, 0x30, 0x23, 0x02, 0x43, 0x18, 0x60, 0x30, + 0x4e, 0x67, 0x68, 0x30, 0x23, 0x05, 0x05, 0x9b, + 0x43, 0x18, 0x60, 0x30, 0x4e, 0x61, 0x68, 0x30, + 0x4b, 0x67, 0x40, 0x18, 0x60, 0x30, 0x20, 0x5b, + 0xb0, 0x06, 0xe7, 0x2b, 0xe0, 0xae, 0x48, 0x5d, + 0x68, 0x06, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x33, + 0x60, 0x03, 0x20, 0x31, 0x06, 0x40, 0x6a, 0x00, + 0x23, 0x04, 0x40, 0x18, 0xd1, 0x27, 0x9b, 0x01, + 0x20, 0x31, 0x06, 0x40, 0x6b, 0x00, 0x18, 0x1b, + 0x93, 0x01, 0x4e, 0x5c, 0x68, 0x30, 0x23, 0x3b, + 0x40, 0x18, 0x60, 0x30, 0x4e, 0x57, 0x68, 0x30, + 0x23, 0x0e, 0x43, 0x18, 0x60, 0x30, 0x4e, 0x55, + 0x68, 0x30, 0x23, 0x0c, 0x40, 0x18, 0x60, 0x30, + 0x20, 0x37, 0x23, 0x31, 0x06, 0x5b, 0x60, 0x98, + 0x20, 0x01, 0x90, 0x00, 0x98, 0x00, 0x28, 0x64, + 0xd3, 0x04, 0xe0, 0x07, 0x98, 0x00, 0x30, 0x01, + 0x90, 0x00, 0xe7, 0xf7, 0xe7, 0xfa, 0xe0, 0x01, + 0xe0, 0x36, 0xe0, 0x34, 0xe7, 0xd1, 0x4e, 0x46, + 0x68, 0x30, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, + 0x60, 0x30, 0x4e, 0x40, 0x68, 0x30, 0x4b, 0x48, + 0x40, 0x18, 0x60, 0x30, 0x48, 0x3c, 0x68, 0x40, + 0x28, 0x00, 0xd0, 0x0d, 0x20, 0x5b, 0x4b, 0x38, + 0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, 0x20, 0x00, + 0x4b, 0x35, 0x68, 0x1b, 0x33, 0x60, 0x76, 0x98, + 0x20, 0x5b, 0xb0, 0x06, 0xe6, 0xda, 0xe0, 0x5d, + 0x48, 0x31, 0x68, 0x00, 0x6f, 0xc0, 0x1d, 0x06, + 0x48, 0x2f, 0x68, 0x00, 0x30, 0x80, 0x78, 0x00, + 0x9b, 0x01, 0x1a, 0xc0, 0x68, 0x33, 0x18, 0xc0, + 0x60, 0x30, 0x20, 0x5c, 0x4b, 0x2a, 0x68, 0x1b, + 0x6f, 0xdb, 0x72, 0x58, 0x20, 0x00, 0x4b, 0x28, + 0x68, 0x1b, 0x33, 0x60, 0x76, 0x98, 0xe0, 0x3f, + 0x20, 0x33, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x03, + 0x23, 0x04, 0x40, 0x18, 0xd0, 0x03, 0x20, 0x52, + 0xb0, 0x06, 0xe6, 0xb7, 0xe0, 0x3a, 0x98, 0x03, + 0x01, 0x00, 0x19, 0xc7, 0x48, 0x1e, 0x68, 0x00, + 0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07, 0x48, 0x29, + 0x60, 0xb8, 0x20, 0xbc, 0x4b, 0x1a, 0x68, 0x1b, + 0x33, 0x80, 0x70, 0x18, 0xe0, 0x0d, 0x48, 0x18, + 0x68, 0x00, 0x6f, 0x40, 0x23, 0x01, 0x07, 0x9b, + 0x43, 0x18, 0x60, 0xb8, 0x48, 0x14, 0x68, 0x00, + 0x6f, 0x40, 0x4b, 0x13, 0x68, 0x1b, 0x33, 0x80, + 0x70, 0x18, 0x48, 0x11, 0x68, 0x00, 0x30, 0x80, + 0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, + 0x18, 0x82, 0x48, 0x0d, 0x68, 0x00, 0x6f, 0x00, + 0x60, 0x38, 0x1d, 0x10, 0x60, 0x78, 0x20, 0x01, + 0x06, 0x00, 0x60, 0xf8, 0x9e, 0x03, 0x20, 0x01, + 0x40, 0xb0, 0x23, 0x33, 0x06, 0x5b, 0x63, 0x58, + 0x20, 0x00, 0xb0, 0x06, 0xe6, 0x7e, 0xb0, 0x04, + 0xb0, 0x02, 0xe6, 0x7b, 0xe6, 0x7a, 0x00, 0x00, + 0x9e, 0x00, 0x0b, 0x80, 0x9e, 0x00, 0x09, 0x80, + 0x2e, 0x08, 0xb9, 0xb0, 0x9e, 0x00, 0x0a, 0x00, + 0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, + 0x62, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x04, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x62, 0x00, 0x00, 0x1c, + 0xfe, 0xbf, 0xff, 0xff, 0x62, 0x00, 0x00, 0x08, + 0xff, 0xbf, 0xff, 0xff, 0x40, 0x00, 0x00, 0xbc, + 0x48, 0x07, 0x69, 0x80, 0x28, 0x02, 0xd0, 0x03, + 0x48, 0x05, 0x69, 0x80, 0x28, 0x03, 0xd1, 0x04, + 0x20, 0x31, 0x06, 0x40, 0x6a, 0x80, 0x47, 0x70, + 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xfb, 0xe7, 0xfa, + 0x66, 0x00, 0x01, 0x00, 0xb5, 0xb0, 0x27, 0x0f, + 0x20, 0x31, 0x06, 0x40, 0x68, 0xc0, 0x09, 0x05, + 0xf7, 0xff, 0xff, 0xe6, 0x43, 0xc4, 0x48, 0x18, + 0x69, 0x80, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x16, + 0x69, 0x80, 0x28, 0x01, 0xd1, 0x03, 0x1c, 0x38, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x09, + 0xd2, 0x1e, 0xa3, 0x02, 0x5d, 0x5b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x07, 0x07, 0x07, 0x0e, 0x00, 0x1c, 0x2f, + 0xe0, 0x13, 0x20, 0x08, 0x40, 0x20, 0xd0, 0x01, + 0x1c, 0x2f, 0xe0, 0x00, 0x27, 0x02, 0xe0, 0x0c, + 0x20, 0x08, 0x40, 0x20, 0xd0, 0x06, 0x20, 0x02, + 0x40, 0x20, 0xd0, 0x01, 0x27, 0x07, 0xe0, 0x00, + 0x27, 0x08, 0xe0, 0x00, 0x27, 0x02, 0xe0, 0x00, + 0xe7, 0xff, 0x1c, 0x38, 0xe7, 0xd8, 0xe7, 0xd7, + 0x66, 0x00, 0x01, 0x00, 0x1c, 0x01, 0x29, 0x07, + 0xd2, 0x0f, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x05, 0x06, 0x09, + 0x08, 0x07, 0x0a, 0x00, 0xe0, 0x06, 0xe0, 0x05, + 0xe0, 0x04, 0xe0, 0x03, 0xe0, 0x02, 0xe0, 0x01, + 0xe0, 0x00, 0xe7, 0xff, 0x20, 0x00, 0x47, 0x70, + 0xe7, 0xfd, 0x00, 0x00, 0x20, 0x1d, 0x02, 0x80, + 0x69, 0x80, 0x49, 0x06, 0x60, 0x08, 0x20, 0x1d, + 0x02, 0x80, 0x69, 0x40, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x1d, 0x02, 0x80, 0x69, 0xc0, 0x49, 0x03, + 0x60, 0x08, 0x47, 0x70, 0x2e, 0x08, 0xd1, 0xfc, + 0x2e, 0x08, 0xd2, 0x00, 0x2e, 0x08, 0xd2, 0x04, + 0xb5, 0xf1, 0xb0, 0x81, 0x20, 0x00, 0x4d, 0x21, + 0x95, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, + 0x43, 0xdb, 0x4c, 0x1f, 0x68, 0x64, 0x42, 0x8c, + 0xdd, 0x21, 0x1c, 0x0c, 0x31, 0x01, 0x00, 0xa4, + 0x9d, 0x00, 0x59, 0x2f, 0x42, 0x9f, 0xd0, 0xf8, + 0x4c, 0x19, 0x68, 0x64, 0x42, 0x8c, 0xda, 0x00, + 0xe0, 0x15, 0x32, 0x01, 0x1c, 0x0c, 0x31, 0x01, + 0x00, 0xa4, 0x9d, 0x00, 0x59, 0x2b, 0x42, 0x9f, + 0xd0, 0xf8, 0x02, 0x9c, 0x43, 0x3c, 0x1c, 0x25, + 0x1c, 0x04, 0x30, 0x01, 0x00, 0xa4, 0x9e, 0x01, + 0x51, 0x35, 0x4c, 0x0f, 0x68, 0x64, 0x42, 0x8c, + 0xdb, 0x00, 0x32, 0x01, 0xe7, 0xd9, 0x28, 0x08, + 0xd3, 0x02, 0xe0, 0x07, 0x30, 0x01, 0xe7, 0xfa, + 0x25, 0x00, 0x43, 0xed, 0x00, 0x84, 0x9e, 0x01, + 0x51, 0x35, 0xe7, 0xf7, 0x4c, 0x07, 0x68, 0x24, + 0x2c, 0x00, 0xd1, 0x02, 0x24, 0x0d, 0x06, 0xe4, + 0x61, 0x22, 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0xba, 0x38, + 0x2e, 0x08, 0xbb, 0x00, 0x2e, 0x08, 0xd1, 0xf0, + 0xb5, 0x80, 0x48, 0xdc, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x04, 0x48, 0xda, 0x68, 0x00, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x92, + 0x48, 0xd7, 0x49, 0xd8, 0x60, 0x08, 0x48, 0xd8, + 0x49, 0xd8, 0x60, 0x08, 0x48, 0xd8, 0x49, 0xd9, + 0x60, 0x08, 0x48, 0xd3, 0x49, 0xd8, 0x68, 0x0b, + 0x4a, 0xd8, 0x21, 0x00, 0xf0, 0x01, 0xf8, 0xda, + 0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x00, 0x49, 0xca, 0x68, 0x09, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xce, + 0x49, 0xc6, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x66, 0xc8, 0x20, 0x00, 0x49, 0xc5, + 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, + 0x66, 0x88, 0x48, 0xc7, 0x49, 0xc1, 0x68, 0x09, + 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x66, 0xc8, + 0x20, 0x00, 0x49, 0xc0, 0x68, 0x09, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xc0, + 0x49, 0xbc, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x66, 0xc8, 0x27, 0x00, 0x2f, 0x19, + 0xd3, 0x02, 0xe0, 0x38, 0x37, 0x01, 0xe7, 0xfa, + 0x48, 0xba, 0x00, 0xb9, 0x4a, 0xb1, 0x68, 0x12, + 0x18, 0x89, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, + 0x62, 0x08, 0x48, 0xb6, 0x00, 0xb9, 0x4a, 0xad, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x60, 0x48, 0x48, 0xb1, 0x00, 0xb9, + 0x4a, 0xaa, 0x68, 0x12, 0x18, 0x89, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x62, 0x08, 0x48, 0xad, + 0x00, 0xb9, 0x4a, 0xa6, 0x68, 0x12, 0x18, 0x89, + 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x60, 0x48, + 0x48, 0xa8, 0x00, 0xb9, 0x4a, 0xa3, 0x68, 0x12, + 0x18, 0x89, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, + 0x62, 0x08, 0x48, 0xa4, 0x00, 0xb9, 0x4a, 0x9f, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x60, 0x48, 0xe7, 0xc6, 0x27, 0x00, + 0x2f, 0x07, 0xd3, 0x02, 0xe0, 0x86, 0x37, 0x01, + 0xe7, 0xfa, 0x48, 0x9c, 0x00, 0xb9, 0x19, 0xc9, + 0x00, 0xc9, 0x4a, 0x92, 0x68, 0x12, 0x18, 0x89, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, + 0x48, 0x96, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, + 0x4a, 0x8c, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x91, + 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x87, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc9, 0x60, 0x48, 0x48, 0x8b, 0x00, 0xb9, + 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x81, 0x68, 0x12, + 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, + 0x67, 0x88, 0x48, 0x86, 0x00, 0xb9, 0x19, 0xc9, + 0x00, 0xc9, 0x4a, 0x7e, 0x68, 0x12, 0x18, 0x89, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, + 0x48, 0x80, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, + 0x4a, 0x78, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x7b, + 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x73, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc9, 0x60, 0x48, 0x48, 0x75, 0x00, 0xb9, + 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x6d, 0x68, 0x12, + 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, + 0x67, 0x88, 0x48, 0x70, 0x00, 0xb9, 0x19, 0xc9, + 0x00, 0xc9, 0x4a, 0x6a, 0x68, 0x12, 0x18, 0x89, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, + 0x48, 0x6a, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, + 0x4a, 0x64, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x65, + 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x5f, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc9, 0x60, 0x48, 0x48, 0x5f, 0x00, 0xb9, + 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x59, 0x68, 0x12, + 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, + 0x67, 0x88, 0xe7, 0x78, 0x27, 0x00, 0x2f, 0x12, + 0xd3, 0x02, 0xe0, 0x56, 0x37, 0x01, 0xe7, 0xfa, + 0x48, 0x56, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x4d, + 0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x53, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x49, 0x68, 0x12, + 0x18, 0x89, 0x62, 0x88, 0x48, 0x4f, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x46, 0x68, 0x12, 0x18, 0x89, + 0x63, 0x08, 0x48, 0x4c, 0x21, 0x4c, 0x43, 0x79, + 0x4a, 0x42, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, + 0x48, 0x48, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x41, + 0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x45, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x3d, 0x68, 0x12, + 0x18, 0x89, 0x62, 0x88, 0x48, 0x41, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x3a, 0x68, 0x12, 0x18, 0x89, + 0x63, 0x08, 0x48, 0x3e, 0x21, 0x4c, 0x43, 0x79, + 0x4a, 0x36, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, + 0x48, 0x3a, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x35, + 0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x37, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x31, 0x68, 0x12, + 0x18, 0x89, 0x62, 0x88, 0x48, 0x33, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x89, + 0x63, 0x08, 0x48, 0x30, 0x21, 0x4c, 0x43, 0x79, + 0x4a, 0x2a, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, + 0xe7, 0xa8, 0x20, 0x00, 0x49, 0x25, 0x68, 0x09, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0xc8, + 0x20, 0x00, 0x49, 0x22, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x20, 0x00, + 0x49, 0x1c, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc9, 0x61, 0xc8, 0x20, 0x00, 0x49, 0x19, + 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, + 0x61, 0x88, 0x20, 0x00, 0x49, 0x19, 0x68, 0x09, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0xc8, + 0x20, 0x00, 0x49, 0x16, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x20, 0x92, + 0x49, 0x17, 0x60, 0x08, 0x27, 0x00, 0x2f, 0x08, + 0xd3, 0x02, 0xe0, 0x08, 0x37, 0x01, 0xe7, 0xfa, + 0x20, 0x00, 0x43, 0xc0, 0x00, 0xb9, 0x4b, 0x13, + 0x18, 0xc9, 0x64, 0x08, 0xe7, 0xf6, 0x20, 0x10, + 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x08, 0x20, 0x01, + 0x49, 0x0f, 0x60, 0x08, 0x48, 0x0e, 0x68, 0x00, + 0xe6, 0x4d, 0xe6, 0x4c, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xbb, 0x28, 0x2e, 0x08, 0xbb, 0x1c, + 0x2e, 0x08, 0xc2, 0xc0, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xca, 0x58, 0x2e, 0x08, 0xbb, 0x24, + 0x2e, 0x08, 0xd2, 0x00, 0x00, 0x00, 0x16, 0xc8, + 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0xd1, 0xf4, 0x68, 0x00, 0x0d, 0x00, + 0x2e, 0x08, 0xd1, 0xf0, 0xb5, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0x1c, 0x39, 0x20, 0x00, 0xf0, 0x00, + 0xf8, 0x4d, 0x1c, 0x39, 0x1c, 0x20, 0xf0, 0x00, + 0xf8, 0x03, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x68, 0x78, + 0x28, 0x07, 0xd9, 0x1d, 0x23, 0x03, 0x02, 0x5b, + 0x18, 0xf8, 0x6d, 0x40, 0x28, 0x00, 0xd0, 0x06, + 0x23, 0x03, 0x02, 0x5b, 0x18, 0xf8, 0x6d, 0x80, + 0x04, 0x00, 0x0c, 0x00, 0xd1, 0x02, 0x20, 0x02, + 0x60, 0xb8, 0xe0, 0x01, 0x20, 0x03, 0x60, 0xb8, + 0x1d, 0xfd, 0x35, 0x05, 0x23, 0x65, 0x01, 0x1b, + 0x18, 0xfe, 0x1c, 0x31, 0x1c, 0x28, 0x4a, 0x11, + 0x68, 0x13, 0x22, 0x28, 0xf0, 0x00, 0xfe, 0xee, + 0x2c, 0x06, 0xd0, 0x18, 0x00, 0xa0, 0x19, 0x00, + 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x2b, 0x01, 0x5b, + 0x18, 0xc6, 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0xb1, 0x00, 0xdb, 0x18, 0xc5, + 0x20, 0x06, 0x1b, 0x00, 0x00, 0x82, 0x18, 0x12, + 0x00, 0xd2, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x04, + 0x68, 0x1b, 0xf0, 0x00, 0xfe, 0xd3, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0xd1, 0xfc, + 0x2e, 0x08, 0xd2, 0x04, 0xb5, 0xf0, 0x1c, 0x07, + 0x1c, 0x0c, 0x2f, 0x10, 0xd0, 0x13, 0x20, 0x4c, + 0x43, 0x78, 0x19, 0x00, 0x1d, 0xc6, 0x36, 0x01, + 0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, 0x1d, 0xc5, + 0x35, 0x4d, 0x20, 0x10, 0x1b, 0xc0, 0x22, 0x4c, + 0x43, 0x42, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x03, + 0x68, 0x1b, 0xf0, 0x00, 0xfe, 0xb3, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0xd2, 0x04, + 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x39, + 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x07, 0x1c, 0x39, + 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x33, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x0f, 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0xb1, 0x00, 0xdb, 0x18, 0xc6, + 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, 0x19, 0xc0, + 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc5, 0x20, 0x06, + 0x1b, 0x00, 0x00, 0x82, 0x18, 0x12, 0x00, 0xd2, + 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x09, 0x68, 0x1b, + 0xf0, 0x00, 0xfe, 0x84, 0x1d, 0xfe, 0x36, 0x05, + 0x23, 0x65, 0x01, 0x1b, 0x18, 0xfd, 0x1c, 0x31, + 0x1c, 0x28, 0x4a, 0x05, 0x68, 0x13, 0x22, 0x28, + 0xf0, 0x00, 0xfe, 0x78, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0xd2, 0x04, + 0x2e, 0x08, 0xd1, 0xfc, 0xb5, 0xf0, 0x1c, 0x07, + 0x1c, 0x0c, 0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, + 0x1d, 0xc6, 0x36, 0x4d, 0x20, 0x4c, 0x43, 0x78, + 0x19, 0x00, 0x1d, 0xc5, 0x35, 0x01, 0x20, 0x10, + 0x1b, 0xc0, 0x22, 0x4c, 0x43, 0x42, 0x1c, 0x31, + 0x1c, 0x28, 0x4b, 0x03, 0x68, 0x1b, 0xf0, 0x00, + 0xfe, 0x59, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xd2, 0x04, 0xb4, 0xb0, 0x1c, 0x02, + 0x1c, 0x0f, 0x20, 0x00, 0x1c, 0x03, 0x30, 0x01, + 0x00, 0x9b, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xe3, 0x68, 0x5b, 0x10, 0x7c, 0x34, 0x01, + 0x42, 0xa3, 0xd2, 0x00, 0xe7, 0xf2, 0x38, 0x01, + 0x21, 0x18, 0x42, 0x81, 0xd8, 0x02, 0xe0, 0x1a, + 0x39, 0x01, 0xe7, 0xfa, 0x00, 0x8b, 0x18, 0x9c, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xe3, 0x69, 0xdc, + 0x00, 0x8b, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xeb, 0x62, 0x1c, 0x00, 0x8b, 0x18, 0x9c, + 0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x1c, + 0x00, 0x8b, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xeb, 0x60, 0x5c, 0xe7, 0xe4, 0x23, 0x00, + 0x2b, 0x00, 0xd0, 0x10, 0x10, 0x7b, 0x1c, 0x5c, + 0x00, 0x83, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xeb, 0x62, 0x1c, 0x10, 0x7b, 0x1c, 0x5c, + 0x00, 0x83, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xeb, 0x60, 0x5c, 0xe0, 0x0e, 0x10, 0x7c, + 0x00, 0x83, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xeb, 0x62, 0x1c, 0x10, 0x7b, 0x1c, 0x5c, + 0x00, 0x83, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xeb, 0x60, 0x5c, 0xbc, 0xb0, 0x47, 0x70, + 0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x21, 0x00, + 0x1c, 0x0b, 0x31, 0x01, 0x00, 0x9b, 0x18, 0x9c, + 0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x5b, + 0x10, 0x7c, 0x34, 0x01, 0x42, 0xa3, 0xd0, 0x00, + 0xe7, 0xf2, 0x39, 0x01, 0x1c, 0x08, 0x28, 0x18, + 0xd3, 0x02, 0xe0, 0x1a, 0x30, 0x01, 0xe7, 0xfa, + 0x00, 0x83, 0x18, 0x9c, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xe3, 0x6a, 0x5c, 0x00, 0x83, 0x18, 0x9d, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xeb, 0x62, 0x1c, + 0x00, 0x83, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xe3, 0x68, 0x9c, 0x00, 0x83, 0x18, 0x9d, + 0x23, 0x07, 0x02, 0x1b, 0x18, 0xeb, 0x60, 0x5c, + 0xe7, 0xe4, 0x4c, 0x06, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xd3, 0x60, 0x1c, 0x4c, 0x03, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xd3, 0x66, 0x5c, 0xbc, 0xb0, + 0x47, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0c, 0x1c, 0x15, + 0x6a, 0xa1, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x19, + 0x62, 0x39, 0x21, 0x01, 0x02, 0x89, 0x43, 0x29, + 0x62, 0x79, 0x6a, 0xe1, 0x05, 0x89, 0x0d, 0x89, + 0x61, 0xf9, 0x6b, 0x61, 0x31, 0x01, 0x05, 0x89, + 0x0d, 0x89, 0x61, 0xb9, 0x69, 0x61, 0x60, 0xf9, + 0x69, 0xa1, 0x61, 0x39, 0x69, 0xe1, 0x61, 0x79, + 0x68, 0xa1, 0x23, 0x01, 0x06, 0x1b, 0x40, 0x19, + 0xd0, 0x02, 0x49, 0x0f, 0x60, 0xb9, 0xe0, 0x01, + 0x21, 0x00, 0x60, 0xb9, 0x6a, 0x60, 0x28, 0x00, + 0xd0, 0x0b, 0x68, 0x41, 0x60, 0x39, 0x78, 0x01, + 0x00, 0x89, 0x4b, 0x0a, 0x18, 0xc9, 0x60, 0x79, + 0x68, 0xb9, 0x88, 0x42, 0x43, 0x11, 0x60, 0xb9, + 0xe0, 0x07, 0x21, 0x00, 0x60, 0x39, 0x21, 0x00, + 0x60, 0x79, 0x68, 0xb9, 0x0c, 0x09, 0x04, 0x09, + 0x60, 0xb9, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x68, 0x00, 0x08, 0x00, + 0xb4, 0x80, 0x1c, 0x02, 0x1c, 0x0f, 0x69, 0x79, + 0x60, 0xd1, 0x69, 0xb9, 0x61, 0x11, 0x69, 0xf9, + 0x61, 0x51, 0x68, 0xb9, 0x23, 0x01, 0x06, 0x1b, + 0x40, 0x19, 0xd0, 0x02, 0x49, 0x0e, 0x60, 0x91, + 0xe0, 0x01, 0x21, 0x00, 0x60, 0x91, 0x6a, 0x78, + 0x28, 0x00, 0xd0, 0x0b, 0x68, 0x41, 0x60, 0x11, + 0x78, 0x01, 0x00, 0x89, 0x4b, 0x09, 0x18, 0xc9, + 0x60, 0x51, 0x68, 0x91, 0x88, 0x43, 0x43, 0x19, + 0x60, 0x91, 0xe0, 0x07, 0x21, 0x00, 0x60, 0x11, + 0x21, 0x00, 0x60, 0x51, 0x68, 0x91, 0x0c, 0x09, + 0x04, 0x09, 0x60, 0x91, 0xbc, 0x80, 0x47, 0x70, + 0xff, 0xff, 0x00, 0x00, 0x68, 0x00, 0x08, 0x00, + 0x1c, 0x01, 0x48, 0x07, 0x62, 0x08, 0x48, 0x06, + 0x62, 0x48, 0x48, 0x05, 0x61, 0xc8, 0x48, 0x04, + 0x61, 0x88, 0x20, 0x00, 0x60, 0x08, 0x20, 0x00, + 0x60, 0x48, 0x20, 0x00, 0x60, 0x88, 0x47, 0x70, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0xb0, 0x1c, 0x07, + 0x1c, 0x0c, 0x2c, 0x07, 0xd2, 0x73, 0x25, 0x00, + 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x2f, 0x35, 0x01, + 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, + 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, + 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, + 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, + 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, + 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0xf8, + 0xf0, 0x00, 0xfb, 0xd2, 0xe7, 0xcf, 0x23, 0xcf, + 0x00, 0xdb, 0x18, 0xf8, 0xf7, 0xff, 0xfb, 0xb8, + 0x25, 0x00, 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x54, + 0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, + 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc0, 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, + 0x00, 0xc9, 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc9, 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, + 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, + 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0xdb, 0xf0, 0x00, 0xfb, 0x6b, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, + 0x43, 0x69, 0x19, 0xc9, 0xe0, 0x00, 0xe0, 0x94, + 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0xcc, + 0xf0, 0x00, 0xfb, 0x7a, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xfb, 0x60, + 0xe7, 0xaa, 0x25, 0x07, 0x2d, 0x11, 0xdb, 0x02, + 0xe0, 0x4e, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, + 0x69, 0xc9, 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x80, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x01, 0x48, 0xb1, 0xf0, 0x00, 0xfb, 0x16, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, + 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x01, 0x48, 0xa2, 0xf0, 0x00, + 0xfb, 0x27, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x30, 0x34, 0xf7, 0xff, 0xfb, 0x0d, 0xe7, 0xb0, + 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x1f, + 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0x8d, 0xf0, 0x00, 0xfa, 0xcf, 0xe7, 0xdf, + 0xe1, 0xca, 0x2c, 0x0e, 0xd3, 0x73, 0x3c, 0x07, + 0x1f, 0xe5, 0x42, 0xa5, 0xd3, 0x02, 0xe0, 0x1f, + 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0x79, 0xf0, 0x00, 0xfa, 0xd5, 0xe7, 0xdf, + 0x1c, 0x25, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x50, + 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, + 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 0x69, 0xc9, + 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x80, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0x61, 0xf0, 0x00, 0xfa, 0x77, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, + 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, + 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x01, 0x48, 0x53, 0xf0, 0x00, 0xfa, 0x88, + 0x20, 0x4c, 0x43, 0x68, 0xe0, 0x00, 0xe0, 0x29, + 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xfa, 0x6c, + 0xe7, 0xae, 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, + 0xe0, 0x1f, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, + 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, + 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x01, 0x48, 0x3d, 0xf0, 0x00, 0xfa, 0x2e, + 0xe7, 0xdf, 0xe1, 0x29, 0x3c, 0x07, 0x1c, 0x25, + 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x2f, 0x35, 0x01, + 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, + 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, + 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, + 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, + 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, + 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x22, + 0xf0, 0x00, 0xfa, 0x26, 0xe7, 0xcf, 0x25, 0x00, + 0x42, 0xa5, 0xd3, 0x02, 0xe0, 0x1f, 0x35, 0x01, + 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, + 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x10, + 0xf0, 0x00, 0xfa, 0x02, 0xe7, 0xdf, 0x1c, 0x25, + 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x55, 0x35, 0x01, + 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, + 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, + 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, + 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1d, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0xe0, 0x01, + 0x2e, 0x08, 0xbb, 0x00, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, 0x19, 0x40, + 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x01, 0x48, 0x50, 0xf0, 0x00, + 0xf9, 0x9d, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, + 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x42, + 0xf0, 0x00, 0xf9, 0xae, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xf9, 0x94, + 0xe7, 0xa9, 0x25, 0x07, 0x2d, 0x11, 0xdb, 0x02, + 0xe0, 0x4e, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, + 0x69, 0xc9, 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x80, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x01, 0x48, 0x27, 0xf0, 0x00, 0xf9, 0x4a, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, + 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x01, 0x48, 0x18, 0xf0, 0x00, + 0xf9, 0x5b, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x30, 0x34, 0xf7, 0xff, 0xf9, 0x41, 0xe7, 0xb0, + 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x1f, + 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0x03, 0xf0, 0x00, 0xf9, 0x03, 0xe7, 0xdf, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0xbb, 0x00, 0xb4, 0x90, 0x1c, 0x02, + 0x1c, 0x0f, 0x3a, 0x01, 0x2f, 0x01, 0xd1, 0x0d, + 0x09, 0x50, 0x00, 0x80, 0x49, 0x0d, 0x58, 0x08, + 0x06, 0xd4, 0x0e, 0xe4, 0x21, 0x01, 0x40, 0xa1, + 0x43, 0x08, 0x09, 0x51, 0x00, 0x89, 0x4b, 0x09, + 0x50, 0x58, 0xe0, 0x0d, 0x09, 0x50, 0x00, 0x80, + 0x49, 0x06, 0x58, 0x08, 0x06, 0xd4, 0x0e, 0xe4, + 0x21, 0x01, 0x40, 0xa1, 0x43, 0xc9, 0x40, 0x01, + 0x09, 0x50, 0x00, 0x80, 0x4b, 0x01, 0x50, 0x19, + 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0xd1, 0xf8, + 0xb4, 0x80, 0x1c, 0x01, 0x39, 0x01, 0x09, 0x48, + 0x00, 0x80, 0x4a, 0x08, 0x58, 0x10, 0x06, 0xca, + 0x0e, 0xd2, 0x27, 0x01, 0x40, 0x97, 0x1c, 0x3b, + 0x40, 0x18, 0xd0, 0x03, 0x20, 0x01, 0xbc, 0x80, + 0x47, 0x70, 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xfa, + 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0xd1, 0xf8, + 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0a, 0x68, 0x54, + 0x6a, 0xf8, 0x05, 0x86, 0x0d, 0xb6, 0x2c, 0x07, + 0xda, 0x01, 0x1c, 0x20, 0xe0, 0x00, 0x20, 0x07, + 0x1c, 0x05, 0x21, 0x00, 0x42, 0xa9, 0xd3, 0x02, + 0xe0, 0x15, 0x31, 0x01, 0xe7, 0xfa, 0x00, 0x88, + 0x18, 0x40, 0x00, 0xc0, 0x18, 0x80, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0xb0, + 0xd1, 0x08, 0x00, 0x88, 0x18, 0x40, 0x00, 0xc0, + 0x18, 0x80, 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, + 0xbc, 0xf0, 0x47, 0x70, 0xe7, 0xe9, 0x1f, 0xe0, + 0x28, 0x11, 0xda, 0x01, 0x1f, 0xe0, 0xe0, 0x00, + 0x20, 0x11, 0x1c, 0x05, 0x21, 0x00, 0x42, 0xa9, + 0xd3, 0x02, 0xe0, 0x0d, 0x31, 0x01, 0xe7, 0xfa, + 0x20, 0x4c, 0x43, 0x48, 0x18, 0x80, 0x6a, 0x80, + 0x42, 0xb0, 0xd1, 0x04, 0x20, 0x4c, 0x43, 0x48, + 0x18, 0x80, 0x30, 0x0c, 0xe7, 0xe4, 0xe7, 0xf1, + 0x20, 0x00, 0xe7, 0xe1, 0xe7, 0xe0, 0xb5, 0x90, + 0x48, 0x07, 0x68, 0x04, 0x48, 0x07, 0x68, 0x07, + 0x1c, 0x39, 0x1c, 0x20, 0x4a, 0x06, 0x68, 0x13, + 0x22, 0xf3, 0x00, 0xd2, 0xf0, 0x00, 0xf9, 0xca, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0xbb, 0x20, 0x2e, 0x08, 0xbb, 0x24, + 0x2e, 0x08, 0xd1, 0xfc, 0xb4, 0xf0, 0x1c, 0x01, + 0xb0, 0x83, 0x22, 0x00, 0x68, 0x4b, 0x2b, 0x07, + 0xdd, 0x01, 0x23, 0x07, 0xe0, 0x00, 0x68, 0x4b, + 0x1c, 0x1c, 0x23, 0x00, 0x43, 0xdb, 0x93, 0x02, + 0x23, 0x00, 0x43, 0xdb, 0x93, 0x01, 0x23, 0x00, + 0x93, 0x00, 0x4b, 0x17, 0x68, 0x1b, 0x2b, 0x00, + 0xd0, 0x07, 0x4b, 0x15, 0x68, 0x1b, 0x6a, 0xdb, + 0x93, 0x02, 0x4b, 0x13, 0x68, 0x1b, 0x6b, 0x5b, + 0x93, 0x01, 0x20, 0x00, 0x42, 0xa0, 0xd3, 0x02, + 0xe0, 0x16, 0x30, 0x01, 0xe7, 0xfa, 0x00, 0x83, + 0x18, 0x1b, 0x00, 0xdb, 0x18, 0x5d, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xeb, 0x6e, 0x9f, 0x04, 0x3b, + 0x0c, 0x1b, 0xd0, 0x08, 0x0c, 0x3b, 0x04, 0x1b, + 0xd0, 0x05, 0x9b, 0x00, 0x18, 0xc5, 0x26, 0x01, + 0x40, 0xae, 0x1c, 0x33, 0x43, 0x1a, 0xe7, 0xe8, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xcb, 0x61, 0xda, + 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0xb9, 0xc4, 0xb4, 0x80, 0x1c, 0x01, + 0x20, 0x00, 0x68, 0x0a, 0x42, 0x90, 0xdb, 0x02, + 0xe0, 0x07, 0x30, 0x01, 0xe7, 0xf9, 0x23, 0x00, + 0x43, 0xdb, 0x68, 0x8a, 0x00, 0x87, 0x51, 0xd3, + 0xe7, 0xf7, 0x22, 0x00, 0x43, 0xd2, 0x68, 0x8b, + 0x68, 0x0f, 0x00, 0xbf, 0x51, 0xda, 0x23, 0x00, + 0x43, 0xdb, 0x68, 0x8a, 0x68, 0x0f, 0x00, 0xbf, + 0x19, 0xd2, 0x60, 0x53, 0x22, 0x00, 0x60, 0x4a, + 0xbc, 0x80, 0x47, 0x70, 0xb4, 0xf0, 0x1c, 0x03, + 0x1c, 0x0c, 0x1c, 0x17, 0x68, 0x9a, 0xca, 0x40, + 0x42, 0xa6, 0xd2, 0x00, 0xe7, 0xfb, 0x3a, 0x04, + 0x1c, 0x11, 0xc9, 0x40, 0x42, 0xbe, 0xd2, 0x00, + 0xe7, 0xfb, 0x39, 0x04, 0x68, 0x10, 0x42, 0xa0, + 0xd1, 0x02, 0x68, 0x08, 0x42, 0xb8, 0xd0, 0x02, + 0x20, 0xff, 0xbc, 0xf0, 0x47, 0x70, 0x39, 0x04, + 0x68, 0x98, 0x68, 0x5e, 0x00, 0xb6, 0x19, 0x85, + 0x68, 0x58, 0x38, 0x02, 0x60, 0x58, 0x68, 0x50, + 0x60, 0x10, 0x32, 0x04, 0x42, 0x8a, 0xd3, 0xfa, + 0x68, 0x88, 0x60, 0x08, 0x31, 0x04, 0x42, 0xa9, + 0xd3, 0xfa, 0x20, 0x00, 0xe7, 0xe9, 0xe7, 0xe8, + 0xb4, 0xf0, 0x1c, 0x03, 0x1c, 0x0c, 0x1c, 0x17, + 0x68, 0x58, 0x68, 0x1e, 0x3e, 0x01, 0x42, 0xb0, + 0xdb, 0x02, 0x20, 0xff, 0xbc, 0xf0, 0x47, 0x70, + 0x68, 0x9a, 0xca, 0x40, 0x42, 0xa6, 0xd2, 0x00, + 0xe7, 0xfb, 0x3a, 0x04, 0x1c, 0x15, 0xcd, 0x40, + 0x42, 0xbe, 0xd2, 0x00, 0xe7, 0xfb, 0x68, 0x58, + 0x30, 0x02, 0x60, 0x58, 0x68, 0x98, 0x68, 0x5e, + 0x00, 0xb6, 0x19, 0x80, 0x1f, 0xc1, 0x39, 0x01, + 0x68, 0x08, 0x60, 0x88, 0x39, 0x04, 0x1d, 0xc8, + 0x30, 0x01, 0x42, 0xa8, 0xd8, 0xf8, 0x60, 0x8f, + 0x68, 0x08, 0x60, 0x48, 0x39, 0x04, 0x1d, 0x08, + 0x42, 0x90, 0xd8, 0xf9, 0x60, 0x14, 0x20, 0x00, + 0xe7, 0xd8, 0xe7, 0xd7, 0xb5, 0xf0, 0x1c, 0x07, + 0x1c, 0x0c, 0xb0, 0x81, 0x1c, 0x38, 0x21, 0x00, + 0xf0, 0x0e, 0xfc, 0x1a, 0x1c, 0x06, 0x1c, 0x38, + 0x21, 0x01, 0xf0, 0x0e, 0xfc, 0x15, 0x90, 0x00, + 0x1c, 0x31, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x50, + 0x49, 0x20, 0x68, 0x09, 0x60, 0x08, 0x99, 0x00, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x49, 0x49, 0x1e, + 0x68, 0x09, 0x60, 0x08, 0x48, 0x1b, 0x68, 0x00, + 0x68, 0x05, 0x48, 0x1c, 0x68, 0x01, 0x23, 0x02, + 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x2c, 0x00, + 0xd0, 0x0c, 0x48, 0x19, 0x68, 0x00, 0x78, 0x00, + 0x28, 0x00, 0xd0, 0x07, 0x48, 0x14, 0x68, 0x00, + 0x68, 0x05, 0x48, 0x14, 0x68, 0x01, 0x23, 0x02, + 0x43, 0x19, 0x60, 0x01, 0x1c, 0x20, 0x49, 0x13, + 0x68, 0x09, 0x70, 0x08, 0x48, 0x12, 0x63, 0xc5, + 0x20, 0x3f, 0x04, 0x00, 0x40, 0x28, 0x0c, 0x00, + 0x49, 0x10, 0x62, 0x08, 0x20, 0xff, 0x02, 0x00, + 0x40, 0x28, 0x0a, 0x00, 0x49, 0x0d, 0x62, 0x48, + 0x06, 0xa8, 0x0e, 0x80, 0x23, 0x80, 0x43, 0x18, + 0x49, 0x0a, 0x62, 0x88, 0x1c, 0x28, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, + 0xe7, 0xfa, 0x00, 0x00, 0x2e, 0x08, 0xd2, 0x08, + 0x2e, 0x08, 0xd2, 0x0c, 0x6a, 0x00, 0x00, 0x18, + 0x2e, 0x08, 0xd2, 0x10, 0x2e, 0x08, 0xd2, 0x14, + 0x68, 0x00, 0x0d, 0x00, 0x72, 0x00, 0x01, 0x00, + 0xb4, 0x80, 0x1c, 0x02, 0x1c, 0x0f, 0x06, 0xb9, + 0x0e, 0x89, 0x20, 0x01, 0x03, 0x80, 0x40, 0x10, + 0x09, 0xc0, 0x43, 0x01, 0x20, 0xf0, 0x40, 0x10, + 0x01, 0x40, 0x43, 0x01, 0x07, 0x10, 0x0f, 0x00, + 0x03, 0x00, 0x43, 0x01, 0x20, 0x07, 0x02, 0xc0, + 0x40, 0x10, 0x01, 0x40, 0x43, 0x01, 0x20, 0x07, + 0x02, 0x00, 0x40, 0x10, 0x02, 0xc0, 0x43, 0x01, + 0x1c, 0x08, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, + 0xb5, 0xff, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, + 0x9b, 0x03, 0x06, 0x18, 0x16, 0x06, 0x20, 0x33, + 0x06, 0x40, 0x6b, 0x80, 0x1c, 0x01, 0x20, 0x04, + 0x40, 0x08, 0xd0, 0x05, 0x20, 0xd0, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xe0, 0x17, + 0x23, 0x04, 0x43, 0xdb, 0x40, 0x19, 0x01, 0x08, + 0x4b, 0x0a, 0x68, 0x1b, 0x18, 0xc2, 0x60, 0x15, + 0x60, 0x54, 0x2e, 0xfe, 0xd0, 0x04, 0x20, 0x01, + 0x40, 0xb0, 0x60, 0xd0, 0x4b, 0x06, 0x43, 0x1f, + 0x60, 0x97, 0x20, 0x01, 0x40, 0x88, 0x23, 0x33, + 0x06, 0x5b, 0x63, 0x58, 0x20, 0x00, 0xe7, 0xe2, + 0xe7, 0xe1, 0x00, 0x00, 0x2e, 0x08, 0x20, 0x8c, + 0x80, 0x00, 0x00, 0x00, 0xb4, 0xb0, 0x1c, 0x01, + 0x06, 0x08, 0x16, 0x04, 0x4f, 0x0c, 0x22, 0x00, + 0x20, 0x00, 0x28, 0x04, 0xd3, 0x02, 0xe0, 0x0b, + 0x30, 0x01, 0xe7, 0xfa, 0x01, 0x03, 0x19, 0xdb, + 0x68, 0x5b, 0x42, 0xa3, 0xd1, 0x03, 0x25, 0x01, + 0x40, 0x85, 0x1c, 0x2b, 0x43, 0x1a, 0xe7, 0xf3, + 0x23, 0x33, 0x06, 0x5b, 0x6c, 0x1b, 0x40, 0x13, + 0xd0, 0x00, 0xe7, 0xf9, 0xbc, 0xb0, 0x47, 0x70, + 0x9e, 0x00, 0x00, 0xc0, 0xe3, 0xa0, 0x14, 0x62, + 0xe5, 0x91, 0x10, 0x14, 0xe2, 0x01, 0x00, 0xff, + 0xe5, 0x9f, 0x10, 0x2c, 0xe5, 0xd1, 0x10, 0x00, + 0xe3, 0x51, 0x00, 0xff, 0x0a, 0x00, 0x00, 0x05, + 0xe5, 0x9f, 0x10, 0x1c, 0xe5, 0xd1, 0x10, 0x00, + 0xe3, 0xa0, 0x20, 0x01, 0xe1, 0xa0, 0x11, 0x12, + 0xe3, 0xa0, 0x24, 0x66, 0xe5, 0x82, 0x10, 0x10, + 0xe3, 0xa0, 0x14, 0x62, 0xe5, 0x81, 0x00, 0x14, + 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0xb9, 0xb4, + 0x47, 0x00, 0x00, 0x00, 0x47, 0x08, 0x00, 0x00, + 0x47, 0x10, 0x00, 0x00, 0x47, 0x18, 0x00, 0x00, + 0x47, 0x20, 0x00, 0x00, 0x47, 0x28, 0x00, 0x00, + 0x47, 0x30, 0x00, 0x00, 0x47, 0x38, 0x00, 0x00, + 0x17, 0xcb, 0x40, 0x59, 0x1a, 0xc9, 0x17, 0xc2, + 0x40, 0x50, 0x1a, 0x80, 0xd1, 0x01, 0xf0, 0x00, + 0xf9, 0xf1, 0xb4, 0x0c, 0x08, 0x4b, 0x1c, 0x02, + 0x42, 0x9a, 0xd8, 0x00, 0x00, 0x52, 0xd3, 0xfb, + 0x23, 0x00, 0xe0, 0x00, 0x08, 0x52, 0x42, 0x91, + 0x41, 0x5b, 0x42, 0x91, 0xd3, 0x00, 0x1a, 0x89, + 0x42, 0x82, 0xd1, 0xf7, 0x1c, 0x18, 0xbc, 0x0c, + 0x40, 0x5a, 0x40, 0x50, 0x1a, 0x80, 0x40, 0x59, + 0x1a, 0xc9, 0x47, 0x70, 0x08, 0x4b, 0x1c, 0x02, + 0xd1, 0x01, 0xf0, 0x00, 0xf9, 0xd3, 0x42, 0x9a, + 0xd8, 0x00, 0x00, 0x52, 0xd3, 0xfb, 0x23, 0x00, + 0xe0, 0x00, 0x08, 0x52, 0x42, 0x91, 0x41, 0x5b, + 0x42, 0x91, 0xd3, 0x00, 0x1a, 0x89, 0x42, 0x82, + 0xd1, 0xf7, 0x1c, 0x18, 0x47, 0x70, 0x00, 0x00, + 0x3a, 0x20, 0xd5, 0x09, 0x42, 0x53, 0x32, 0x20, + 0x40, 0xd0, 0x46, 0x94, 0x1c, 0x0a, 0x40, 0x9a, + 0x43, 0x10, 0x46, 0x62, 0x40, 0xd1, 0x47, 0x70, + 0x1c, 0x08, 0x40, 0xd0, 0x21, 0x00, 0x47, 0x70, + 0x40, 0x10, 0x40, 0x19, 0x47, 0x70, 0x00, 0x00, + 0x47, 0x70, 0x00, 0x00, 0x1a, 0x43, 0x42, 0x93, + 0xd3, 0x30, 0x46, 0x84, 0x07, 0x8b, 0xd0, 0x07, + 0x1e, 0x52, 0xd3, 0x29, 0x78, 0x0b, 0x70, 0x03, + 0x1c, 0x40, 0x1c, 0x49, 0x07, 0x8b, 0xd1, 0xf7, + 0x07, 0x83, 0xd1, 0x17, 0x3a, 0x10, 0xd3, 0x05, + 0xb4, 0xb0, 0xc9, 0xb8, 0xc0, 0xb8, 0x3a, 0x10, + 0xd2, 0xfb, 0xbc, 0xb0, 0x32, 0x0c, 0xd3, 0x0f, + 0xc9, 0x08, 0xc0, 0x08, 0x1f, 0x12, 0xd2, 0xfb, + 0xe0, 0x0a, 0xc9, 0x08, 0x70, 0xc3, 0x0a, 0x1b, + 0x70, 0x83, 0x0a, 0x1b, 0x70, 0x43, 0x0a, 0x1b, + 0x70, 0x03, 0x1d, 0x00, 0x1f, 0x12, 0xd2, 0xf4, + 0x1c, 0xd2, 0xd3, 0x05, 0x78, 0x0b, 0x70, 0x03, + 0x1c, 0x49, 0x1c, 0x40, 0x1e, 0x52, 0xd2, 0xf9, + 0x46, 0x60, 0x47, 0x70, 0x1c, 0x03, 0x43, 0x0b, + 0x43, 0x13, 0x07, 0x9b, 0xd1, 0x04, 0x1f, 0x12, + 0x58, 0x8b, 0x50, 0x83, 0xd1, 0xfb, 0x47, 0x70, + 0x1e, 0x52, 0x5c, 0x8b, 0x54, 0x83, 0xd1, 0xfb, + 0x47, 0x70, 0x00, 0x00, 0x1c, 0x02, 0x43, 0x0a, + 0x07, 0x92, 0xd1, 0x1a, 0x46, 0xbc, 0xb4, 0x30, + 0x4c, 0x11, 0x01, 0xe5, 0xc8, 0x04, 0xc9, 0x08, + 0x1a, 0xd7, 0xd1, 0x09, 0x1b, 0x17, 0x43, 0x97, + 0x40, 0x2f, 0xd0, 0xf7, 0x20, 0x00, 0xbc, 0x30, + 0x46, 0x67, 0x47, 0x70, 0x02, 0x12, 0x02, 0x1b, + 0x0e, 0x11, 0x0e, 0x18, 0x1a, 0x08, 0xd1, 0x01, + 0x29, 0x00, 0xd1, 0xf7, 0xbc, 0x30, 0x46, 0x67, + 0x47, 0x70, 0x78, 0x02, 0x78, 0x0b, 0x1a, 0xd2, + 0xd1, 0x03, 0x1c, 0x40, 0x1c, 0x49, 0x2b, 0x00, + 0xd1, 0xf7, 0x1c, 0x10, 0x47, 0x70, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x42, 0x41, 0x46, 0x8c, + 0x07, 0x83, 0xd0, 0x05, 0x78, 0x03, 0x2b, 0x00, + 0xd0, 0x16, 0x1c, 0x40, 0x07, 0x83, 0xd1, 0xf9, + 0x49, 0x0a, 0xc8, 0x04, 0x09, 0xc9, 0x1a, 0x53, + 0x43, 0x93, 0x01, 0xc9, 0x40, 0x0b, 0xd0, 0xf8, + 0x1f, 0x00, 0x0e, 0x13, 0xd0, 0x08, 0x1c, 0x40, + 0x02, 0x13, 0x0e, 0x1b, 0xd0, 0x04, 0x1c, 0x40, + 0x04, 0x13, 0x0e, 0x1b, 0xd0, 0x00, 0x1c, 0x40, + 0x44, 0x60, 0x47, 0x70, 0x80, 0x80, 0x80, 0x80, + 0x46, 0xbc, 0xb4, 0x60, 0x1c, 0x03, 0x43, 0x08, + 0x07, 0x80, 0xd1, 0x1b, 0x1f, 0x12, 0xd3, 0x0b, + 0x4e, 0x0f, 0xcb, 0x01, 0xc9, 0x80, 0x1b, 0xc0, + 0xd1, 0x09, 0x1b, 0xbd, 0x43, 0xbd, 0x01, 0xf7, + 0x40, 0x3d, 0xd1, 0x04, 0x1f, 0x12, 0xd2, 0xf4, + 0x1c, 0xd2, 0xd3, 0x0e, 0xe0, 0x02, 0x1f, 0x1b, + 0x1f, 0x09, 0x1c, 0xd2, 0x78, 0x18, 0x78, 0x0f, + 0x1b, 0xc0, 0xd1, 0x06, 0x2f, 0x00, 0xd0, 0x04, + 0x1c, 0x5b, 0x1c, 0x49, 0x1e, 0x52, 0xd2, 0xf5, + 0x20, 0x00, 0xbc, 0x60, 0x46, 0x67, 0x47, 0x70, + 0x01, 0x01, 0x01, 0x01, 0x46, 0xbc, 0x1c, 0x03, + 0x43, 0x08, 0x07, 0x80, 0xd1, 0x13, 0x1f, 0x12, + 0xd3, 0x05, 0xcb, 0x01, 0xc9, 0x80, 0x1b, 0xc0, + 0xd1, 0x04, 0x1f, 0x12, 0xd2, 0xf9, 0x1c, 0xd2, + 0xd3, 0x0c, 0xe0, 0x02, 0x1f, 0x1b, 0x1f, 0x09, + 0x1c, 0xd2, 0x78, 0x18, 0x78, 0x0f, 0x1b, 0xc0, + 0xd1, 0x04, 0x1c, 0x5b, 0x1c, 0x49, 0x1e, 0x52, + 0xd2, 0xf7, 0x20, 0x00, 0x46, 0x67, 0x47, 0x70, + 0xb5, 0x80, 0xb0, 0x8f, 0x4b, 0x0a, 0x93, 0x08, + 0x4b, 0x0a, 0x93, 0x09, 0x4b, 0x0a, 0x93, 0x07, + 0x90, 0x0e, 0x46, 0x6b, 0xa8, 0x0e, 0xf0, 0x00, + 0xff, 0x4d, 0x1c, 0x07, 0x20, 0x00, 0xa9, 0x0e, + 0xf0, 0x00, 0xf8, 0xdc, 0x1c, 0x38, 0xb0, 0x0f, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x01, 0xe6, 0x39, 0x2e, 0x01, 0xe6, 0x47, + 0x2e, 0x01, 0xeb, 0xe3, 0x46, 0x84, 0x07, 0x83, + 0xd0, 0x05, 0x1e, 0x52, 0xd3, 0x12, 0x70, 0x01, + 0x1c, 0x40, 0x07, 0x83, 0xd1, 0xf9, 0x3a, 0x08, + 0xd3, 0x07, 0x02, 0x0b, 0x43, 0x19, 0x04, 0x0b, + 0x43, 0x19, 0x1c, 0x0b, 0xc0, 0x0a, 0x3a, 0x08, + 0xd2, 0xfc, 0x1d, 0xd2, 0xd3, 0x02, 0x54, 0x81, + 0x1e, 0x52, 0xd2, 0xfc, 0x46, 0x60, 0x47, 0x70, + 0x47, 0x78, 0x00, 0x00, 0xe2, 0x10, 0xc1, 0x02, + 0x12, 0x60, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, + 0x03, 0xa0, 0x10, 0x00, 0x01, 0x2f, 0xff, 0x1e, + 0xe3, 0x8c, 0xc1, 0x01, 0xe3, 0x8c, 0xc6, 0x1e, + 0xe1, 0xb0, 0x28, 0x20, 0x01, 0xa0, 0x08, 0x00, + 0x02, 0x4c, 0xc4, 0x01, 0xe1, 0xb0, 0x2c, 0x20, + 0x01, 0xa0, 0x04, 0x00, 0x02, 0x4c, 0xc5, 0x02, + 0xe1, 0xb0, 0x2e, 0x20, 0x01, 0xa0, 0x02, 0x00, + 0x02, 0x4c, 0xc5, 0x01, 0xe1, 0xb0, 0x2f, 0x20, + 0x01, 0xa0, 0x01, 0x00, 0x02, 0x4c, 0xc6, 0x02, + 0xe1, 0xb0, 0x2f, 0xa0, 0x01, 0xa0, 0x00, 0x80, + 0x02, 0x4c, 0xc6, 0x01, 0xe1, 0xa0, 0x00, 0x80, + 0xe1, 0xa0, 0x1a, 0x00, 0xe1, 0x8c, 0x06, 0x20, + 0xe1, 0x2f, 0xff, 0x1e, 0x22, 0x01, 0x07, 0xd2, + 0x40, 0x50, 0x47, 0x70, 0xe2, 0x20, 0x01, 0x02, + 0xe1, 0x2f, 0xff, 0x1e, 0x00, 0x40, 0x08, 0x40, + 0x47, 0x70, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0xc4, 0xff, 0xe3, 0x8c, 0xc6, 0x0e, + 0xe1, 0x5c, 0x00, 0x82, 0x9a, 0x00, 0x00, 0x0a, + 0xe1, 0xb0, 0x00, 0x80, 0x03, 0x31, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x0a, 0x3a, 0x00, 0x00, 0x12, + 0xe1, 0x50, 0x00, 0x0c, 0x03, 0x51, 0x00, 0x00, + 0x8a, 0x00, 0x04, 0xec, 0xe1, 0xb0, 0x20, 0x82, + 0x8a, 0x00, 0x00, 0x18, 0xe3, 0xa0, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0x03, 0x53, 0x00, 0x00, + 0x0a, 0xff, 0xff, 0xf2, 0xea, 0x00, 0x04, 0xe9, + 0xe1, 0x50, 0x00, 0x0c, 0x03, 0x51, 0x00, 0x00, + 0x8a, 0x00, 0x04, 0xe2, 0xe1, 0xb0, 0x20, 0x82, + 0x33, 0xa0, 0x00, 0x01, 0x23, 0xa0, 0x00, 0x00, + 0x03, 0x33, 0x00, 0x00, 0x03, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x0c, + 0x03, 0x51, 0x00, 0x00, 0x8a, 0x00, 0x04, 0xd9, + 0xe1, 0xb0, 0x20, 0x82, 0x23, 0xa0, 0x00, 0x00, + 0x21, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02, + 0x01, 0x51, 0x00, 0x03, 0x33, 0xa0, 0x00, 0x01, + 0x23, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03, + 0x83, 0xa0, 0x00, 0x01, 0x93, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe5, 0x9f, 0xc0, 0x28, 0xe8, 0xac, 0x7f, 0xff, + 0xe2, 0x8f, 0x00, 0x0c, 0xe2, 0x4c, 0x10, 0x3c, + 0xe2, 0x4e, 0xe0, 0x04, 0xe5, 0x8c, 0xe0, 0x00, + 0xea, 0x00, 0x05, 0x71, 0x80, 0x00, 0x00, 0x20, + 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x62, + 0x79, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x00, 0x00, + 0x2e, 0x08, 0x21, 0xd0, 0x06, 0x00, 0x0e, 0x00, + 0x68, 0x0a, 0x70, 0x10, 0x32, 0x01, 0x60, 0x0a, + 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 0x00, 0x00, + 0xb4, 0x90, 0x18, 0x42, 0x78, 0x17, 0x23, 0x00, + 0x2f, 0x00, 0xd0, 0x22, 0x2f, 0x35, 0xdb, 0x20, + 0x2f, 0x35, 0xd0, 0x01, 0x24, 0x30, 0xe0, 0x07, + 0x1c, 0x17, 0x78, 0x7c, 0x37, 0x01, 0x2c, 0x30, + 0xd0, 0xfb, 0x2c, 0x00, 0xd1, 0xf6, 0xe0, 0x14, + 0x3a, 0x01, 0x78, 0x17, 0x2f, 0x39, 0xd1, 0x01, + 0x70, 0x14, 0xe7, 0xf9, 0x37, 0x01, 0x70, 0x17, + 0x78, 0x02, 0x2a, 0x30, 0xd0, 0x09, 0x29, 0x00, + 0xdb, 0x04, 0x5c, 0x42, 0x18, 0x43, 0x70, 0x5a, + 0x39, 0x01, 0xd5, 0xfa, 0x20, 0x01, 0xbc, 0x90, + 0x47, 0x70, 0x1c, 0x18, 0xbc, 0x90, 0x47, 0x70, + 0xb5, 0x90, 0x1c, 0x0c, 0x1e, 0x57, 0x2a, 0x00, + 0xdd, 0x08, 0xf0, 0x01, 0xfc, 0x81, 0x31, 0x30, + 0x70, 0x21, 0x1c, 0x39, 0x3c, 0x01, 0x3f, 0x01, + 0x29, 0x00, 0xdc, 0xf6, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0xf7, 0x1c, 0x14, 0x1c, 0x0f, + 0xb0, 0x85, 0xa3, 0xfb, 0x1c, 0x08, 0x1c, 0x11, + 0xcb, 0x0c, 0xf7, 0xff, 0xff, 0x3b, 0x28, 0x00, + 0xd0, 0x05, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, + 0xff, 0x29, 0x1c, 0x0c, 0x1c, 0x07, 0xa3, 0xf4, + 0xcb, 0x0c, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x01, + 0xfc, 0x7b, 0x28, 0x00, 0xd0, 0x05, 0x27, 0x00, + 0x97, 0x01, 0x1f, 0x78, 0x90, 0x00, 0x1c, 0x3e, + 0xe1, 0xc8, 0xb0, 0x8a, 0x46, 0x6a, 0x1c, 0x38, + 0x1c, 0x21, 0xf0, 0x01, 0xfc, 0x93, 0x90, 0x08, + 0x91, 0x09, 0x20, 0xff, 0x30, 0x2e, 0x9f, 0x00, + 0x43, 0x78, 0x4b, 0xe9, 0x18, 0xc1, 0x20, 0x7d, + 0x00, 0xc0, 0xf7, 0xff, 0xfd, 0x71, 0x90, 0x0a, + 0x1b, 0xc2, 0xa1, 0xe6, 0xc9, 0x03, 0xf0, 0x01, + 0xfc, 0xc7, 0x9e, 0x0a, 0xb0, 0x83, 0xf0, 0x01, + 0xfd, 0x55, 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, + 0x2e, 0x00, 0xda, 0x04, 0x42, 0x76, 0x4d, 0xe1, + 0x4c, 0xe1, 0x1c, 0x67, 0xe0, 0x02, 0x4d, 0xe1, + 0x4c, 0xe1, 0x27, 0x00, 0x2e, 0x00, 0xd0, 0x16, + 0x08, 0x70, 0xd3, 0x0a, 0x46, 0x6b, 0x1c, 0x28, + 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x01, 0xfd, 0xba, + 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x2e, 0x01, + 0xd0, 0x09, 0x1c, 0x28, 0x1c, 0x21, 0x1c, 0x3a, + 0xf0, 0x01, 0xfd, 0xca, 0x10, 0x76, 0x1c, 0x0c, + 0x1c, 0x05, 0x1c, 0x17, 0xe7, 0xe8, 0xaa, 0x00, + 0xca, 0x07, 0xf0, 0x01, 0xfd, 0xdd, 0x90, 0x04, + 0x91, 0x05, 0xb0, 0x03, 0x98, 0x08, 0x99, 0x09, + 0x9a, 0x01, 0x9b, 0x02, 0xf0, 0x01, 0xfe, 0xd6, + 0x1c, 0x04, 0x1c, 0x0f, 0xa3, 0xcd, 0xcb, 0x0c, + 0xf7, 0xff, 0xfe, 0xd0, 0x28, 0x00, 0xd0, 0x1d, + 0xa3, 0xcc, 0x68, 0x1a, 0x68, 0x5b, 0x1c, 0x20, + 0x1c, 0x39, 0x1c, 0x15, 0x1c, 0x1e, 0xf0, 0x01, + 0xff, 0x6f, 0x1c, 0x04, 0x98, 0x0a, 0x38, 0x01, + 0x90, 0x0a, 0x1c, 0x0f, 0x98, 0x01, 0x99, 0x02, + 0x1c, 0x2a, 0x1c, 0x33, 0xf0, 0x01, 0xfe, 0xba, + 0x90, 0x01, 0x91, 0x02, 0xa3, 0xbf, 0xcb, 0x0c, + 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 0xfe, 0xb2, + 0x28, 0x00, 0xd1, 0xe1, 0xa3, 0xbf, 0xcb, 0x0c, + 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x01, 0xff, 0xc2, + 0x28, 0x00, 0xd0, 0x1d, 0xa3, 0xb9, 0x68, 0x1a, + 0x68, 0x5b, 0x1c, 0x20, 0x1c, 0x39, 0x1c, 0x15, + 0x1c, 0x1e, 0xf0, 0x01, 0xfe, 0x9f, 0x1c, 0x04, + 0x98, 0x0a, 0x30, 0x01, 0x90, 0x0a, 0x1c, 0x0f, + 0x98, 0x01, 0x99, 0x02, 0x1c, 0x2a, 0x1c, 0x33, + 0xf0, 0x01, 0xff, 0x3e, 0x90, 0x01, 0x91, 0x02, + 0xa3, 0xb0, 0xcb, 0x0c, 0x1c, 0x20, 0x1c, 0x39, + 0xf0, 0x01, 0xff, 0xa4, 0x28, 0x00, 0xd1, 0xe1, + 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x01, 0xff, 0xf6, + 0x90, 0x0b, 0x98, 0x0a, 0x42, 0x46, 0x96, 0x0e, + 0x98, 0x0b, 0xf7, 0xff, 0xfe, 0x3d, 0x9a, 0x00, + 0x9e, 0x0a, 0x1a, 0xb2, 0xf0, 0x01, 0xfc, 0x34, + 0x90, 0x06, 0x91, 0x07, 0xa0, 0x96, 0x68, 0x02, + 0x92, 0x04, 0x68, 0x41, 0x91, 0x05, 0x9e, 0x0a, + 0x2e, 0x00, 0xda, 0x25, 0x9e, 0x0e, 0xa1, 0xa1, + 0xc9, 0x03, 0xa2, 0x91, 0x68, 0x14, 0x68, 0x52, + 0x92, 0x03, 0x25, 0x00, 0x1c, 0x02, 0x1c, 0x2b, + 0x1c, 0x07, 0xf0, 0x02, 0xf8, 0x13, 0x1c, 0x02, + 0x1c, 0x0b, 0x99, 0x03, 0x1c, 0x20, 0xf0, 0x02, + 0xf8, 0x15, 0xa1, 0x9a, 0x68, 0x08, 0x68, 0x49, + 0x91, 0x0d, 0x1c, 0x3a, 0x1c, 0x2b, 0x1c, 0x04, + 0xf0, 0x01, 0xfe, 0xfe, 0xa3, 0x87, 0xcb, 0x0c, + 0xf0, 0x02, 0xf8, 0x76, 0x9b, 0x0d, 0x1c, 0x22, + 0xf0, 0x01, 0xfe, 0x4c, 0x1c, 0x04, 0xe0, 0x05, + 0xa0, 0x90, 0x68, 0x45, 0x68, 0x07, 0xa0, 0x7e, + 0x68, 0x41, 0x68, 0x04, 0x91, 0x03, 0x2e, 0x00, + 0xd0, 0x5d, 0x08, 0x70, 0xd3, 0x35, 0xb0, 0x82, + 0x98, 0x08, 0x99, 0x09, 0x9b, 0x05, 0x1c, 0x22, + 0xf0, 0x01, 0xfe, 0xe2, 0x90, 0x00, 0x91, 0x01, + 0x9b, 0x05, 0x1c, 0x38, 0x1c, 0x29, 0x1c, 0x22, + 0xf0, 0x01, 0xff, 0xe8, 0x9a, 0x06, 0x9b, 0x07, + 0xf0, 0x01, 0xfe, 0xd6, 0x9a, 0x00, 0x9b, 0x01, + 0xb0, 0x02, 0xf0, 0x01, 0xff, 0xdf, 0x90, 0x04, + 0x91, 0x05, 0x98, 0x06, 0x99, 0x07, 0x1c, 0x3a, + 0x1c, 0x2b, 0xf0, 0x01, 0xfe, 0xc9, 0xb0, 0x82, + 0x90, 0x00, 0x23, 0x00, 0x93, 0x01, 0x1c, 0x02, + 0xf0, 0x01, 0xff, 0xc8, 0x1c, 0x02, 0x1c, 0x0b, + 0x98, 0x06, 0x99, 0x07, 0xf0, 0x01, 0xff, 0xca, + 0x90, 0x06, 0x91, 0x07, 0x98, 0x00, 0x90, 0x08, + 0x99, 0x01, 0x91, 0x09, 0xb0, 0x02, 0x2e, 0x01, + 0xd0, 0x25, 0xa1, 0x72, 0xc9, 0x03, 0x1c, 0x3a, + 0x1c, 0x2b, 0xf0, 0x01, 0xfe, 0xad, 0x9b, 0x03, + 0x1c, 0x22, 0xf0, 0x01, 0xff, 0xb7, 0x9b, 0x03, + 0x1c, 0x22, 0xf0, 0x01, 0xfe, 0xa5, 0x91, 0x03, + 0x1c, 0x04, 0x1c, 0x38, 0x1c, 0x29, 0x1c, 0x3a, + 0x1c, 0x2b, 0xf0, 0x01, 0xfe, 0x9d, 0x25, 0x00, + 0x1c, 0x02, 0x1c, 0x2b, 0x1c, 0x07, 0xf0, 0x01, + 0xff, 0x9d, 0x1c, 0x02, 0x1c, 0x0b, 0x99, 0x03, + 0x1c, 0x20, 0xf0, 0x01, 0xff, 0x9f, 0x91, 0x03, + 0x10, 0x76, 0x1c, 0x04, 0xe7, 0xa1, 0xe7, 0xff, + 0xab, 0x06, 0xcb, 0x0f, 0xf0, 0x02, 0xf8, 0x0c, + 0x28, 0x00, 0xd1, 0x03, 0x98, 0x0b, 0x38, 0x01, + 0x90, 0x0b, 0xe7, 0x55, 0x98, 0x08, 0x99, 0x09, + 0x9a, 0x06, 0x9b, 0x07, 0xf0, 0x01, 0xff, 0x82, + 0x9a, 0x04, 0x9b, 0x05, 0xf0, 0x01, 0xff, 0x7e, + 0x9a, 0x01, 0x9b, 0x02, 0xf0, 0x01, 0xfd, 0xca, + 0xa3, 0x4c, 0x68, 0x1a, 0x68, 0x5b, 0x93, 0x0c, + 0x1c, 0x15, 0xf0, 0x01, 0xfe, 0x6d, 0x1c, 0x0c, + 0x1c, 0x07, 0xf0, 0x01, 0xff, 0x2f, 0x1c, 0x06, + 0xf7, 0xff, 0xfd, 0x7a, 0x1c, 0x3a, 0x1c, 0x23, + 0xf0, 0x01, 0xff, 0xde, 0x9b, 0x0c, 0x1c, 0x2a, + 0xf0, 0x01, 0xfe, 0x5e, 0xf0, 0x01, 0xff, 0x22, + 0x1c, 0x07, 0xd5, 0x04, 0x4b, 0x47, 0x18, 0xff, + 0x3e, 0x01, 0x2f, 0x00, 0xdb, 0xfa, 0x48, 0x45, + 0x42, 0x87, 0xdb, 0x04, 0x4b, 0x43, 0x1a, 0xff, + 0x36, 0x01, 0x42, 0x87, 0xda, 0xfa, 0x2e, 0x00, + 0xda, 0x06, 0x4b, 0x40, 0x18, 0xf6, 0x99, 0x0b, + 0x39, 0x01, 0x91, 0x0b, 0x2e, 0x00, 0xdb, 0xf8, + 0x42, 0x86, 0xdb, 0x06, 0x4b, 0x3b, 0x1a, 0xf6, + 0x99, 0x0b, 0x31, 0x01, 0x91, 0x0b, 0x42, 0x86, + 0xda, 0xf8, 0x99, 0x0b, 0x4b, 0x38, 0x42, 0x99, + 0xda, 0x17, 0x98, 0x0b, 0x00, 0x84, 0x18, 0x24, + 0x00, 0x64, 0x1c, 0x18, 0x1c, 0x31, 0xf7, 0xff, + 0xfb, 0xe3, 0x18, 0x20, 0x90, 0x0b, 0x00, 0x8c, + 0x18, 0x64, 0x00, 0x64, 0x1c, 0x39, 0x48, 0x30, + 0xf7, 0xff, 0xfb, 0xda, 0x18, 0x26, 0x00, 0x8f, + 0x18, 0x7f, 0x00, 0x7f, 0x98, 0x0a, 0x38, 0x01, + 0xe0, 0x16, 0x99, 0x0b, 0x42, 0x81, 0xdb, 0x14, + 0x98, 0x0b, 0xf0, 0x01, 0xfa, 0xa1, 0x4b, 0x27, + 0x43, 0x59, 0x19, 0x89, 0x90, 0x0b, 0x1c, 0x08, + 0xf0, 0x01, 0xfa, 0x9a, 0x4b, 0x23, 0x43, 0x59, + 0x19, 0xc9, 0x1c, 0x06, 0x1d, 0x48, 0xf0, 0x01, + 0xfa, 0x93, 0x1c, 0x07, 0x98, 0x0a, 0x30, 0x01, + 0x90, 0x0a, 0xb0, 0x0a, 0x24, 0x30, 0x98, 0x05, + 0x70, 0x04, 0x98, 0x05, 0x1d, 0x81, 0x22, 0x06, + 0x98, 0x01, 0xf7, 0xff, 0xfd, 0xfd, 0x98, 0x05, + 0x1d, 0xc1, 0x31, 0x05, 0x22, 0x06, 0x1c, 0x30, + 0xf7, 0xff, 0xfd, 0xf6, 0xe0, 0x2e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xea, 0x84, 0x3f, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, + 0xcc, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x40, 0x01, + 0xa0, 0x00, 0x00, 0x00, 0x40, 0xf8, 0x6a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x2e, 0x84, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc9, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x9a, 0x40, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x40, + 0x00, 0x01, 0x86, 0xa0, 0x98, 0x05, 0x1d, 0xc1, + 0x31, 0x0b, 0x22, 0x06, 0x1c, 0x38, 0xf7, 0xff, + 0xfd, 0xbf, 0x98, 0x05, 0x74, 0xc4, 0x27, 0x00, + 0x98, 0x05, 0x75, 0x07, 0x98, 0x00, 0x30, 0x05, + 0xb0, 0x05, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0x02, 0x08, 0x12, 0xd3, 0x01, + 0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, 0x60, 0x0a, + 0x68, 0x01, 0x4a, 0x08, 0x40, 0x0a, 0x4b, 0x07, + 0x42, 0x9a, 0xd0, 0x01, 0x20, 0x00, 0x47, 0x70, + 0x03, 0x09, 0xd1, 0x02, 0x68, 0x40, 0x28, 0x00, + 0xd0, 0x01, 0x20, 0x01, 0x47, 0x70, 0x20, 0x02, + 0x47, 0x70, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, + 0xb5, 0x90, 0x1c, 0x04, 0x54, 0x63, 0x1c, 0x4f, + 0x2a, 0x00, 0xda, 0x02, 0x42, 0x52, 0x21, 0x2d, + 0xe0, 0x00, 0x21, 0x2b, 0x1c, 0x38, 0x54, 0x21, + 0x23, 0x7d, 0x00, 0xdb, 0x37, 0x01, 0x42, 0x9a, + 0xdb, 0x09, 0x1c, 0x18, 0x1c, 0x11, 0xf7, 0xff, + 0xfb, 0x37, 0x1d, 0xc2, 0x32, 0x29, 0x1c, 0x38, + 0x54, 0x22, 0x1c, 0x0a, 0x37, 0x01, 0x2a, 0x64, + 0xdb, 0x09, 0x20, 0x64, 0x1c, 0x11, 0xf7, 0xff, + 0xfb, 0x2b, 0x1d, 0xc2, 0x32, 0x29, 0x1c, 0x38, + 0x54, 0x22, 0x1c, 0x0a, 0x37, 0x01, 0x1c, 0x10, + 0xf0, 0x01, 0xf9, 0xf6, 0x1d, 0xc2, 0x32, 0x29, + 0x1c, 0x38, 0x54, 0x22, 0x37, 0x01, 0x1c, 0x38, + 0x31, 0x30, 0x54, 0x21, 0x37, 0x01, 0x1c, 0x38, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, + 0x1c, 0x06, 0xb0, 0x82, 0x68, 0x10, 0x90, 0x00, + 0x1d, 0xd0, 0x30, 0x0d, 0xb0, 0x81, 0x1c, 0x0f, + 0x46, 0x69, 0x1c, 0x14, 0x1c, 0x05, 0xf7, 0xff, + 0xff, 0xa0, 0x99, 0x00, 0x29, 0x00, 0xd0, 0x01, + 0xa1, 0xc9, 0xe0, 0x0a, 0x99, 0x01, 0x08, 0x89, + 0xd3, 0x01, 0xa1, 0xc8, 0xe0, 0x05, 0x99, 0x01, + 0x08, 0xc9, 0xd3, 0x01, 0xa1, 0xc6, 0xe0, 0x00, + 0xa1, 0xc6, 0x60, 0x61, 0x28, 0x00, 0xd0, 0x15, + 0x28, 0x01, 0xd1, 0x01, 0xa0, 0xc4, 0xe0, 0x00, + 0xa0, 0xc4, 0x78, 0x01, 0x70, 0x39, 0x78, 0x41, + 0x70, 0x79, 0x78, 0x80, 0x70, 0xb8, 0x20, 0x00, + 0x70, 0xf8, 0x98, 0x01, 0x4b, 0xc0, 0x40, 0x18, + 0x60, 0x20, 0x20, 0x03, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xcd, 0x06, 0xb0, 0x01, + 0x48, 0xbc, 0x90, 0x01, 0x2e, 0x45, 0xd0, 0x74, + 0x2e, 0x65, 0xd0, 0x72, 0x2e, 0x66, 0xd1, 0x71, + 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0x2e, 0x1c, 0x06, + 0xd5, 0x4e, 0x42, 0x76, 0x68, 0xa0, 0x1c, 0x41, + 0x42, 0xb1, 0xda, 0x09, 0x21, 0x30, 0x70, 0x39, + 0x98, 0x01, 0x68, 0x00, 0x78, 0x00, 0x25, 0x02, + 0x70, 0x78, 0x68, 0xa0, 0x61, 0x20, 0xe0, 0x3b, + 0x1b, 0x80, 0x1c, 0x85, 0x2d, 0x12, 0xdd, 0x03, + 0x1f, 0xe8, 0x38, 0x0c, 0x25, 0x13, 0x61, 0x20, + 0x1c, 0x38, 0x1c, 0x29, 0xf7, 0xff, 0xfc, 0xd4, + 0x28, 0x00, 0xd0, 0x01, 0x35, 0x01, 0x3e, 0x01, + 0x2e, 0x00, 0xd1, 0x02, 0x78, 0x78, 0x70, 0x38, + 0xe0, 0x0d, 0x2e, 0x01, 0xd1, 0x10, 0x1c, 0x28, + 0x2d, 0x00, 0xdd, 0x05, 0x5c, 0x39, 0x18, 0x3a, + 0x70, 0x51, 0x38, 0x01, 0x28, 0x00, 0xdc, 0xf9, + 0x21, 0x30, 0x70, 0x39, 0x35, 0x01, 0x98, 0x01, + 0x68, 0x00, 0x78, 0x00, 0x70, 0x78, 0xe0, 0x13, + 0x1c, 0x28, 0x2d, 0x00, 0xdd, 0x05, 0x5c, 0x39, + 0x18, 0x3a, 0x70, 0x91, 0x38, 0x01, 0x28, 0x00, + 0xdc, 0xf9, 0x21, 0x30, 0x70, 0x39, 0x98, 0x01, + 0x68, 0x00, 0x78, 0x00, 0x70, 0x78, 0x20, 0x3c, + 0x70, 0xb8, 0x1e, 0x70, 0x60, 0xe0, 0x35, 0x02, + 0x69, 0x20, 0x28, 0x00, 0xdd, 0x5d, 0xe0, 0x26, + 0x68, 0xa0, 0x19, 0x80, 0x1c, 0x85, 0x2d, 0x12, + 0xdd, 0x41, 0x25, 0x13, 0x1c, 0x38, 0x1c, 0x29, + 0xf7, 0xff, 0xfc, 0x96, 0x28, 0x00, 0xd0, 0x01, + 0x25, 0x14, 0x36, 0x01, 0x1e, 0x69, 0x42, 0xb1, + 0xdd, 0x1a, 0x20, 0x00, 0x2e, 0x00, 0xdb, 0x05, + 0x18, 0x39, 0x78, 0x49, 0x54, 0x39, 0x30, 0x01, + 0x42, 0xb0, 0xdd, 0xf9, 0x98, 0x01, 0x68, 0x00, + 0xe0, 0x01, 0xe0, 0xc1, 0xe0, 0x45, 0x78, 0x00, + 0x19, 0xb9, 0x70, 0x48, 0x68, 0xa0, 0x19, 0x80, + 0x38, 0x11, 0x61, 0x20, 0xd0, 0x35, 0x21, 0x3e, + 0x1c, 0x28, 0x54, 0x39, 0x35, 0x01, 0xe0, 0x30, + 0x20, 0x00, 0x29, 0x00, 0xdd, 0x05, 0x18, 0x3a, + 0x78, 0x52, 0x54, 0x3a, 0x30, 0x01, 0x42, 0x81, + 0xdc, 0xf9, 0x20, 0x3c, 0x19, 0x79, 0x39, 0x20, + 0x77, 0xc8, 0x1b, 0x70, 0x30, 0x02, 0x60, 0xe0, + 0x98, 0x01, 0x68, 0x00, 0x78, 0x01, 0x1c, 0x28, + 0x54, 0x39, 0x68, 0xa0, 0x35, 0x01, 0x28, 0x00, + 0xd0, 0x17, 0x61, 0x20, 0xe7, 0xdf, 0x1c, 0x38, + 0x1c, 0x29, 0xf7, 0xff, 0xfc, 0x55, 0x28, 0x00, + 0xd0, 0x01, 0x35, 0x01, 0x36, 0x01, 0x20, 0x00, + 0x2e, 0x00, 0xdb, 0x05, 0x18, 0x39, 0x78, 0x49, + 0x54, 0x39, 0x30, 0x01, 0x42, 0xb0, 0xdd, 0xf9, + 0x98, 0x01, 0x68, 0x00, 0x78, 0x00, 0x19, 0xb9, + 0x70, 0x48, 0x68, 0xa0, 0x28, 0x00, 0xd1, 0x68, + 0x98, 0x00, 0x09, 0x00, 0xd2, 0x66, 0x3d, 0x01, + 0xe0, 0x75, 0x1c, 0x38, 0xb0, 0x81, 0xf7, 0xff, + 0xfc, 0x74, 0x90, 0x00, 0x68, 0xa0, 0x28, 0x01, + 0xda, 0x01, 0x20, 0x01, 0x60, 0xa0, 0x68, 0xa0, + 0x28, 0x11, 0xdd, 0x01, 0x25, 0x12, 0xe0, 0x00, + 0x1c, 0x45, 0x1c, 0x38, 0x1c, 0x29, 0xf7, 0xff, + 0xfc, 0x27, 0x99, 0x00, 0x18, 0x42, 0x68, 0xa0, + 0x42, 0x90, 0xdd, 0x02, 0x23, 0x04, 0x42, 0xda, + 0xda, 0x02, 0x78, 0x78, 0x70, 0x38, 0xe0, 0x22, + 0x26, 0x66, 0x2a, 0x00, 0xdb, 0x0e, 0x20, 0x00, + 0x2a, 0x00, 0xdb, 0x05, 0x18, 0x39, 0x78, 0x49, + 0x54, 0x39, 0x30, 0x01, 0x42, 0x90, 0xdd, 0xf9, + 0x98, 0x02, 0x68, 0x00, 0x78, 0x00, 0x18, 0xb9, + 0x70, 0x48, 0xe0, 0x14, 0x42, 0x52, 0x1c, 0x28, + 0xd4, 0x04, 0x5c, 0x3b, 0x18, 0x81, 0x54, 0x7b, + 0x38, 0x01, 0xd5, 0xfa, 0x18, 0xad, 0x20, 0x00, + 0x2a, 0x00, 0xdb, 0x04, 0x21, 0x30, 0x54, 0x39, + 0x30, 0x01, 0x42, 0x90, 0xdd, 0xfb, 0x98, 0x02, + 0x68, 0x00, 0x78, 0x00, 0x70, 0x78, 0x98, 0x01, + 0x09, 0x00, 0xd2, 0x1c, 0x20, 0x00, 0x43, 0xc0, + 0x61, 0x20, 0x5d, 0x78, 0x99, 0x02, 0x68, 0x09, + 0x78, 0x09, 0x42, 0x88, 0xd0, 0x0a, 0x19, 0x78, + 0x38, 0x20, 0x7f, 0xc0, 0x28, 0x30, 0xd1, 0x05, + 0x3d, 0x01, 0x19, 0x78, 0x38, 0x20, 0x7f, 0xc0, + 0x28, 0x30, 0xd0, 0xf9, 0x19, 0x78, 0x38, 0x20, + 0x7f, 0xc0, 0x42, 0x88, 0xd1, 0x0c, 0x3d, 0x01, + 0xe0, 0x0a, 0xe0, 0x10, 0xe0, 0x0f, 0x68, 0xa0, + 0x28, 0x11, 0xdd, 0x05, 0x38, 0x11, 0x21, 0x3e, + 0x61, 0x20, 0x1c, 0x28, 0x54, 0x39, 0x35, 0x01, + 0x2e, 0x66, 0xd0, 0x03, 0x1c, 0x38, 0x1c, 0x29, + 0x1e, 0xb3, 0xe0, 0x31, 0xb0, 0x01, 0x1c, 0x28, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0xb0, 0x81, 0xf7, 0xff, 0xfb, 0xf9, + 0x90, 0x00, 0x68, 0xa0, 0x28, 0x11, 0xdd, 0x03, + 0x38, 0x11, 0x61, 0x20, 0x20, 0x11, 0x60, 0xa0, + 0x68, 0xa0, 0x1c, 0x85, 0x1c, 0x38, 0x1c, 0x29, + 0xf7, 0xff, 0xfb, 0xae, 0x99, 0x00, 0x18, 0x42, + 0x78, 0x78, 0x70, 0x38, 0x68, 0xa0, 0x28, 0x00, + 0xd1, 0x04, 0x98, 0x01, 0x09, 0x00, 0xd2, 0x01, + 0x25, 0x01, 0xe0, 0x03, 0x98, 0x02, 0x68, 0x00, + 0x78, 0x00, 0x70, 0x78, 0x69, 0x20, 0x28, 0x00, + 0xdd, 0x03, 0x21, 0x3e, 0x1c, 0x28, 0x54, 0x39, + 0x35, 0x01, 0x1c, 0x38, 0x1c, 0x29, 0x1c, 0x33, + 0xf7, 0xff, 0xfe, 0x26, 0x1c, 0x05, 0xe7, 0xc9, + 0x2d, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x61, 0x4e, 0x00, 0x49, 0x6e, 0x66, 0x00, + 0xff, 0xff, 0xfe, 0xff, 0x2e, 0x08, 0x22, 0x10, + 0xb5, 0xf0, 0x1c, 0x04, 0x25, 0x00, 0x26, 0x00, + 0x1c, 0x18, 0xb0, 0x92, 0x68, 0x13, 0x93, 0x00, + 0x1c, 0x17, 0x43, 0xea, 0x60, 0xfa, 0x61, 0x3a, + 0x1c, 0x1a, 0x23, 0x21, 0x01, 0x1b, 0x40, 0x1a, + 0xd1, 0x01, 0x22, 0x01, 0x60, 0xba, 0x1d, 0xfa, + 0x32, 0x29, 0x29, 0x67, 0xd0, 0x0e, 0xdc, 0x2c, + 0x29, 0x64, 0xd0, 0x5b, 0xdc, 0x06, 0x29, 0x45, + 0xd0, 0x08, 0x29, 0x47, 0xd0, 0x06, 0x29, 0x58, + 0xd1, 0x0c, 0xe0, 0x58, 0x29, 0x65, 0xd0, 0x01, + 0x29, 0x66, 0xd1, 0x07, 0xab, 0x01, 0x1c, 0x08, + 0x1c, 0x19, 0x69, 0xfb, 0x1c, 0x3a, 0xf7, 0xff, + 0xf9, 0x29, 0x1c, 0x05, 0xb0, 0x82, 0x6a, 0xf9, + 0x91, 0x00, 0x23, 0x01, 0x02, 0x5b, 0x98, 0x02, + 0x40, 0x18, 0x90, 0x0d, 0xd0, 0x6c, 0x21, 0x00, + 0x91, 0x01, 0x68, 0xf8, 0x28, 0x00, 0xdd, 0x01, + 0x1e, 0x41, 0x91, 0x01, 0x69, 0x38, 0x28, 0x00, + 0xdd, 0x63, 0x99, 0x01, 0x18, 0x40, 0x1e, 0x41, + 0xe0, 0xca, 0x29, 0x70, 0xd0, 0x33, 0xdc, 0x2e, + 0x29, 0x69, 0xd0, 0x2b, 0x29, 0x6f, 0xd1, 0xe1, + 0x99, 0x00, 0x09, 0xc9, 0xd3, 0x63, 0xb0, 0x82, + 0x68, 0x10, 0x90, 0x00, 0x68, 0x51, 0x91, 0x01, + 0xa3, 0xc0, 0x93, 0x12, 0xcb, 0x0c, 0xf0, 0x01, + 0xfd, 0x2d, 0x28, 0x00, 0xd0, 0x18, 0x98, 0x00, + 0x99, 0x01, 0xf7, 0xff, 0xf9, 0x4d, 0x07, 0x40, + 0x0f, 0x40, 0x6a, 0xb9, 0x5c, 0x09, 0x1c, 0x28, + 0xaa, 0x03, 0x54, 0x11, 0x22, 0x03, 0x98, 0x00, + 0x99, 0x01, 0x35, 0x01, 0xf7, 0xff, 0xf9, 0x2c, + 0x90, 0x00, 0x91, 0x01, 0x9b, 0x12, 0xcb, 0x0c, + 0xf0, 0x01, 0xfd, 0x14, 0x28, 0x00, 0xd1, 0xe6, + 0xb0, 0x02, 0xe0, 0x49, 0xe0, 0x4f, 0x29, 0x75, + 0xd0, 0x4d, 0x29, 0x78, 0xd1, 0xb2, 0x99, 0x00, + 0x09, 0xc9, 0xd3, 0x27, 0xb0, 0x82, 0x68, 0x10, + 0x90, 0x00, 0x68, 0x51, 0x91, 0x01, 0xa3, 0xa9, + 0x93, 0x13, 0xcb, 0x0c, 0xf0, 0x01, 0xfc, 0xfe, + 0x28, 0x00, 0xd0, 0x71, 0x98, 0x00, 0x99, 0x01, + 0xf7, 0xff, 0xf9, 0x1e, 0x07, 0x00, 0x0f, 0x00, + 0x6a, 0xb9, 0x5c, 0x09, 0x1c, 0x28, 0xaa, 0x03, + 0x54, 0x11, 0x22, 0x04, 0x98, 0x00, 0x99, 0x01, + 0x35, 0x01, 0xf7, 0xff, 0xf8, 0xfd, 0x90, 0x00, + 0x91, 0x01, 0x9b, 0x13, 0xcb, 0x0c, 0xf0, 0x01, + 0xfc, 0xe5, 0x28, 0x00, 0xd1, 0xe6, 0xe0, 0x57, + 0xe0, 0x65, 0xe0, 0x6a, 0x28, 0x00, 0xd0, 0x85, + 0x07, 0x02, 0x0f, 0x12, 0x6a, 0xb9, 0x5c, 0x8a, + 0x1c, 0x29, 0xab, 0x01, 0x54, 0x5a, 0x35, 0x01, + 0x09, 0x00, 0xd1, 0xf5, 0xe7, 0x7a, 0xe7, 0xff, + 0x28, 0x00, 0xd0, 0x09, 0x07, 0x41, 0x0f, 0x49, + 0x1d, 0xca, 0x32, 0x29, 0x1c, 0x29, 0xab, 0x01, + 0x54, 0x5a, 0x35, 0x01, 0x08, 0xc0, 0xd1, 0xf5, + 0x98, 0x00, 0x09, 0x00, 0xd3, 0xee, 0x68, 0xb8, + 0x38, 0x01, 0x60, 0xb8, 0xe7, 0x66, 0x99, 0x00, + 0x09, 0xc9, 0xd3, 0x33, 0xb0, 0x82, 0x68, 0x10, + 0x90, 0x00, 0x68, 0x51, 0x91, 0x01, 0xa3, 0x83, + 0x93, 0x11, 0xcb, 0x0c, 0xf0, 0x01, 0xfc, 0xb2, + 0x28, 0x00, 0xd0, 0x25, 0xa3, 0x81, 0x93, 0x10, + 0xa3, 0x82, 0x93, 0x0f, 0xa3, 0x7f, 0x93, 0x0e, + 0x98, 0x00, 0x99, 0x01, 0x9b, 0x10, 0xcb, 0x0c, + 0xf0, 0x01, 0xfc, 0xac, 0x1c, 0x19, 0x1c, 0x10, + 0x9b, 0x0f, 0xcb, 0x0c, 0xf0, 0x01, 0xfc, 0xe8, + 0xf7, 0xff, 0xf8, 0xc2, 0x1c, 0x29, 0xaa, 0x03, + 0x54, 0x50, 0x98, 0x00, 0x99, 0x01, 0x9b, 0x0e, + 0xcb, 0x0c, 0x35, 0x01, 0xf0, 0x01, 0xfc, 0x9a, + 0x90, 0x00, 0x91, 0x01, 0x9b, 0x11, 0xcb, 0x0c, + 0xf0, 0x01, 0xfc, 0x8c, 0x28, 0x00, 0xd1, 0xdf, + 0xb0, 0x02, 0xe7, 0x2f, 0x28, 0x00, 0xd0, 0xb1, + 0xf0, 0x01, 0xfc, 0xd2, 0x1d, 0xca, 0x32, 0x29, + 0x1c, 0x29, 0xab, 0x01, 0x54, 0x5a, 0x35, 0x01, + 0x28, 0x00, 0xd1, 0xf5, 0xe7, 0x22, 0x68, 0xb8, + 0x1b, 0x41, 0x91, 0x01, 0xd5, 0x01, 0x21, 0x00, + 0x91, 0x01, 0x68, 0x78, 0xf7, 0xff, 0xf9, 0x0a, + 0x99, 0x01, 0x19, 0x49, 0x18, 0x40, 0x99, 0x00, + 0x1a, 0x08, 0x90, 0x00, 0x23, 0xff, 0x33, 0x01, + 0x98, 0x02, 0x40, 0x18, 0x90, 0x0c, 0xd1, 0x1b, + 0x98, 0x02, 0x08, 0x40, 0xd2, 0x18, 0xb0, 0x81, + 0x98, 0x0d, 0x28, 0x00, 0xd0, 0x01, 0x20, 0x30, + 0xe0, 0x00, 0x20, 0x20, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x00, 0x98, 0x01, 0x38, 0x01, 0x90, 0x01, + 0xd4, 0x09, 0x98, 0x00, 0x6a, 0x3a, 0x1c, 0x21, + 0x36, 0x01, 0xf7, 0xff, 0xf8, 0x1d, 0x98, 0x01, + 0x38, 0x01, 0x90, 0x01, 0xd5, 0xf5, 0xb0, 0x01, + 0x68, 0x79, 0x78, 0x08, 0x31, 0x01, 0xb0, 0x81, + 0x91, 0x00, 0x28, 0x00, 0xd0, 0x0a, 0x6a, 0x3a, + 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0x0d, 0x99, 0x00, + 0x78, 0x08, 0x31, 0x01, 0x91, 0x00, 0x36, 0x01, + 0x28, 0x00, 0xd1, 0xf4, 0xb0, 0x01, 0x98, 0x02, + 0x07, 0xc0, 0x0f, 0xc0, 0x90, 0x0b, 0xd1, 0x18, + 0xb0, 0x81, 0x98, 0x0d, 0x28, 0x00, 0xd0, 0x01, + 0x20, 0x30, 0xe0, 0x00, 0x20, 0x20, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x00, 0x98, 0x01, 0x38, 0x01, + 0x90, 0x01, 0xd4, 0x09, 0x98, 0x00, 0x6a, 0x3a, + 0x1c, 0x21, 0x36, 0x01, 0xf7, 0xfe, 0xff, 0xec, + 0x98, 0x01, 0x38, 0x01, 0x90, 0x01, 0xd5, 0xf5, + 0xb0, 0x01, 0x98, 0x0d, 0x28, 0x00, 0xd0, 0x35, + 0x21, 0x00, 0xb0, 0x81, 0x91, 0x00, 0x2d, 0x00, + 0xdd, 0x2e, 0xa8, 0x04, 0x99, 0x00, 0x5c, 0x40, + 0x28, 0x3c, 0xd0, 0x10, 0x28, 0x3e, 0xd1, 0x1d, + 0x69, 0x38, 0x38, 0x01, 0x61, 0x38, 0xd4, 0x1e, + 0x20, 0x30, 0x6a, 0x3a, 0x1c, 0x21, 0x36, 0x01, + 0xf7, 0xfe, 0xff, 0xce, 0x69, 0x38, 0x38, 0x01, + 0x61, 0x38, 0xd5, 0xf5, 0xe0, 0x13, 0x68, 0xf8, + 0x38, 0x01, 0x60, 0xf8, 0xd4, 0x0f, 0x20, 0x30, + 0x6a, 0x3a, 0x1c, 0x21, 0x36, 0x01, 0xf7, 0xfe, + 0xff, 0xbf, 0x68, 0xf8, 0x38, 0x01, 0x60, 0xf8, + 0xd5, 0xf5, 0xe0, 0x04, 0x6a, 0x3a, 0x1c, 0x21, + 0xf7, 0xfe, 0xff, 0xb6, 0x36, 0x01, 0x99, 0x00, + 0x31, 0x01, 0x91, 0x00, 0x42, 0xa9, 0xdb, 0xd0, + 0xb0, 0x01, 0xe0, 0x1c, 0x99, 0x01, 0x1e, 0x48, + 0x90, 0x01, 0xd4, 0x09, 0x20, 0x30, 0x6a, 0x3a, + 0x1c, 0x21, 0x36, 0x01, 0xf7, 0xfe, 0xff, 0xa4, + 0x98, 0x01, 0x38, 0x01, 0x90, 0x01, 0xd5, 0xf5, + 0x19, 0x76, 0x1c, 0x28, 0x3d, 0x01, 0x28, 0x00, + 0xdd, 0x09, 0xa8, 0x03, 0x5d, 0x40, 0x6a, 0x3a, + 0x1c, 0x21, 0xf7, 0xfe, 0xff, 0x95, 0x1c, 0x28, + 0x3d, 0x01, 0x28, 0x00, 0xdc, 0xf5, 0x98, 0x0b, + 0x28, 0x00, 0xd0, 0x0a, 0x98, 0x00, 0x1e, 0x45, + 0xd4, 0x07, 0x20, 0x20, 0x6a, 0x3a, 0x1c, 0x21, + 0x36, 0x01, 0xf7, 0xfe, 0xff, 0x85, 0x3d, 0x01, + 0xd5, 0xf7, 0x1c, 0x30, 0xb0, 0x14, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x00, 0x00, 0xb5, 0xff, 0x20, 0x00, + 0xb0, 0x88, 0x90, 0x00, 0x99, 0x09, 0x78, 0x08, + 0x31, 0x01, 0x91, 0x09, 0x1c, 0x1c, 0x1c, 0x17, + 0x28, 0x00, 0xd0, 0x74, 0xa3, 0xf4, 0x93, 0x07, + 0x1d, 0xe2, 0x32, 0x0d, 0x92, 0x06, 0x1d, 0xe1, + 0x31, 0x29, 0x91, 0x05, 0x28, 0x25, 0xd0, 0x07, + 0x99, 0x08, 0x6a, 0x22, 0xf7, 0xfe, 0xff, 0x58, + 0x98, 0x00, 0x30, 0x01, 0x90, 0x00, 0xe2, 0xc4, + 0x25, 0x00, 0x23, 0x00, 0xb0, 0x82, 0x93, 0x00, + 0x20, 0x00, 0x60, 0xa0, 0x99, 0x0b, 0x78, 0x0e, + 0x31, 0x01, 0x91, 0x0b, 0x2e, 0x2b, 0xd0, 0x16, + 0xdc, 0x06, 0x2e, 0x20, 0xd0, 0x16, 0x2e, 0x23, + 0xd1, 0x17, 0x23, 0x08, 0x43, 0x1d, 0xe7, 0xf1, + 0x2e, 0x2d, 0xd0, 0x05, 0x2e, 0x30, 0xd1, 0x10, + 0x23, 0xff, 0x33, 0x01, 0x43, 0x1d, 0xe7, 0xe9, + 0x23, 0xff, 0x33, 0x01, 0x43, 0x9d, 0x1c, 0x28, + 0x25, 0x01, 0x43, 0x05, 0xe7, 0xe2, 0x23, 0x02, + 0x43, 0x1d, 0xe7, 0xdf, 0x23, 0x04, 0x43, 0x1d, + 0xe7, 0xdc, 0x20, 0x00, 0x2e, 0x2a, 0xd1, 0x11, + 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, + 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc0, + 0x28, 0x00, 0xda, 0x02, 0x42, 0x40, 0x23, 0x01, + 0x40, 0x5d, 0x99, 0x0b, 0x78, 0x0e, 0x31, 0x01, + 0x91, 0x0b, 0xe0, 0x0f, 0x49, 0xce, 0x5d, 0x8a, + 0x09, 0x92, 0xd3, 0x0b, 0x00, 0x83, 0x18, 0x18, + 0x00, 0x40, 0x19, 0x80, 0x9a, 0x0b, 0x78, 0x16, + 0x32, 0x01, 0x92, 0x0b, 0x5d, 0x8a, 0x38, 0x30, + 0x09, 0x92, 0xd2, 0xf3, 0x28, 0x00, 0xda, 0x00, + 0x20, 0x00, 0x90, 0x01, 0x2e, 0x2e, 0xd1, 0x2a, + 0x20, 0x00, 0x99, 0x0b, 0x78, 0x0e, 0x31, 0x01, + 0x91, 0x0b, 0x2e, 0x2a, 0xd1, 0x0e, 0x68, 0x38, + 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, + 0x60, 0x38, 0x38, 0x80, 0xe0, 0x00, 0xe2, 0x67, + 0x6f, 0xc0, 0x99, 0x0b, 0x78, 0x0e, 0x31, 0x01, + 0x91, 0x0b, 0xe0, 0x0f, 0x49, 0xb8, 0x5d, 0x8a, + 0x09, 0x92, 0xd3, 0x0b, 0x00, 0x83, 0x18, 0x18, + 0x00, 0x40, 0x19, 0x80, 0x9a, 0x0b, 0x78, 0x16, + 0x32, 0x01, 0x92, 0x0b, 0x5d, 0x8a, 0x38, 0x30, + 0x09, 0x92, 0xd2, 0xf3, 0x28, 0x00, 0xdb, 0x02, + 0x23, 0x10, 0x43, 0x1d, 0x60, 0xa0, 0x2e, 0x6c, + 0xd0, 0x01, 0x2e, 0x4c, 0xd1, 0x0d, 0x99, 0x0b, + 0x78, 0x0e, 0x31, 0x01, 0x91, 0x0b, 0x2e, 0x6c, + 0xd0, 0x01, 0x2e, 0x4c, 0xd1, 0x02, 0x23, 0x40, + 0x43, 0x1d, 0xe0, 0x06, 0x23, 0x20, 0x43, 0x1d, + 0xe0, 0x07, 0x2e, 0x68, 0xd1, 0x05, 0x23, 0x80, + 0x43, 0x1d, 0x99, 0x0b, 0x78, 0x0e, 0x31, 0x01, + 0x91, 0x0b, 0x2e, 0x67, 0xd0, 0x63, 0xdc, 0x12, + 0x2e, 0x63, 0xd0, 0x21, 0xdc, 0x08, 0x2e, 0x00, + 0xd0, 0x5e, 0x2e, 0x45, 0xd0, 0x5b, 0x2e, 0x47, + 0xd0, 0x59, 0x2e, 0x58, 0xd0, 0x59, 0xe0, 0x1f, + 0x2e, 0x64, 0xd0, 0x57, 0x2e, 0x65, 0xd0, 0x52, + 0x2e, 0x66, 0xd0, 0x50, 0xe0, 0x18, 0x2e, 0x70, + 0xd0, 0x55, 0xdc, 0x06, 0x2e, 0x69, 0xd0, 0x4d, + 0x2e, 0x6e, 0xd0, 0x51, 0x2e, 0x6f, 0xd0, 0x5c, + 0xe0, 0x0e, 0x2e, 0x73, 0xd0, 0x5a, 0x2e, 0x75, + 0xd0, 0x59, 0x2e, 0x78, 0xd0, 0x58, 0xe0, 0x07, + 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, + 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc6, + 0x98, 0x01, 0x38, 0x01, 0x90, 0x01, 0x07, 0xe8, + 0x0f, 0xc0, 0x90, 0x06, 0xd1, 0x16, 0x0a, 0x68, + 0xd3, 0x01, 0x20, 0x30, 0xe0, 0x00, 0x20, 0x20, + 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x01, 0x38, 0x01, + 0x90, 0x01, 0xd4, 0x0b, 0x98, 0x02, 0x30, 0x01, + 0x90, 0x02, 0x99, 0x0a, 0x6a, 0x22, 0x1c, 0x28, + 0xf7, 0xfe, 0xfe, 0x72, 0x98, 0x01, 0x38, 0x01, + 0x90, 0x01, 0xd5, 0xf3, 0x99, 0x0a, 0x6a, 0x22, + 0x1c, 0x30, 0xf7, 0xfe, 0xfe, 0x69, 0x98, 0x02, + 0x30, 0x01, 0x90, 0x02, 0x98, 0x06, 0x28, 0x00, + 0xd0, 0x52, 0x98, 0x01, 0x1e, 0x45, 0xd4, 0x58, + 0x98, 0x02, 0x30, 0x01, 0x90, 0x02, 0x20, 0x20, + 0x99, 0x0a, 0x6a, 0x22, 0xf7, 0xfe, 0xfe, 0x58, + 0x3d, 0x01, 0xd5, 0xf5, 0xe1, 0xc4, 0xe1, 0xa0, + 0xe0, 0x01, 0xe0, 0x8e, 0xe1, 0x53, 0x99, 0x0b, + 0x39, 0x01, 0x91, 0x0b, 0xe1, 0xbc, 0xe0, 0xed, + 0x0a, 0x28, 0xd3, 0x0e, 0x98, 0x02, 0x68, 0x39, + 0x31, 0x03, 0x08, 0x89, 0x00, 0x89, 0x31, 0x04, + 0x60, 0x39, 0x39, 0x80, 0x6f, 0xc9, 0x80, 0x08, + 0xe1, 0xae, 0xe0, 0xf5, 0xe0, 0x1d, 0xe1, 0x1b, + 0xe0, 0xa0, 0x09, 0xe8, 0xd3, 0x0c, 0x98, 0x02, + 0x68, 0x39, 0x31, 0x03, 0x08, 0x89, 0x00, 0x89, + 0x31, 0x04, 0x60, 0x39, 0x39, 0x80, 0x6f, 0xcd, + 0xf0, 0x01, 0xfa, 0xda, 0xc5, 0x03, 0xe1, 0x9b, + 0x20, 0x20, 0x40, 0x28, 0x99, 0x02, 0x68, 0x38, + 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, + 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc0, 0x60, 0x01, + 0xe1, 0x8e, 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, + 0x00, 0x80, 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, + 0x6f, 0xc0, 0xb0, 0x81, 0x90, 0x00, 0x09, 0x68, + 0xd3, 0x0c, 0x26, 0x00, 0x68, 0xa0, 0xe0, 0x01, + 0xe1, 0x7e, 0x36, 0x01, 0x42, 0x86, 0xda, 0x09, + 0x99, 0x00, 0x5d, 0x89, 0x29, 0x00, 0xd1, 0xf8, + 0xe0, 0x04, 0xe1, 0x75, 0x98, 0x00, 0xf7, 0xfe, + 0xfe, 0xcd, 0x1c, 0x06, 0x98, 0x02, 0x1b, 0x80, + 0x90, 0x02, 0x07, 0xe8, 0x0f, 0xc0, 0x90, 0x06, + 0xd1, 0x16, 0x0a, 0x68, 0xd3, 0x01, 0x20, 0x30, + 0xe0, 0x00, 0x20, 0x20, 0x06, 0x05, 0x0e, 0x2d, + 0x98, 0x02, 0x38, 0x01, 0x90, 0x02, 0xd4, 0x0b, + 0x98, 0x03, 0x30, 0x01, 0x90, 0x03, 0x99, 0x0b, + 0x6a, 0x22, 0x1c, 0x28, 0xf7, 0xfe, 0xfd, 0xe8, + 0x98, 0x02, 0x38, 0x01, 0x90, 0x02, 0xd5, 0xf3, + 0x25, 0x00, 0x2e, 0x00, 0xdd, 0x08, 0x99, 0x00, + 0x5d, 0x48, 0x99, 0x0b, 0x6a, 0x22, 0xf7, 0xfe, + 0xfd, 0xdb, 0x35, 0x01, 0x42, 0xb5, 0xdb, 0xf6, + 0x98, 0x03, 0x19, 0x80, 0x90, 0x03, 0x98, 0x06, + 0x28, 0x00, 0xd0, 0x0c, 0x98, 0x02, 0x1e, 0x45, + 0xd4, 0x09, 0x98, 0x03, 0x30, 0x01, 0x90, 0x03, + 0x20, 0x20, 0x99, 0x0b, 0x6a, 0x22, 0xf7, 0xfe, + 0xfd, 0xc7, 0x3d, 0x01, 0xd5, 0xf5, 0xb0, 0x01, + 0xe1, 0x32, 0x09, 0xe8, 0xd3, 0x0c, 0x68, 0x38, + 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x08, + 0x1f, 0xc1, 0x39, 0x01, 0x60, 0x38, 0x22, 0x08, + 0x98, 0x07, 0xf7, 0xfe, 0xfe, 0x0f, 0xe0, 0x08, + 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, + 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc3, + 0x93, 0x00, 0x0a, 0x28, 0xd3, 0x03, 0x9b, 0x00, + 0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x00, 0xa0, 0x17, + 0x62, 0xa0, 0x09, 0x28, 0xd3, 0x01, 0xa0, 0x1a, + 0xe0, 0x00, 0xa0, 0x18, 0x60, 0x60, 0x09, 0x68, + 0xd3, 0x61, 0xe0, 0xe3, 0x09, 0xe8, 0xd3, 0x0c, + 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, + 0x30, 0x08, 0x1f, 0xc1, 0x39, 0x01, 0x60, 0x38, + 0x22, 0x08, 0x98, 0x07, 0xf7, 0xfe, 0xfd, 0xe6, + 0xe0, 0x08, 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, + 0x00, 0x80, 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, + 0x6f, 0xc3, 0x93, 0x00, 0x0a, 0x28, 0xd3, 0x16, + 0x9b, 0x00, 0x04, 0x1b, 0x0c, 0x1b, 0xe0, 0x11, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x22, 0x44, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x58, 0x00, 0x00, 0x93, 0x00, 0xa0, 0x78, + 0x62, 0xa0, 0x09, 0x28, 0xd3, 0x01, 0xa0, 0x7b, + 0xe0, 0x00, 0xa0, 0x79, 0x60, 0x60, 0x09, 0x68, + 0xd3, 0x25, 0xe0, 0xa7, 0x68, 0x38, 0x30, 0x03, + 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, 0x60, 0x38, + 0x38, 0x80, 0x6f, 0xc3, 0x93, 0x00, 0xa0, 0x6e, + 0x62, 0xa0, 0x09, 0x28, 0xd3, 0x01, 0xa0, 0x72, + 0xe0, 0x00, 0xa0, 0x6f, 0x60, 0x60, 0x20, 0x08, + 0x23, 0x10, 0x43, 0x1d, 0x60, 0xa0, 0xe0, 0x7e, + 0x09, 0xe8, 0xd3, 0x0d, 0x68, 0x38, 0x30, 0x03, + 0x08, 0x80, 0x00, 0x80, 0x30, 0x08, 0x1f, 0xc1, + 0x39, 0x01, 0x60, 0x38, 0x22, 0x08, 0x98, 0x07, + 0xf7, 0xfe, 0xfd, 0x94, 0xe0, 0x09, 0xe0, 0x9b, + 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, + 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc3, + 0x93, 0x00, 0x0a, 0x28, 0xd3, 0x03, 0x9b, 0x00, + 0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x00, 0x09, 0x28, + 0xd3, 0x01, 0xa0, 0x5e, 0xe0, 0x00, 0xa0, 0x5a, + 0x60, 0x60, 0x09, 0x68, 0xd3, 0x57, 0xe0, 0x69, + 0x09, 0xe8, 0xd3, 0x0c, 0x68, 0x38, 0x30, 0x03, + 0x08, 0x80, 0x00, 0x80, 0x30, 0x08, 0x1f, 0xc1, + 0x39, 0x01, 0x60, 0x38, 0x22, 0x08, 0x98, 0x07, + 0xf7, 0xfe, 0xfd, 0x6c, 0xe0, 0x08, 0x68, 0x38, + 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, + 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc3, 0x93, 0x00, + 0x0a, 0x28, 0xd3, 0x03, 0x9b, 0x00, 0x04, 0x1b, + 0x0c, 0x1b, 0x93, 0x00, 0xa0, 0x48, 0x60, 0x60, + 0x09, 0x68, 0xd3, 0x34, 0xe0, 0x46, 0x09, 0xe8, + 0xd3, 0x21, 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, + 0x00, 0x80, 0x30, 0x08, 0x1f, 0xc1, 0x39, 0x01, + 0x60, 0x38, 0x22, 0x08, 0x98, 0x07, 0xf7, 0xfe, + 0xfd, 0x49, 0x99, 0x07, 0x9b, 0x09, 0x68, 0x08, + 0x90, 0x04, 0x68, 0x49, 0x91, 0x03, 0xcb, 0x0c, + 0xf0, 0x01, 0xf9, 0x94, 0x28, 0x00, 0xd0, 0x08, + 0x98, 0x04, 0x99, 0x03, 0xf0, 0x01, 0xf9, 0x98, + 0x9a, 0x07, 0xc2, 0x03, 0x20, 0x00, 0x43, 0xc0, + 0xe0, 0x14, 0x20, 0x00, 0xe0, 0x12, 0x68, 0x38, + 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, + 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc0, 0x0a, 0x29, + 0xd3, 0x01, 0x04, 0x00, 0x14, 0x00, 0x28, 0x00, + 0xda, 0x02, 0x42, 0x43, 0xe0, 0x01, 0xe0, 0x2b, + 0x1c, 0x03, 0x93, 0x00, 0x28, 0x00, 0xda, 0x01, + 0xa0, 0x2d, 0xe0, 0x08, 0x08, 0xa8, 0xd3, 0x01, + 0xa0, 0x2c, 0xe0, 0x04, 0x08, 0xe8, 0xd3, 0x01, + 0xa0, 0x2b, 0xe0, 0x00, 0xa0, 0x24, 0x60, 0x60, + 0x09, 0x68, 0xd3, 0x19, 0x4b, 0x29, 0x40, 0x1d, + 0xe0, 0x16, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x1d, + 0x09, 0x68, 0xd2, 0x01, 0x20, 0x06, 0x60, 0xa0, + 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, + 0x30, 0x08, 0x1f, 0xc1, 0x39, 0x01, 0x60, 0x38, + 0x22, 0x08, 0x98, 0x08, 0xf7, 0xfe, 0xfc, 0xfa, + 0x20, 0x00, 0x23, 0x00, 0x60, 0x60, 0x93, 0x00, + 0x98, 0x01, 0x62, 0xe0, 0x60, 0x25, 0x98, 0x0a, + 0x9b, 0x00, 0x1c, 0x31, 0x1c, 0x22, 0xf7, 0xff, + 0xfb, 0x3f, 0x99, 0x02, 0x18, 0x40, 0x90, 0x02, + 0xb0, 0x02, 0x99, 0x09, 0x78, 0x08, 0x31, 0x01, + 0x91, 0x09, 0x28, 0x00, 0xd0, 0x00, 0xe5, 0x29, + 0x98, 0x08, 0x6a, 0x61, 0xf7, 0xfe, 0xfc, 0x82, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0x43, 0xc0, + 0xe0, 0x00, 0x98, 0x00, 0xb0, 0x08, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x2d, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xff, + 0xe3, 0x10, 0x06, 0x01, 0x13, 0xa0, 0x00, 0x00, + 0x11, 0x2f, 0xff, 0x1e, 0xea, 0x00, 0x00, 0x0a, + 0xe3, 0x12, 0x07, 0x02, 0x0a, 0x00, 0x00, 0x08, + 0xe1, 0x5c, 0x00, 0x80, 0x83, 0xa0, 0x00, 0x00, + 0x81, 0x2f, 0xff, 0x1e, 0x03, 0x51, 0x00, 0x00, + 0x03, 0xa0, 0x00, 0x00, 0x01, 0x2f, 0xff, 0x1e, + 0xe3, 0x10, 0x07, 0x02, 0x13, 0xa0, 0x00, 0x00, + 0x11, 0x2f, 0xff, 0x1e, 0xe3, 0xa0, 0x35, 0x06, + 0xea, 0x00, 0x07, 0x2e, 0xe1, 0x2f, 0xff, 0x1f, + 0xea, 0x00, 0x00, 0x3e, 0xe5, 0x9f, 0x04, 0x5c, + 0xe3, 0x50, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x02, + 0xe3, 0xa0, 0x00, 0x20, 0xe3, 0xa0, 0x10, 0x01, + 0xef, 0x12, 0x34, 0x56, 0xe5, 0x9f, 0x04, 0x48, + 0xe3, 0x50, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x05, + 0xe5, 0x90, 0x10, 0x00, 0xe5, 0x9f, 0x04, 0x3c, + 0xe5, 0x90, 0x30, 0x00, 0xe5, 0x9f, 0x04, 0x38, + 0xe5, 0x90, 0xd0, 0x00, 0xea, 0x00, 0x00, 0x0b, + 0xe3, 0xa0, 0x00, 0x16, 0xe5, 0x9f, 0x44, 0x18, + 0xe2, 0x84, 0x20, 0xa8, 0xe2, 0x84, 0x10, 0xa4, + 0xe5, 0x81, 0x20, 0x00, 0xef, 0x12, 0x34, 0x56, + 0xe2, 0x84, 0x00, 0xa8, 0xe5, 0x90, 0xd0, 0x08, + 0xe5, 0x90, 0x30, 0x04, 0xe5, 0x90, 0x10, 0x00, + 0xe3, 0x51, 0x00, 0x00, 0x05, 0x9f, 0x14, 0x04, + 0xe2, 0x8f, 0x00, 0x10, 0xeb, 0x00, 0x00, 0x36, + 0xe5, 0x9f, 0x03, 0xfc, 0xe5, 0x9f, 0x33, 0xfc, + 0xeb, 0x00, 0x00, 0x12, 0xea, 0x00, 0x00, 0x4e, + 0x2e, 0x00, 0x04, 0x04, 0x2e, 0x03, 0xa9, 0xd0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe9, 0x2d, 0x40, 0x00, 0xe3, 0x1c, 0x00, 0x01, + 0x1a, 0x00, 0x00, 0x03, 0xe1, 0xa0, 0xe0, 0x0f, + 0xe1, 0x2f, 0xff, 0x1c, 0xe8, 0xbd, 0x40, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x8f, 0xe0, 0x01, + 0xe1, 0x2f, 0xff, 0x1c, 0x47, 0x78, 0x00, 0x00, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x1c, 0x02, 0x1c, 0x13, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x40, 0x00, 0xe3, 0x13, 0x00, 0x01, + 0x1a, 0x00, 0x00, 0x03, 0xe1, 0xa0, 0xe0, 0x0f, + 0xe1, 0x2f, 0xff, 0x13, 0xe8, 0xbd, 0x40, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x8f, 0xe0, 0x01, + 0xe1, 0x2f, 0xff, 0x13, 0x47, 0x78, 0x00, 0x00, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe5, 0x9f, 0xc0, 0x44, 0xe8, 0x8c, 0xff, 0xff, + 0xe2, 0x8f, 0x00, 0x00, 0xea, 0x00, 0x0e, 0xf4, + 0x00, 0x80, 0x0e, 0x09, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x63, 0x61, + 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x72, + 0x75, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x20, + 0x54, 0x68, 0x75, 0x6d, 0x62, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x00, 0x00, 0x2e, 0x08, 0x21, 0xd0, + 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0x73, 0x08, + 0xe5, 0x87, 0x00, 0x00, 0xe2, 0x8f, 0x50, 0xc9, + 0xe2, 0x85, 0x5c, 0x02, 0xe5, 0x87, 0x50, 0x10, + 0xe2, 0x8f, 0x50, 0xe9, 0xe2, 0x85, 0x5c, 0x02, + 0xe5, 0x87, 0x50, 0x14, 0xe1, 0xa0, 0x80, 0x0e, + 0xe2, 0x87, 0x00, 0x04, 0xeb, 0x00, 0x04, 0x1d, + 0xe9, 0x2d, 0x01, 0x00, 0xe3, 0xa0, 0x00, 0x00, + 0xe5, 0xc7, 0x00, 0x2c, 0xe2, 0x87, 0x00, 0x04, + 0xeb, 0x00, 0x00, 0xce, 0xe3, 0xa0, 0x40, 0x00, + 0xe2, 0x8d, 0x00, 0x04, 0xe5, 0x97, 0x10, 0x00, + 0xe3, 0xa0, 0x30, 0x00, 0xe5, 0xc7, 0x30, 0x2e, + 0xe2, 0x81, 0x30, 0x08, 0xe8, 0x91, 0x00, 0x06, + 0xe5, 0x9f, 0xc2, 0xcc, 0xeb, 0xff, 0xff, 0xb7, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x80, 0x01, + 0xea, 0x00, 0x00, 0x01, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xa0, 0x70, 0x00, + 0xeb, 0x00, 0x04, 0x15, 0xe1, 0xa0, 0x00, 0x08, + 0xeb, 0x00, 0x00, 0x0d, 0xe1, 0xa0, 0x20, 0x07, + 0xe3, 0x52, 0x00, 0x00, 0x12, 0x8f, 0x00, 0x08, + 0x15, 0x9f, 0x10, 0x00, 0xeb, 0x00, 0x0e, 0xb5, + 0x41, 0x42, 0x45, 0x58, 0x00, 0x80, 0x0e, 0x06, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x6f, 0x64, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x20, + 0x6c, 0x61, 0x72, 0x67, 0x65, 0x00, 0x00, 0x00, + 0xe3, 0xa0, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, + 0xe5, 0x9f, 0x32, 0x60, 0xeb, 0xff, 0xff, 0xa9, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc2, 0x28, + 0xe5, 0xdc, 0x00, 0x2c, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x30, 0x00, 0xe5, 0x9f, 0x12, 0x14, + 0xe4, 0x81, 0xf0, 0x04, 0xe8, 0xb3, 0x00, 0x04, + 0xe8, 0xa1, 0x00, 0x04, 0xe4, 0xd3, 0x20, 0x01, + 0xe4, 0xc1, 0x20, 0x01, 0xe3, 0x52, 0x00, 0x00, + 0x1a, 0xff, 0xff, 0xfb, 0xe1, 0xa0, 0xf0, 0x0e, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0xa0, 0x80, 0x01, + 0xeb, 0xff, 0xff, 0xf2, 0xe5, 0x9f, 0x71, 0xe8, + 0xe5, 0xd7, 0x20, 0x2f, 0xe3, 0x52, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x2c, 0xe3, 0xa0, 0x20, 0x01, + 0xe5, 0xc7, 0x20, 0x2f, 0xeb, 0x00, 0x00, 0x3b, + 0xe1, 0xa0, 0x10, 0x08, 0xeb, 0x00, 0x03, 0xde, + 0xe3, 0x50, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x1b, + 0xe2, 0x88, 0xb0, 0x40, 0xe9, 0x3b, 0x01, 0xef, + 0xe9, 0x2c, 0x01, 0xef, 0xe9, 0x3b, 0x01, 0xef, + 0xe9, 0x2c, 0x01, 0xef, 0xe5, 0x9f, 0x71, 0xa8, + 0xe5, 0x97, 0x40, 0xa0, 0xe3, 0x84, 0x40, 0x80, + 0xe1, 0x21, 0xf0, 0x04, 0xe1, 0xa0, 0xd0, 0x0c, + 0xe1, 0xa0, 0xb0, 0x04, 0xe5, 0x9f, 0x01, 0x8c, + 0xe5, 0x90, 0x00, 0x04, 0xe1, 0xa0, 0x10, 0x0d, + 0xeb, 0x00, 0x03, 0xfe, 0xe3, 0xa0, 0x10, 0x00, + 0xe5, 0xc7, 0x10, 0x2f, 0xe1, 0xa0, 0x10, 0x0d, + 0xe3, 0x54, 0x00, 0x10, 0x1a, 0x00, 0x00, 0x02, + 0xe3, 0xa0, 0x00, 0x17, 0xef, 0x12, 0x34, 0x56, + 0xe3, 0x21, 0xf0, 0x93, 0xe1, 0xa0, 0x00, 0x00, + 0xe2, 0x81, 0xe0, 0x3c, 0xe9, 0x5e, 0x7f, 0xff, + 0xe1, 0xa0, 0x00, 0x00, 0xe8, 0xde, 0x80, 0x00, + 0xe2, 0x8f, 0x00, 0x00, 0xea, 0x00, 0x0e, 0x72, + 0x00, 0x80, 0x0e, 0x07, 0x4e, 0x6f, 0x20, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x54, 0x72, 0x61, 0x70, 0x20, 0x48, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00, 0x00, 0x00, + 0xe2, 0x8f, 0x00, 0x00, 0xea, 0x00, 0x0e, 0x68, + 0x00, 0x80, 0x0e, 0x00, 0x52, 0x65, 0x63, 0x75, + 0x72, 0x73, 0x69, 0x76, 0x65, 0x20, 0x54, 0x72, + 0x61, 0x70, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe5, 0x9f, 0xc1, 0x04, 0xe3, 0xa0, 0x00, 0x00, + 0xe5, 0xcc, 0x00, 0x2f, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0x00, 0xf0, + 0xe5, 0x90, 0x00, 0x00, 0xe5, 0x90, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe5, 0x9f, 0x00, 0xdc, 0xe2, 0x80, 0x00, 0x04, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe5, 0x9f, 0xc0, 0xcc, 0xe3, 0x50, 0x0b, 0x02, + 0x33, 0xa0, 0x0b, 0x02, 0xe2, 0x8c, 0xc0, 0x04, + 0xe9, 0x9c, 0x00, 0x0c, 0xe0, 0x53, 0x31, 0x00, + 0x21, 0x53, 0x00, 0x02, 0x3a, 0x00, 0x00, 0x03, + 0xe5, 0x81, 0x20, 0x00, 0xe0, 0x82, 0x21, 0x00, + 0xe5, 0x8c, 0x20, 0x04, 0xe1, 0x2f, 0xff, 0x1e, + 0xe9, 0x2d, 0x50, 0x03, 0xe1, 0xa0, 0x10, 0x0c, + 0xeb, 0x00, 0x00, 0x44, 0xe3, 0x50, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x0d, 0xe5, 0x9d, 0xc0, 0x08, + 0xe9, 0x9c, 0x40, 0x04, 0xe1, 0x5e, 0x00, 0x01, + 0x10, 0x4e, 0x30, 0x02, 0xe0, 0x81, 0xe0, 0x00, + 0x11, 0xa0, 0x00, 0x02, 0x11, 0xa0, 0x20, 0x01, + 0xe9, 0x8c, 0x40, 0x04, 0x13, 0x53, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x03, 0xe8, 0xbd, 0x50, 0x03, + 0xe5, 0x81, 0x00, 0x00, 0xe1, 0xa0, 0x01, 0x43, + 0xe1, 0x2f, 0xff, 0x1e, 0xe8, 0xbd, 0x50, 0x03, + 0xe9, 0x9c, 0x00, 0x0c, 0xe0, 0x43, 0x00, 0x02, + 0xe1, 0xb0, 0x01, 0x40, 0x03, 0xa0, 0x20, 0x00, + 0x15, 0x8c, 0x30, 0x04, 0xe5, 0x81, 0x20, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe2, 0x80, 0x20, 0x03, 0xe3, 0xc2, 0x20, 0x03, + 0xe5, 0x9f, 0xc0, 0x24, 0xe2, 0x8c, 0xc0, 0x08, + 0xe8, 0x9c, 0x00, 0x03, 0xe0, 0x90, 0x20, 0x02, + 0x31, 0x52, 0x00, 0x01, 0x35, 0x8c, 0x20, 0x00, + 0x23, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x2e, 0x08, 0x21, 0x4c, 0x2e, 0x08, 0x21, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x02, 0xcc, 0x18, + 0x2e, 0x02, 0xcc, 0x14, 0x2e, 0x02, 0xcc, 0x10, + 0x2e, 0x08, 0xd7, 0x68, 0x2e, 0x00, 0x1a, 0xf9, + 0x2e, 0x02, 0x0e, 0x19, 0x2e, 0x02, 0x0c, 0xcd, + 0x2e, 0x02, 0x0d, 0x8d, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0x00, 0x04, 0xe5, 0x90, 0x00, 0x00, + 0xe2, 0x00, 0x04, 0xff, 0xe3, 0x50, 0x04, 0xea, + 0x03, 0xa0, 0x00, 0x01, 0x13, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe2, 0x40, 0x0b, 0x05, 0xe3, 0x50, 0x0b, 0x1b, + 0x33, 0xa0, 0x00, 0x01, 0x23, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe2, 0x8f, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x55, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x54, + 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x5a, + 0x65, 0x72, 0x6f, 0x00, 0x00, 0x02, 0x00, 0x01, + 0x55, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x02, 0x55, 0x6e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x53, 0x57, + 0x49, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x03, 0x50, 0x72, 0x65, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x20, 0x41, 0x62, 0x6f, + 0x72, 0x74, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x41, 0x62, 0x6f, + 0x72, 0x74, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, + 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x64, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, + 0x75, 0x70, 0x74, 0x00, 0x00, 0x02, 0x00, 0x07, + 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x64, 0x20, 0x46, 0x61, 0x73, 0x74, 0x20, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xfe, 0x80, + 0x2e, 0x01, 0xfe, 0x98, 0x2e, 0x01, 0xfe, 0xb4, + 0x2e, 0x01, 0xfe, 0xd4, 0x2e, 0x01, 0xfe, 0xe8, + 0x2e, 0x01, 0xfe, 0xf8, 0x2e, 0x01, 0xff, 0x10, + 0x2e, 0x01, 0xff, 0x28, 0xe2, 0x4f, 0x20, 0x28, + 0xe7, 0x92, 0x01, 0x00, 0xea, 0xff, 0xff, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x17, 0xc3, 0x40, 0x58, 0x1a, 0xc0, 0x1c, 0x01, + 0x08, 0x40, 0x08, 0x42, 0x18, 0x80, 0x09, 0x02, + 0x18, 0x80, 0x0a, 0x02, 0x18, 0x80, 0x0c, 0x02, + 0x18, 0x80, 0x08, 0xc0, 0x00, 0x82, 0x18, 0x12, + 0x00, 0x52, 0x1a, 0x89, 0x29, 0x0a, 0xdb, 0x01, + 0x1c, 0x40, 0x39, 0x0a, 0x40, 0x58, 0x1a, 0xc0, + 0x40, 0x59, 0x1a, 0xc9, 0x47, 0x70, 0x00, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0x30, 0x00, 0x02, + 0x01, 0x31, 0x00, 0x03, 0x0a, 0x00, 0x00, 0x05, + 0xe1, 0x80, 0xc0, 0x02, 0xe3, 0x3c, 0x01, 0x02, + 0x01, 0x91, 0xc0, 0x03, 0x03, 0xa0, 0x00, 0x01, + 0x13, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0xa0, 0xc4, 0xff, 0xe3, 0x8c, 0xc6, 0x0e, + 0xe1, 0x5c, 0x00, 0x80, 0x83, 0xa0, 0x00, 0x01, + 0x81, 0x2f, 0xff, 0x1e, 0x03, 0x51, 0x00, 0x00, + 0x03, 0xa0, 0x00, 0x01, 0x13, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xb5, 0x04, 0xf0, 0x00, + 0xf8, 0x04, 0xbc, 0x08, 0x60, 0x1a, 0xbc, 0x08, + 0x47, 0x18, 0x47, 0x78, 0xe1, 0xb0, 0x00, 0x80, + 0x03, 0x31, 0x00, 0x00, 0x01, 0xa0, 0x00, 0x60, + 0x03, 0xa0, 0x20, 0x00, 0x01, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x2a, 0xa0, 0xe1, 0xc0, 0x0a, 0x82, + 0xe1, 0xa0, 0x00, 0x60, 0xe3, 0x32, 0x00, 0x00, + 0xe2, 0x42, 0x2c, 0x03, 0xe2, 0x42, 0x20, 0xfe, + 0x0a, 0x00, 0x00, 0x06, 0xe3, 0x80, 0x04, 0x3f, + 0xe3, 0x80, 0x06, 0x0e, 0xe2, 0x22, 0x3b, 0x01, + 0xe3, 0x33, 0x00, 0x01, 0x11, 0x2f, 0xff, 0x1e, + 0xe3, 0xa0, 0x10, 0x01, 0xea, 0x00, 0x04, 0x70, + 0xe2, 0x00, 0xc1, 0x02, 0xe1, 0xa0, 0x06, 0x00, + 0xe2, 0x42, 0x20, 0x01, 0xe1, 0xb0, 0x00, 0x80, + 0x4a, 0x00, 0x00, 0x02, 0xe1, 0xb0, 0x10, 0x81, + 0x23, 0x80, 0x0a, 0x01, 0xea, 0xff, 0xff, 0xf9, + 0xe1, 0xa0, 0x04, 0xc0, 0xe3, 0xc0, 0x05, 0x01, + 0xe1, 0x8c, 0x01, 0x20, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, + 0xe2, 0x00, 0xc1, 0x02, 0xe1, 0xb0, 0x30, 0x80, + 0xe1, 0xb0, 0x3a, 0xa3, 0x0a, 0x00, 0x00, 0x0b, + 0xe2, 0x83, 0xe0, 0x01, 0xe3, 0x5e, 0x0b, 0x02, + 0xaa, 0x00, 0x00, 0x39, 0xe0, 0x93, 0x30, 0x02, + 0xda, 0x00, 0x00, 0x11, 0xe2, 0x83, 0xe0, 0x01, + 0xe3, 0x5e, 0x0b, 0x02, 0xaa, 0x00, 0x00, 0x37, + 0xe1, 0x83, 0x06, 0x00, 0xe1, 0x8c, 0x06, 0x60, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0x91, 0x30, 0x80, 0x01, 0xa0, 0x00, 0x0c, + 0x08, 0xbd, 0x40, 0x00, 0x01, 0x2f, 0xff, 0x1e, + 0xe1, 0xb0, 0x10, 0x81, 0xe0, 0xa0, 0x00, 0x00, + 0xe2, 0x42, 0x20, 0x01, 0xe3, 0x10, 0x06, 0x01, + 0x0a, 0xff, 0xff, 0xfa, 0xe3, 0xa0, 0x30, 0x01, + 0xea, 0xff, 0xff, 0xeb, 0xe1, 0xa0, 0x05, 0x80, + 0xe3, 0x80, 0x01, 0x02, 0xe3, 0x73, 0x00, 0x14, + 0xca, 0x00, 0x00, 0x05, 0xe3, 0x73, 0x00, 0x34, + 0xaa, 0x00, 0x00, 0x0d, 0xe1, 0xa0, 0x00, 0x0c, + 0xe3, 0xa0, 0x10, 0x00, 0xe8, 0xbd, 0x40, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x05, 0xa0, + 0xe2, 0x63, 0x30, 0x01, 0xe2, 0x63, 0x20, 0x20, + 0xe1, 0xa0, 0xe2, 0x11, 0xe1, 0xb0, 0xe0, 0x8e, + 0xe1, 0xa0, 0xe2, 0x10, 0xe1, 0x8e, 0x13, 0x31, + 0xe1, 0xa0, 0x03, 0x30, 0xe1, 0x80, 0x00, 0x0c, + 0xea, 0x00, 0x00, 0x0a, 0xe2, 0x93, 0x30, 0x20, + 0xda, 0x00, 0x00, 0x03, 0xe1, 0x80, 0x0a, 0xa1, + 0xe1, 0xb0, 0xe3, 0x11, 0xe2, 0x63, 0x30, 0x0c, + 0xea, 0x00, 0x00, 0x02, 0xe2, 0x83, 0x30, 0x15, + 0xe1, 0x91, 0xe3, 0x10, 0xe2, 0x63, 0x30, 0x21, + 0xe1, 0xa0, 0x13, 0x30, 0xe1, 0xa0, 0x00, 0x0c, + 0x03, 0x11, 0x00, 0x01, 0x98, 0xbd, 0x40, 0x00, + 0x91, 0x2f, 0xff, 0x1e, 0xe2, 0x91, 0x10, 0x01, + 0x22, 0x80, 0x00, 0x01, 0xe8, 0xbd, 0x40, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe8, 0xbd, 0x40, 0x00, + 0xe3, 0xa0, 0x10, 0x01, 0xea, 0x00, 0x04, 0x1e, + 0xe8, 0xbd, 0x40, 0x00, 0xe3, 0xa0, 0x10, 0x01, + 0xea, 0x00, 0x04, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, + 0xe1, 0xa0, 0x35, 0x0c, 0xe1, 0xa0, 0x0a, 0x2c, + 0xe1, 0xa0, 0x25, 0x81, 0xe1, 0x83, 0x1a, 0xa1, + 0x12, 0x80, 0x0b, 0x1e, 0xe1, 0xa0, 0x00, 0x60, + 0x13, 0x81, 0x11, 0x02, 0xe1, 0xb0, 0xca, 0xcc, + 0x0a, 0x00, 0x00, 0x02, 0xe3, 0x7c, 0x00, 0x01, + 0x03, 0x80, 0x01, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0x11, 0x01, 0x02, 0x01, 0x2f, 0xff, 0x1e, + 0xe3, 0xd1, 0x11, 0x02, 0x0a, 0x00, 0x00, 0x15, + 0xe1, 0xb0, 0x38, 0x21, 0x01, 0xa0, 0x18, 0x01, + 0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, + 0xe1, 0xb0, 0x3c, 0x21, 0x01, 0xa0, 0x14, 0x01, + 0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x3e, 0x21, + 0x01, 0xa0, 0x12, 0x01, 0x02, 0x8c, 0xc0, 0x04, + 0xe1, 0xb0, 0x3f, 0x21, 0x01, 0xa0, 0x11, 0x01, + 0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x3f, 0xa1, + 0x01, 0xa0, 0x10, 0x81, 0x02, 0x8c, 0xc0, 0x01, + 0xe2, 0x6c, 0x30, 0x20, 0xe1, 0x81, 0x13, 0x32, + 0xe1, 0xa0, 0x2c, 0x12, 0xe0, 0x40, 0x00, 0x0c, + 0xe2, 0x80, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xb0, 0x38, 0x22, 0x01, 0xa0, 0x28, 0x02, + 0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, + 0xe1, 0xb0, 0x3c, 0x22, 0x01, 0xa0, 0x24, 0x02, + 0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x3e, 0x22, + 0x01, 0xa0, 0x22, 0x02, 0x02, 0x8c, 0xc0, 0x04, + 0xe1, 0xb0, 0x3f, 0x22, 0x01, 0xa0, 0x21, 0x02, + 0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x3f, 0xa2, + 0x01, 0xa0, 0x20, 0x82, 0x02, 0x8c, 0xc0, 0x01, + 0xe1, 0xa0, 0x10, 0x02, 0xe3, 0xa0, 0x20, 0x00, + 0xe2, 0x40, 0x00, 0x1f, 0xe0, 0x40, 0x00, 0x0c, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x4b, 0xf0, 0xe8, 0x93, 0x00, 0x38, + 0xe3, 0x10, 0x01, 0x01, 0x03, 0x13, 0x01, 0x01, + 0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x03, 0xe5, + 0xeb, 0x00, 0x05, 0x39, 0xe8, 0xbd, 0x4b, 0xf0, + 0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14, + 0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x04, 0x7f, + 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, + 0xe1, 0xa0, 0x30, 0x00, 0xe1, 0xa0, 0x40, 0x01, + 0xe1, 0xa0, 0x50, 0x02, 0xe3, 0x10, 0x01, 0x01, + 0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x03, 0xd7, + 0xeb, 0x00, 0x05, 0x2b, 0xe8, 0xbd, 0x4b, 0xf0, + 0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14, + 0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x04, 0x71, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0xa0, 0x38, 0x80, + 0xe1, 0xa0, 0x38, 0xa3, 0xe1, 0xc0, 0x00, 0x03, + 0xe1, 0xd1, 0xc0, 0x80, 0x5a, 0x00, 0x00, 0x0c, + 0xe2, 0x53, 0x3b, 0x0f, 0x4a, 0x00, 0x00, 0x13, + 0x12, 0x83, 0xc0, 0x01, 0x13, 0x5c, 0x0b, 0x02, + 0xaa, 0x00, 0x00, 0x0d, 0xe1, 0xb0, 0xc5, 0xa2, + 0x2a, 0x00, 0x00, 0x58, 0xe1, 0x80, 0x0a, 0x03, + 0xe3, 0xc1, 0x11, 0x02, 0xe1, 0x80, 0x05, 0xa1, + 0xe1, 0x8c, 0x1a, 0x81, 0xe3, 0xa0, 0x30, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x10, 0x01, 0x01, + 0x1a, 0x00, 0x00, 0x40, 0xe2, 0x00, 0x01, 0x02, + 0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x30, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x33, 0x00, 0x00, + 0x13, 0xa0, 0x33, 0x19, 0x11, 0x2f, 0xff, 0x1e, + 0xe2, 0x93, 0x30, 0x34, 0x0a, 0x00, 0x00, 0x31, + 0x42, 0x00, 0x01, 0x02, 0x43, 0xa0, 0x10, 0x00, + 0x43, 0xa0, 0x30, 0x00, 0x41, 0x2f, 0xff, 0x1e, + 0xe2, 0x53, 0x30, 0x20, 0x0a, 0x00, 0x00, 0x13, + 0xba, 0x00, 0x00, 0x1a, 0xe1, 0xb0, 0xc3, 0x12, + 0x4a, 0x00, 0x00, 0x05, 0xe2, 0x63, 0xc0, 0x20, + 0xe1, 0x80, 0x0c, 0x31, 0xe1, 0xa0, 0x2c, 0x32, + 0xe1, 0x82, 0x13, 0x11, 0xe3, 0xa0, 0x30, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x96, 0xc0, 0x8c, + 0xe2, 0x63, 0xc0, 0x20, 0xe1, 0x80, 0x0c, 0x31, + 0xe1, 0xa0, 0x2c, 0x32, 0xe1, 0x82, 0x13, 0x11, + 0xe3, 0xa0, 0x30, 0x00, 0x03, 0x11, 0x00, 0x01, + 0x01, 0x2f, 0xff, 0x1e, 0xe2, 0x91, 0x10, 0x01, + 0x22, 0x80, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0xa0, 0x30, 0x00, 0xe3, 0x32, 0x01, 0x02, + 0x41, 0x2f, 0xff, 0x1e, 0x03, 0x11, 0x00, 0x01, + 0x01, 0x2f, 0xff, 0x1e, 0xe2, 0x91, 0x10, 0x01, + 0x22, 0x80, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0xe2, 0x83, 0x30, 0x20, 0xe1, 0xb0, 0xc3, 0x11, + 0x4a, 0x00, 0x00, 0x04, 0xe2, 0x63, 0xc0, 0x20, + 0xe1, 0xa0, 0x1c, 0x31, 0xe2, 0x00, 0x01, 0x02, + 0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0x3c, 0x01, 0x02, 0x01, 0x92, 0xc0, 0x06, + 0xe2, 0x63, 0xc0, 0x20, 0xe1, 0xa0, 0x1c, 0x31, + 0x03, 0x11, 0x00, 0x01, 0x12, 0x81, 0x10, 0x01, + 0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0x31, 0x01, 0x02, 0x03, 0x32, 0x00, 0x00, + 0x03, 0xa0, 0x10, 0x00, 0x13, 0xa0, 0x10, 0x01, + 0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0x10, 0x02, 0x02, 0x1a, 0x00, 0x00, 0x0b, + 0xe3, 0xa0, 0x30, 0x00, 0xe3, 0x31, 0x00, 0x00, + 0x11, 0xb0, 0x10, 0x81, 0x43, 0xe0, 0x00, 0x00, + 0x41, 0x2f, 0xff, 0x1e, 0x03, 0x32, 0x00, 0x00, + 0x13, 0xa0, 0x34, 0x61, 0x11, 0x2f, 0xff, 0x1e, + 0xe2, 0x00, 0x01, 0x02, 0xe3, 0x80, 0x02, 0x07, + 0xe3, 0x80, 0x06, 0xff, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0xc1, 0x11, 0x02, 0xe1, 0xa0, 0xcb, 0x02, + 0xe1, 0x9c, 0xc0, 0x06, 0xe2, 0x00, 0xc1, 0x02, + 0xe1, 0xa0, 0x0a, 0x03, 0xe1, 0x80, 0x05, 0xa1, + 0xe1, 0xa0, 0x1a, 0x81, 0xe1, 0x81, 0x15, 0xa2, + 0xe3, 0xa0, 0x30, 0x00, 0x0a, 0x00, 0x00, 0x06, + 0xe2, 0x91, 0x10, 0x01, 0x22, 0x80, 0x00, 0x01, + 0xe2, 0x90, 0x26, 0x01, 0xe1, 0x80, 0x00, 0x0c, + 0x51, 0x2f, 0xff, 0x1e, 0xe3, 0xa0, 0x33, 0x19, + 0xe1, 0x2f, 0xff, 0x1e, 0x03, 0x11, 0x00, 0x01, + 0x01, 0x80, 0x00, 0x0c, 0x01, 0x2f, 0xff, 0x1e, + 0xe2, 0x91, 0x10, 0x01, 0x22, 0x80, 0x00, 0x01, + 0xe2, 0x90, 0x26, 0x01, 0xe1, 0x80, 0x00, 0x0c, + 0x51, 0x2f, 0xff, 0x1e, 0xe3, 0xa0, 0x33, 0x19, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x4b, 0xf0, 0xe1, 0xb0, 0xc0, 0x82, + 0x03, 0x33, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x3c, + 0xe1, 0xa0, 0x85, 0x0c, 0xe1, 0xa0, 0x2a, 0x2c, + 0xe1, 0xa0, 0x55, 0x83, 0xe1, 0x88, 0x4a, 0xa3, + 0x12, 0x82, 0x2b, 0x1e, 0xe1, 0xa0, 0x30, 0x62, + 0x13, 0x84, 0x41, 0x02, 0xe1, 0xb0, 0xca, 0xcc, + 0x02, 0x8f, 0xe0, 0x08, 0x0a, 0x00, 0x04, 0xf8, + 0xe3, 0x7c, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x16, + 0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x3c, 0xe1, 0xa0, 0x85, 0x0c, + 0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, + 0xe1, 0x88, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, + 0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, + 0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, + 0x0a, 0x00, 0x04, 0xb9, 0xe3, 0x7c, 0x00, 0x01, + 0x0a, 0x00, 0x00, 0x16, 0xe3, 0xa0, 0xb0, 0x02, + 0xeb, 0x00, 0x05, 0x15, 0xeb, 0xff, 0xff, 0x5f, + 0xe3, 0x13, 0x02, 0x02, 0x08, 0xbd, 0x4b, 0xf0, + 0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x83, 0x35, 0x02, + 0xea, 0x00, 0x04, 0x0f, 0xe3, 0x83, 0x31, 0x01, + 0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x0e, 0xe1, 0xa0, 0x85, 0x0c, + 0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, + 0xe1, 0x88, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, + 0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, + 0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, + 0x0a, 0x00, 0x04, 0xa1, 0xe3, 0x7c, 0x00, 0x01, + 0x03, 0x80, 0x01, 0x01, 0xe2, 0x4f, 0xe0, 0x60, + 0xe3, 0xa0, 0xb0, 0x02, 0xea, 0x00, 0x06, 0x2b, + 0xe1, 0x95, 0xc0, 0x84, 0x0a, 0x00, 0x00, 0x13, + 0xe1, 0xb0, 0x40, 0x84, 0x5a, 0x00, 0x00, 0x0d, + 0xe3, 0xe0, 0x00, 0x00, 0xe8, 0xbd, 0x4b, 0xf0, + 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xb0, 0xc0, 0x80, + 0x03, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x07, + 0xe1, 0xf0, 0xca, 0x4c, 0x08, 0xbd, 0x4b, 0xf0, + 0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x3c, 0x00, 0x01, + 0x1a, 0x00, 0x00, 0x04, 0xe1, 0x91, 0xc6, 0x00, + 0x08, 0xbd, 0x4b, 0xf0, 0x01, 0x2f, 0xff, 0x1e, + 0xe3, 0xa0, 0x35, 0x06, 0xea, 0x00, 0x03, 0xe8, + 0xe3, 0xa0, 0x35, 0x0a, 0xea, 0x00, 0x03, 0xe6, + 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, + 0xe8, 0xbd, 0x4b, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, + 0xe1, 0xb0, 0xc0, 0x82, 0x03, 0x33, 0x00, 0x00, + 0xe1, 0xa0, 0x85, 0x0c, 0xe1, 0xa0, 0x2a, 0x2c, + 0xe1, 0xa0, 0x55, 0x83, 0xe1, 0x88, 0x4a, 0xa3, + 0x12, 0x82, 0x2b, 0x1e, 0xe1, 0xa0, 0x30, 0x62, + 0x13, 0x84, 0x41, 0x02, 0xe1, 0xb0, 0xca, 0xcc, + 0x02, 0x8f, 0xe0, 0x08, 0x0a, 0x00, 0x04, 0xa4, + 0xe3, 0x7c, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x14, + 0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, + 0xe1, 0xa0, 0x85, 0x0c, 0xe1, 0xa0, 0x0a, 0x2c, + 0xe1, 0xa0, 0x25, 0x81, 0xe1, 0x88, 0x1a, 0xa1, + 0x12, 0x80, 0x0b, 0x1e, 0xe1, 0xa0, 0x00, 0x60, + 0x13, 0x81, 0x11, 0x02, 0xe1, 0xb0, 0xca, 0xcc, + 0x02, 0x8f, 0xe0, 0x08, 0x0a, 0x00, 0x04, 0x66, + 0xe3, 0x7c, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x14, + 0xeb, 0x00, 0x02, 0xdc, 0xeb, 0xff, 0xff, 0x0d, + 0xe3, 0x13, 0x02, 0x02, 0x08, 0xbd, 0x4b, 0xf0, + 0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x83, 0x35, 0x02, + 0xea, 0x00, 0x03, 0xbd, 0xe3, 0x83, 0x31, 0x01, + 0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, + 0xe1, 0xa0, 0x85, 0x0c, 0xe1, 0xa0, 0x0a, 0x2c, + 0xe1, 0xa0, 0x25, 0x81, 0xe1, 0x88, 0x1a, 0xa1, + 0x12, 0x80, 0x0b, 0x1e, 0xe1, 0xa0, 0x00, 0x60, + 0x13, 0x81, 0x11, 0x02, 0xe1, 0xb0, 0xca, 0xcc, + 0x02, 0x8f, 0xe0, 0x08, 0x0a, 0x00, 0x04, 0x50, + 0xe3, 0x7c, 0x00, 0x01, 0x03, 0x80, 0x01, 0x01, + 0xe2, 0x4f, 0xe0, 0x5c, 0xe3, 0xa0, 0xb0, 0x02, + 0xea, 0x00, 0x03, 0x64, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0xc4, 0xff, 0xe3, 0x8c, 0xc6, 0x0e, + 0xe1, 0x5c, 0x00, 0x82, 0x9a, 0x00, 0x00, 0x0a, + 0xe1, 0xb0, 0x00, 0x80, 0x03, 0x31, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x0a, 0x3a, 0x00, 0x00, 0x12, + 0xe1, 0x50, 0x00, 0x0c, 0x03, 0x51, 0x00, 0x00, + 0x8a, 0xff, 0xfc, 0x60, 0xe1, 0xb0, 0x20, 0x82, + 0x8a, 0x00, 0x00, 0x18, 0xe3, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x03, 0x53, 0x00, 0x00, + 0x0a, 0xff, 0xff, 0xf2, 0xea, 0xff, 0xfc, 0x5d, + 0xe1, 0x50, 0x00, 0x0c, 0x03, 0x51, 0x00, 0x00, + 0x8a, 0xff, 0xfc, 0x56, 0xe1, 0xb0, 0x20, 0x82, + 0x33, 0xa0, 0x00, 0x00, 0x23, 0xa0, 0x00, 0x01, + 0x03, 0x33, 0x00, 0x00, 0x03, 0xa0, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x0c, + 0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfc, 0x4d, + 0xe1, 0xb0, 0x20, 0x82, 0x23, 0xa0, 0x00, 0x01, + 0x21, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02, + 0x01, 0x51, 0x00, 0x03, 0x33, 0xa0, 0x00, 0x00, + 0x23, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03, + 0x83, 0xa0, 0x00, 0x00, 0x93, 0xa0, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0xb0, 0x20, 0x80, 0xe1, 0xa0, 0x2a, 0xa2, + 0xe1, 0xa0, 0x05, 0x80, 0xe1, 0x80, 0x0a, 0xa1, + 0xe3, 0x80, 0x01, 0x02, 0xe2, 0x42, 0x2c, 0x03, + 0x2a, 0x00, 0x00, 0x08, 0xe2, 0x52, 0x20, 0xff, + 0x4a, 0x00, 0x00, 0x04, 0xe2, 0x72, 0x20, 0x1f, + 0xc1, 0xa0, 0x02, 0x30, 0xc1, 0x2f, 0xff, 0x1e, + 0xe3, 0xc0, 0x01, 0x02, 0xea, 0x00, 0x00, 0x09, + 0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe2, 0x52, 0x20, 0xff, 0x4a, 0xff, 0xff, 0xfb, + 0xe2, 0x72, 0x20, 0x1f, 0xc1, 0xa0, 0x02, 0x30, + 0xc2, 0x60, 0x00, 0x00, 0xc1, 0x2f, 0xff, 0x1e, + 0x01, 0x91, 0xc0, 0x80, 0x01, 0x2f, 0xff, 0x1e, + 0xe3, 0xa0, 0x36, 0x12, 0xe2, 0x82, 0x2e, 0x3e, + 0xe3, 0x72, 0x00, 0x01, 0x1a, 0x00, 0x03, 0x63, + 0xe1, 0x91, 0xc0, 0x80, 0x13, 0xa0, 0x37, 0x42, + 0xea, 0x00, 0x03, 0x60, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x4b, 0xf0, 0xe2, 0x22, 0x21, 0x02, + 0xea, 0x00, 0x00, 0x01, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x4b, 0xf0, 0xe1, 0xb0, 0xc0, 0x82, + 0x03, 0x33, 0x00, 0x00, 0xe1, 0xa0, 0x85, 0x0c, + 0xe1, 0xa0, 0x2a, 0x2c, 0xe1, 0xa0, 0x55, 0x83, + 0xe1, 0x88, 0x4a, 0xa3, 0x12, 0x82, 0x2b, 0x1e, + 0xe1, 0xa0, 0x30, 0x62, 0x13, 0x84, 0x41, 0x02, + 0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, + 0x0a, 0x00, 0x04, 0x1d, 0xe3, 0x7c, 0x00, 0x01, + 0x0a, 0x00, 0x00, 0x14, 0xe1, 0xb0, 0xc0, 0x80, + 0x03, 0x31, 0x00, 0x00, 0xe1, 0xa0, 0x85, 0x0c, + 0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, + 0xe1, 0x88, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, + 0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, + 0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, + 0x0a, 0x00, 0x03, 0xdf, 0xe3, 0x7c, 0x00, 0x01, + 0x0a, 0x00, 0x00, 0x14, 0xeb, 0x00, 0x05, 0xbb, + 0xeb, 0xff, 0xfe, 0x86, 0xe3, 0x13, 0x02, 0x02, + 0x08, 0xbd, 0x4b, 0xf0, 0x01, 0x2f, 0xff, 0x1e, + 0xe3, 0x83, 0x35, 0x02, 0xea, 0x00, 0x03, 0x36, + 0xe3, 0x83, 0x31, 0x01, 0xe1, 0xb0, 0xc0, 0x80, + 0x03, 0x31, 0x00, 0x00, 0xe1, 0xa0, 0x85, 0x0c, + 0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, + 0xe1, 0x88, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, + 0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, + 0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, + 0x0a, 0x00, 0x03, 0xc9, 0xe3, 0x7c, 0x00, 0x01, + 0x03, 0x80, 0x01, 0x01, 0xe2, 0x4f, 0xe0, 0x5c, + 0xe3, 0xa0, 0xb0, 0x02, 0xea, 0x00, 0x05, 0xff, + 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, + 0xe2, 0x20, 0x01, 0x02, 0xea, 0xff, 0xff, 0xc6, + 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0xc4, 0xff, + 0xe3, 0x8c, 0xc6, 0x0e, 0xe1, 0x5c, 0x00, 0x82, + 0x9a, 0x00, 0x00, 0x0a, 0xe1, 0xb0, 0x00, 0x80, + 0x03, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0a, + 0x3a, 0x00, 0x00, 0x11, 0xe1, 0x50, 0x00, 0x0c, + 0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfb, 0xd5, + 0xe1, 0xb0, 0x20, 0x82, 0x8a, 0x00, 0x00, 0x17, + 0xe3, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0x03, 0x53, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xf2, + 0xea, 0xff, 0xfb, 0xd2, 0xe1, 0x50, 0x00, 0x0c, + 0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfb, 0xcb, + 0xe1, 0xb0, 0x20, 0x82, 0x03, 0x33, 0x00, 0x00, + 0x83, 0xa0, 0x00, 0x00, 0x93, 0xa0, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x0c, + 0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfb, 0xc3, + 0xe1, 0xb0, 0x20, 0x82, 0x23, 0xa0, 0x00, 0x00, + 0x21, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02, + 0x01, 0x51, 0x00, 0x03, 0x93, 0xa0, 0x00, 0x01, + 0x83, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03, + 0x33, 0xa0, 0x00, 0x00, 0x23, 0xa0, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0x42, 0x99, 0xd1, 0x03, + 0x42, 0x90, 0xd1, 0x01, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x01, 0x47, 0x70, 0xb5, 0x70, 0x1c, 0x04, + 0x1c, 0x0d, 0x1c, 0x16, 0x46, 0x9e, 0x47, 0x78, + 0xe3, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x10, 0x00, + 0xe1, 0xa0, 0x30, 0x05, 0xe1, 0xa0, 0x20, 0x04, + 0xe3, 0x3e, 0x00, 0x00, 0x03, 0x36, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x14, 0xe3, 0xb0, 0xc0, 0x00, + 0xe0, 0x96, 0x60, 0x06, 0xe0, 0xbe, 0xe0, 0x0e, + 0x2a, 0x00, 0x00, 0x04, 0xe1, 0x5e, 0x00, 0x03, + 0x01, 0x56, 0x00, 0x02, 0x92, 0x8c, 0xc0, 0x01, + 0x9a, 0xff, 0xff, 0xf8, 0xe2, 0x9c, 0xc0, 0x00, + 0xe1, 0xb0, 0xe0, 0x6e, 0xe1, 0xa0, 0x60, 0x66, + 0xe0, 0x52, 0x40, 0x06, 0xe0, 0xd3, 0x50, 0x0e, + 0x21, 0xa0, 0x30, 0x05, 0x21, 0xa0, 0x20, 0x04, + 0xe0, 0xb0, 0x00, 0x00, 0xe0, 0xa1, 0x10, 0x01, + 0xe1, 0xb0, 0xe0, 0xae, 0xe1, 0xa0, 0x60, 0x66, + 0xe2, 0x5c, 0xc0, 0x01, 0xaa, 0xff, 0xff, 0xf5, + 0xe8, 0xbd, 0x40, 0x70, 0xe1, 0x2f, 0xff, 0x1e, + 0x18, 0x80, 0x41, 0x59, 0x47, 0x70, 0x00, 0x00, + 0x1c, 0x01, 0x08, 0x40, 0x08, 0x42, 0x18, 0x80, + 0x09, 0x02, 0x18, 0x80, 0x0a, 0x02, 0x18, 0x80, + 0x0c, 0x02, 0x18, 0x80, 0x08, 0xc0, 0x00, 0x82, + 0x18, 0x12, 0x00, 0x52, 0x1a, 0x89, 0x29, 0x0a, + 0xdb, 0x01, 0x1c, 0x40, 0x39, 0x0a, 0x47, 0x70, + 0xb4, 0x80, 0x20, 0x03, 0x43, 0xc0, 0x23, 0x00, + 0x49, 0x07, 0x54, 0x0b, 0x30, 0x01, 0xd4, 0xfc, + 0x20, 0x00, 0x4a, 0x06, 0x5c, 0x17, 0x54, 0x0f, + 0x18, 0x0f, 0x37, 0x80, 0x70, 0x3b, 0x30, 0x01, + 0x28, 0x80, 0xd3, 0xf7, 0xbc, 0x80, 0x47, 0x70, + 0x2e, 0x08, 0x22, 0x44, 0x2e, 0x03, 0xa9, 0x2c, + 0x17, 0xc1, 0x47, 0x70, 0x42, 0x99, 0xdb, 0x04, + 0xdc, 0x01, 0x42, 0x90, 0xd3, 0x01, 0x20, 0x00, + 0x47, 0x70, 0x20, 0x01, 0x47, 0x70, 0x00, 0x00, + 0x1c, 0x0b, 0x21, 0x00, 0x42, 0x40, 0x41, 0x99, + 0x47, 0x70, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0xb0, 0x00, 0xe1, 0xa0, 0x20, 0x01, + 0xe8, 0x80, 0x00, 0x0e, 0xe5, 0x9f, 0xc0, 0x38, + 0xe5, 0x8c, 0xd0, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0x20, 0x28, + 0xe5, 0x92, 0x20, 0x00, 0xe5, 0x91, 0x40, 0x2c, + 0xe5, 0x91, 0xc0, 0x34, 0xe1, 0x5c, 0x00, 0x02, + 0x23, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc0, 0x08, + 0xe5, 0x9c, 0xd0, 0x00, 0xe3, 0xa0, 0xb0, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x23, 0x44, + 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, + 0xe5, 0x9f, 0xc0, 0xe4, 0xe5, 0x9c, 0x00, 0x00, + 0xe3, 0x50, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x04, + 0x15, 0x8c, 0x00, 0x04, 0x0b, 0x00, 0x00, 0x01, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe5, 0x9f, 0xc0, 0xcc, 0xea, 0xff, 0xfb, 0x87, + 0xe3, 0xa0, 0x10, 0x0a, 0xe3, 0x50, 0x01, 0x02, + 0x13, 0x50, 0x01, 0x06, 0x13, 0x50, 0x01, 0x16, + 0x03, 0xa0, 0x10, 0x03, 0xe3, 0x50, 0x01, 0x0a, + 0x13, 0x50, 0x01, 0x0e, 0x03, 0xa0, 0x10, 0x05, + 0xe5, 0x9f, 0x20, 0xa8, 0xe1, 0x50, 0x00, 0x02, + 0xe2, 0x82, 0x20, 0xff, 0x21, 0x52, 0x00, 0x00, + 0x23, 0xa0, 0x10, 0x02, 0xe3, 0x50, 0x01, 0x82, + 0x03, 0xa0, 0x10, 0x02, 0xe3, 0x50, 0x01, 0x86, + 0x03, 0xa0, 0x10, 0x07, 0xe5, 0x9f, 0x20, 0x88, + 0xe0, 0x50, 0x20, 0x02, 0x13, 0x52, 0x00, 0x01, + 0x03, 0xa0, 0x10, 0x05, 0xe1, 0xa0, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x40, 0x02, 0xe1, 0xa0, 0x30, 0x00, + 0xeb, 0xff, 0xff, 0xe4, 0xe8, 0xbd, 0x40, 0x02, + 0xe5, 0x9f, 0xc0, 0x50, 0xe3, 0xa0, 0x20, 0x01, + 0xe5, 0xcc, 0x20, 0x00, 0xe9, 0x2d, 0x00, 0x0a, + 0xeb, 0xff, 0xff, 0xdc, 0xea, 0x00, 0x00, 0x09, + 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc0, 0x30, + 0xe3, 0xa0, 0x10, 0x00, 0xe5, 0x8c, 0x10, 0x00, + 0xe5, 0x9c, 0x00, 0x04, 0xe3, 0x50, 0x00, 0x00, + 0x01, 0x2f, 0xff, 0x1e, 0xe5, 0x8c, 0x10, 0x04, + 0xea, 0xff, 0xff, 0xd2, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0xa0, 0xc0, 0x0d, 0xe9, 0x2d, 0xd9, 0xf0, + 0xe2, 0x4c, 0xb0, 0x04, 0xe3, 0xa0, 0x10, 0x01, + 0xea, 0xff, 0xfb, 0xa4, 0x2e, 0x08, 0x21, 0x34, + 0x2e, 0x08, 0x21, 0x46, 0x2e, 0x02, 0x24, 0x85, + 0x80, 0x00, 0x02, 0x00, 0x80, 0x80, 0x0e, 0xa0, + 0xb5, 0xff, 0xa6, 0x23, 0xa5, 0x22, 0xa4, 0x22, + 0x68, 0x5a, 0x68, 0x1f, 0x4b, 0x21, 0x60, 0x5a, + 0x23, 0x00, 0x4a, 0x21, 0x70, 0x13, 0x70, 0x53, + 0x70, 0x93, 0x4a, 0x20, 0x2a, 0x00, 0xd0, 0x02, + 0x9a, 0x02, 0xf7, 0xff, 0xff, 0xfe, 0x48, 0x1e, + 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, + 0x48, 0x1c, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, + 0xff, 0xfe, 0x48, 0x1b, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xff, 0xff, 0x06, 0x48, 0x19, 0x28, 0x00, + 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, 0x48, 0x18, + 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x01, 0xfb, 0xf8, + 0x48, 0x16, 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x01, + 0xfd, 0x69, 0x48, 0x15, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xff, 0xa0, + 0x48, 0x12, 0x28, 0x00, 0xd0, 0x04, 0x1c, 0x30, + 0x1c, 0x29, 0x1c, 0x22, 0xf0, 0x01, 0xff, 0x6e, + 0x2f, 0x00, 0xd0, 0x01, 0xf7, 0xfd, 0xfa, 0x5a, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x3a, 0x74, 0x74, 0x00, 0x2e, 0x08, 0x23, 0x48, + 0x2e, 0x08, 0x23, 0x48, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x02, 0x0b, 0x1d, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x02, 0x25, 0x15, 0x2e, 0x02, 0x28, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x02, 0x2c, 0x29, + 0xb5, 0x90, 0x28, 0x00, 0xd0, 0x04, 0x48, 0x12, + 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, + 0x4f, 0x10, 0x68, 0x78, 0x28, 0x00, 0xd0, 0x03, + 0xf7, 0xfd, 0xfa, 0x22, 0x20, 0x00, 0x60, 0x78, + 0x4f, 0x0d, 0x78, 0x78, 0x24, 0x01, 0x28, 0x00, + 0xd1, 0x05, 0x70, 0x7c, 0x48, 0x0b, 0x28, 0x00, + 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, 0x78, 0xb8, + 0x28, 0x00, 0xd1, 0x05, 0x70, 0xbc, 0x48, 0x08, + 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x01, 0xff, 0x7a, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x23, 0x48, + 0x2e, 0x08, 0x23, 0x48, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x02, 0x2c, 0xc9, 0xb5, 0x90, 0x1c, 0x0c, + 0x21, 0x01, 0x1c, 0x17, 0xf0, 0x01, 0xfb, 0x9c, + 0x21, 0x00, 0x1c, 0x20, 0xf0, 0x01, 0xfb, 0x98, + 0x21, 0x02, 0x1c, 0x38, 0xf0, 0x01, 0xfb, 0x94, + 0x20, 0x01, 0xf7, 0xfe, 0xfe, 0x95, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf1, 0x20, 0x00, + 0xb0, 0x89, 0x90, 0x06, 0x26, 0x00, 0x90, 0x05, + 0x20, 0x01, 0x90, 0x04, 0x27, 0x00, 0x20, 0x00, + 0x90, 0x03, 0x90, 0x02, 0x25, 0x00, 0x90, 0x01, + 0xf0, 0x01, 0xfc, 0xc2, 0x1c, 0x04, 0x78, 0x00, + 0x28, 0x00, 0xd0, 0x17, 0x49, 0xe3, 0x5d, 0xe0, + 0x5c, 0x08, 0x08, 0x40, 0xd3, 0x06, 0x37, 0x01, + 0x5d, 0xe0, 0x5c, 0x08, 0x08, 0x40, 0xd2, 0xfa, + 0xe0, 0x00, 0x37, 0x01, 0x5d, 0xe0, 0x5c, 0x0a, + 0x08, 0x52, 0xd2, 0x01, 0x28, 0x00, 0xd1, 0xf8, + 0x98, 0x04, 0x30, 0x01, 0x90, 0x04, 0x5d, 0xe0, + 0x28, 0x00, 0xd1, 0xe8, 0x98, 0x04, 0x00, 0x80, + 0xf0, 0x01, 0xfc, 0xde, 0x4b, 0xd6, 0x93, 0x08, + 0x60, 0x18, 0x1c, 0x78, 0xf0, 0x01, 0xfc, 0xd8, + 0x9b, 0x08, 0x60, 0x58, 0x48, 0xd3, 0x28, 0x00, + 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, 0x21, 0x00, + 0x20, 0x00, 0x90, 0x04, 0x48, 0xd0, 0x90, 0x07, + 0x78, 0x27, 0x34, 0x01, 0x2e, 0x00, 0xd1, 0x58, + 0x2f, 0x22, 0xd0, 0x01, 0x2f, 0x27, 0xd1, 0x02, + 0x97, 0x05, 0x1c, 0x3e, 0xe0, 0x93, 0x98, 0x06, + 0x42, 0x81, 0xd1, 0x4e, 0x98, 0x03, 0x28, 0x00, + 0xd1, 0x4b, 0x25, 0x00, 0x43, 0xed, 0x1c, 0x2a, + 0x95, 0x01, 0x22, 0x00, 0xab, 0x00, 0x70, 0x1a, + 0x70, 0x5a, 0x1e, 0x60, 0x78, 0x02, 0x2a, 0x30, + 0xdb, 0x04, 0x2a, 0x39, 0xdc, 0x02, 0x30, 0x01, + 0x1f, 0xd5, 0x3d, 0x29, 0x78, 0x02, 0x2a, 0x3e, + 0xd0, 0x01, 0x2a, 0x3c, 0xd1, 0x35, 0x2a, 0x3e, + 0xd1, 0x0e, 0x22, 0x77, 0xab, 0x00, 0x70, 0x1a, + 0x2d, 0x00, 0xd0, 0x63, 0x2d, 0x02, 0xdc, 0x62, + 0x78, 0x42, 0x30, 0x01, 0x2a, 0x3e, 0xd1, 0x13, + 0x22, 0x61, 0x70, 0x1a, 0x30, 0x01, 0xe0, 0x0f, + 0x30, 0x01, 0x1c, 0x02, 0xe0, 0x02, 0x2b, 0x3e, + 0xd0, 0x56, 0x32, 0x01, 0x78, 0x13, 0x2b, 0x00, + 0xd0, 0x01, 0x2b, 0x20, 0xd1, 0xf7, 0x2d, 0x00, + 0xdc, 0x4d, 0x22, 0x72, 0xab, 0x00, 0x70, 0x1a, + 0x78, 0x02, 0x2a, 0x26, 0xd1, 0x24, 0x23, 0x01, + 0x42, 0xdd, 0xd0, 0x19, 0x2d, 0x00, 0xdd, 0x5e, + 0x78, 0x42, 0x30, 0x01, 0x2a, 0x30, 0xdb, 0x5b, + 0x2a, 0x32, 0xdc, 0x3c, 0x30, 0x01, 0x1c, 0x2b, + 0xd5, 0x04, 0x07, 0xdb, 0x0f, 0xdb, 0x42, 0x5b, + 0xe0, 0x02, 0xe0, 0x42, 0x07, 0xdb, 0x0f, 0xdb, + 0x33, 0x31, 0x42, 0x9a, 0xd1, 0x63, 0x22, 0x00, + 0xab, 0x00, 0x70, 0x1a, 0x95, 0x01, 0xe0, 0x11, + 0x22, 0x02, 0x92, 0x01, 0xaa, 0x00, 0x78, 0x12, + 0x30, 0x01, 0x2a, 0x72, 0xd0, 0x09, 0xe0, 0x06, + 0x23, 0x01, 0x42, 0xdd, 0xd1, 0x06, 0xaa, 0x00, + 0x78, 0x12, 0x2a, 0x72, 0xd0, 0x01, 0x25, 0x01, + 0xe0, 0x00, 0x25, 0x00, 0xaa, 0x00, 0x78, 0x12, + 0x2a, 0x00, 0xd0, 0x16, 0x22, 0x01, 0x92, 0x03, + 0x4a, 0x8c, 0x78, 0x03, 0x5c, 0xd3, 0x08, 0x5b, + 0xd3, 0x04, 0x78, 0x43, 0x5c, 0xd3, 0x30, 0x01, + 0x08, 0x5b, 0xd2, 0xfa, 0x78, 0x02, 0x2a, 0x22, + 0xd0, 0x01, 0x2a, 0x27, 0xd1, 0x0c, 0x30, 0x01, + 0x1c, 0x16, 0xe0, 0x09, 0xe0, 0x6a, 0xe0, 0xfb, + 0xe0, 0x23, 0x78, 0x02, 0x2a, 0x00, 0xd0, 0x03, + 0x4b, 0x80, 0x5c, 0x9a, 0x08, 0x52, 0xd3, 0x61, + 0x22, 0x01, 0x92, 0x02, 0x1c, 0x04, 0x78, 0x27, + 0x34, 0x01, 0x2e, 0x00, 0xd0, 0x15, 0x2f, 0x5c, + 0xd1, 0x0b, 0x78, 0x20, 0x28, 0x22, 0xd0, 0x03, + 0x28, 0x5c, 0xd0, 0x01, 0x28, 0x27, 0xd1, 0x04, + 0x34, 0x01, 0x1c, 0x07, 0xe0, 0x09, 0xe0, 0xdf, + 0xe0, 0xde, 0x1c, 0x30, 0x42, 0xb7, 0xd1, 0x04, + 0x40, 0x7e, 0x78, 0x27, 0x34, 0x01, 0x42, 0x87, + 0xd0, 0xfa, 0x2f, 0x00, 0xd0, 0x0c, 0x2e, 0x00, + 0xd1, 0x03, 0x48, 0x6e, 0x5d, 0xc0, 0x08, 0x40, + 0xd2, 0x06, 0x1c, 0x08, 0x9b, 0x08, 0x68, 0x5a, + 0x54, 0x17, 0x31, 0x01, 0xe0, 0x97, 0xe0, 0xc7, + 0x98, 0x06, 0x42, 0x81, 0xd1, 0x08, 0x98, 0x05, + 0x28, 0x00, 0xd1, 0x05, 0x98, 0x02, 0x28, 0x00, + 0xd0, 0x74, 0x98, 0x03, 0x28, 0x00, 0xd1, 0x72, + 0x22, 0x00, 0x1c, 0x08, 0x9b, 0x08, 0x68, 0x5b, + 0x54, 0x1a, 0x98, 0x02, 0x31, 0x01, 0x28, 0x00, + 0xd0, 0x6a, 0x98, 0x03, 0x28, 0x00, 0xd0, 0x13, + 0x01, 0xa8, 0x99, 0x07, 0x18, 0x42, 0x9b, 0x08, + 0x68, 0x58, 0x99, 0x06, 0x18, 0x40, 0x46, 0x69, + 0xf0, 0x01, 0xfd, 0x3a, 0x28, 0x00, 0xd1, 0x07, + 0x9b, 0x08, 0x68, 0x58, 0x99, 0x06, 0x18, 0x41, + 0xa2, 0x58, 0xa0, 0x5e, 0xf7, 0xff, 0xfe, 0xb6, + 0x23, 0x01, 0x98, 0x01, 0x42, 0xd8, 0xdd, 0x51, + 0x98, 0x01, 0x28, 0x00, 0xda, 0x03, 0x40, 0x18, + 0x42, 0x40, 0xe0, 0x02, 0xe0, 0x90, 0x07, 0xc0, + 0x0f, 0xc0, 0x1c, 0x41, 0x98, 0x01, 0xf0, 0x01, + 0xfe, 0x29, 0x01, 0x80, 0x99, 0x07, 0x18, 0x40, + 0xf0, 0x01, 0xfa, 0xdc, 0x28, 0x00, 0xd1, 0x3d, + 0xb0, 0x82, 0x98, 0x03, 0x01, 0x80, 0x99, 0x09, + 0x18, 0x40, 0x90, 0x01, 0x9a, 0x03, 0x2a, 0x00, + 0xda, 0x03, 0x07, 0xd2, 0x0f, 0xd2, 0x42, 0x52, + 0xe0, 0x01, 0x07, 0xd2, 0x0f, 0xd2, 0x01, 0x90, + 0x99, 0x09, 0x18, 0x40, 0x30, 0x40, 0x90, 0x00, + 0x20, 0xff, 0x30, 0x01, 0xf0, 0x01, 0xfb, 0xa8, + 0x1c, 0x01, 0x23, 0xff, 0x22, 0x01, 0x02, 0x52, + 0x98, 0x01, 0x33, 0x01, 0xf0, 0x01, 0xfe, 0x1e, + 0x98, 0x01, 0x68, 0xc0, 0x23, 0x01, 0x02, 0xdb, + 0x43, 0x18, 0x99, 0x01, 0x60, 0xc8, 0x08, 0xd8, + 0xf0, 0x01, 0xfb, 0x96, 0x1c, 0x01, 0x23, 0xff, + 0x22, 0x01, 0x02, 0x52, 0x98, 0x00, 0x33, 0x01, + 0xf0, 0x01, 0xfe, 0x0c, 0x98, 0x00, 0x68, 0xc0, + 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, 0x99, 0x00, + 0x60, 0xc8, 0xe0, 0x02, 0xe0, 0x13, 0xe0, 0x12, + 0xe0, 0x05, 0xb0, 0x02, 0x20, 0x00, 0x90, 0x02, + 0x90, 0x03, 0x99, 0x06, 0xe0, 0x0b, 0x9b, 0x08, + 0x68, 0x58, 0x9a, 0x06, 0x18, 0x82, 0x98, 0x04, + 0x1c, 0x43, 0x93, 0x04, 0x00, 0x80, 0x9b, 0x08, + 0x68, 0x1b, 0x50, 0x1a, 0x91, 0x06, 0x2f, 0x00, + 0xd0, 0x01, 0x26, 0x00, 0x96, 0x05, 0x2f, 0x00, + 0xd0, 0x00, 0xe6, 0x9d, 0x2e, 0x00, 0xd0, 0x0a, + 0xb0, 0x81, 0xab, 0x00, 0x70, 0x1e, 0x22, 0x00, + 0x70, 0x5a, 0x46, 0x69, 0xa2, 0x24, 0xa0, 0x25, + 0xf7, 0xff, 0xfe, 0x3c, 0xb0, 0x01, 0x22, 0x00, + 0x98, 0x04, 0x00, 0x80, 0x9b, 0x08, 0x68, 0x19, + 0x50, 0x0a, 0x98, 0x04, 0x28, 0x00, 0xdd, 0x0f, + 0x9b, 0x08, 0x68, 0x18, 0x68, 0x01, 0x68, 0x09, + 0x4b, 0x21, 0x40, 0x19, 0xa2, 0x21, 0x68, 0x12, + 0x42, 0x91, 0xd1, 0x05, 0x9b, 0x04, 0x3b, 0x01, + 0x93, 0x04, 0x30, 0x04, 0x9b, 0x08, 0x60, 0x18, + 0x9a, 0x09, 0x9b, 0x08, 0x68, 0x19, 0x98, 0x04, + 0xf7, 0xfe, 0xfc, 0x47, 0xf7, 0xfe, 0xfc, 0xc0, + 0x1e, 0x61, 0xa2, 0x19, 0xa0, 0x19, 0xf7, 0xff, + 0xfe, 0x15, 0xb0, 0x09, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x22, 0x44, + 0x2e, 0x08, 0x23, 0x50, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0xd3, 0x48, 0x27, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x49, 0x2f, 0x4f, 0x20, 0x72, 0x65, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x0a, 0x00, 0x00, 0x63, 0x61, 0x6e, 0x27, + 0x74, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x27, + 0x00, 0x00, 0x00, 0x00, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6c, 0x6f, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x00, 0x00, 0x00, 0x00, + 0xdf, 0xdf, 0xdf, 0xdf, 0x52, 0x55, 0x4e, 0x00, + 0x27, 0x0a, 0x00, 0x00, 0x75, 0x6e, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, + 0x6f, 0x72, 0x20, 0x69, 0x6c, 0x6c, 0x65, 0x67, + 0x61, 0x6c, 0x20, 0x49, 0x2f, 0x4f, 0x20, 0x72, + 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x27, 0x00, 0x00, 0x00, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x20, 0x01, + 0xea, 0x00, 0x00, 0x01, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0x20, 0x02, 0xe2, 0x00, 0x31, 0x02, + 0xe5, 0x9f, 0x00, 0x18, 0xe5, 0x80, 0x20, 0x00, + 0xe3, 0x31, 0x00, 0x00, 0x03, 0xa0, 0x00, 0x00, + 0x15, 0x9f, 0x00, 0x0c, 0x18, 0x90, 0x00, 0x03, + 0xe1, 0x80, 0x00, 0x03, 0xe1, 0x2f, 0xff, 0x1e, + 0x2e, 0x08, 0x21, 0x30, 0x2e, 0x08, 0x21, 0x3c, + 0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, + 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, + 0xe0, 0x88, 0x30, 0x09, 0xe2, 0x43, 0x3c, 0x3f, + 0xe2, 0x43, 0x30, 0xfe, 0xe3, 0x32, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x5d, 0xe3, 0x35, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x3d, 0xe9, 0x2d, 0x48, 0x81, + 0xe1, 0xa0, 0x08, 0x21, 0xe1, 0xc1, 0x78, 0x00, + 0xe1, 0xa0, 0x68, 0x24, 0xe1, 0xc4, 0x88, 0x06, + 0xe0, 0x09, 0x06, 0x90, 0xe0, 0x06, 0x06, 0x97, + 0xe0, 0x07, 0x07, 0x98, 0xe0, 0x97, 0x78, 0x06, + 0xe0, 0xa9, 0x98, 0x26, 0xe0, 0x08, 0x08, 0x90, + 0xe0, 0x97, 0x78, 0x08, 0xe0, 0xa9, 0x08, 0x28, + 0xe1, 0xa0, 0xb8, 0x22, 0xe1, 0xc2, 0xe8, 0x0b, + 0xe1, 0xa0, 0x68, 0x25, 0xe1, 0xc5, 0x88, 0x06, + 0xe0, 0x09, 0x06, 0x9b, 0xe0, 0x06, 0x06, 0x9e, + 0xe0, 0x0e, 0x0e, 0x98, 0xe0, 0x9e, 0xe8, 0x06, + 0xe0, 0xa9, 0x98, 0x26, 0xe0, 0x08, 0x08, 0x9b, + 0xe0, 0x9e, 0xe8, 0x08, 0xe0, 0xa9, 0xb8, 0x28, + 0xe0, 0x97, 0x70, 0x0b, 0xe2, 0xa0, 0x00, 0x00, + 0xe0, 0x97, 0xb0, 0x0e, 0xe0, 0xb7, 0x70, 0x00, + 0xe2, 0xa0, 0x00, 0x00, 0xe0, 0x51, 0x80, 0x02, + 0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x60, 0x00, + 0x31, 0xe0, 0x10, 0x01, 0x30, 0x44, 0x60, 0x05, + 0x10, 0x55, 0x90, 0x04, 0x03, 0xa0, 0x10, 0x00, + 0x31, 0xe0, 0x10, 0x01, 0x30, 0x46, 0x60, 0x08, + 0xe1, 0xa0, 0x48, 0x28, 0xe1, 0xc8, 0x58, 0x04, + 0xe1, 0xa0, 0x88, 0x29, 0xe1, 0xc9, 0x98, 0x08, + 0xe0, 0x22, 0x68, 0x94, 0xe0, 0x08, 0x08, 0x95, + 0xe0, 0x06, 0x05, 0x99, 0xe0, 0x96, 0x68, 0x08, + 0xe0, 0xa2, 0x28, 0x28, 0xe0, 0x09, 0x09, 0x94, + 0xe0, 0x96, 0x68, 0x09, 0xe0, 0xa2, 0x28, 0x29, + 0xe0, 0x9b, 0x60, 0x06, 0xe0, 0xb7, 0x20, 0x02, + 0xe0, 0xb0, 0x10, 0x01, 0xe1, 0x8e, 0xe1, 0x0e, + 0xe1, 0x86, 0x61, 0x2e, 0x48, 0xbd, 0x88, 0x81, + 0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, + 0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, + 0xe8, 0xbd, 0x88, 0x81, 0xe1, 0xa0, 0x58, 0x24, + 0xe1, 0xc4, 0x68, 0x05, 0xe1, 0xa0, 0x88, 0x21, + 0xe1, 0xc1, 0x98, 0x08, 0xe0, 0x04, 0x08, 0x95, + 0xe0, 0x08, 0x08, 0x96, 0xe0, 0x01, 0x06, 0x99, + 0xe0, 0x91, 0x18, 0x08, 0xe0, 0xa4, 0x48, 0x28, + 0xe0, 0x09, 0x09, 0x95, 0xe0, 0x91, 0x18, 0x09, + 0xe0, 0xa4, 0x48, 0x29, 0xe1, 0xa0, 0x88, 0x22, + 0xe1, 0xc2, 0x98, 0x08, 0xe0, 0x02, 0x08, 0x95, + 0xe0, 0x08, 0x08, 0x96, 0xe0, 0x06, 0x06, 0x99, + 0xe0, 0x96, 0x68, 0x08, 0xe0, 0xa2, 0x28, 0x28, + 0xe0, 0x09, 0x09, 0x95, 0xe0, 0x96, 0x68, 0x09, + 0xe0, 0xa2, 0x58, 0x29, 0xe0, 0x95, 0x20, 0x01, + 0xe2, 0xb4, 0x10, 0x00, 0x41, 0xa0, 0xf0, 0x0e, + 0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, + 0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x35, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x24, 0xe1, 0xa0, 0x28, 0x21, + 0xe1, 0xc1, 0x68, 0x02, 0xe1, 0xa0, 0x88, 0x24, + 0xe1, 0xc4, 0x98, 0x08, 0xe0, 0x01, 0x08, 0x92, + 0xe0, 0x08, 0x08, 0x96, 0xe0, 0x04, 0x06, 0x99, + 0xe0, 0x94, 0x48, 0x08, 0xe0, 0xa1, 0x18, 0x28, + 0xe0, 0x09, 0x09, 0x92, 0xe0, 0x94, 0x48, 0x09, + 0xe0, 0xa1, 0x18, 0x29, 0xe1, 0xa0, 0x88, 0x25, + 0xe1, 0xc5, 0x98, 0x08, 0xe0, 0x05, 0x08, 0x92, + 0xe0, 0x08, 0x08, 0x96, 0xe0, 0x06, 0x06, 0x99, + 0xe0, 0x96, 0x68, 0x08, 0xe0, 0xa5, 0x58, 0x28, + 0xe0, 0x09, 0x09, 0x92, 0xe0, 0x96, 0x68, 0x09, + 0xe0, 0xa5, 0x28, 0x29, 0xe0, 0x92, 0x20, 0x04, + 0xe2, 0xb1, 0x10, 0x00, 0x41, 0xa0, 0xf0, 0x0e, + 0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, + 0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0xc0, 0x81, 0x03, + 0xe3, 0xc3, 0x91, 0x03, 0xe0, 0x20, 0x00, 0x03, + 0xe2, 0x00, 0x01, 0x02, 0xe0, 0x88, 0x30, 0x09, + 0xe2, 0x43, 0x3c, 0x3f, 0xe2, 0x43, 0x30, 0xfe, + 0xe1, 0xa0, 0x58, 0x24, 0xe1, 0xc4, 0x68, 0x05, + 0xe1, 0xa0, 0x88, 0x21, 0xe1, 0xc1, 0x98, 0x08, + 0xe0, 0x01, 0x08, 0x95, 0xe0, 0x08, 0x08, 0x96, + 0xe0, 0x02, 0x06, 0x99, 0xe0, 0x92, 0x28, 0x08, + 0xe0, 0xa1, 0x18, 0x28, 0xe0, 0x09, 0x09, 0x95, + 0xe0, 0x92, 0x28, 0x09, 0xe0, 0xb1, 0x18, 0x29, + 0xe3, 0xa0, 0x60, 0x00, 0x41, 0xa0, 0xf0, 0x0e, + 0xe0, 0x92, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, + 0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0xa0, 0x98, 0x83, 0xe3, 0x79, 0x08, 0x02, + 0x30, 0x09, 0x90, 0x04, 0xe0, 0x19, 0x90, 0x83, + 0xe1, 0xa0, 0x88, 0x80, 0xe3, 0x78, 0x08, 0x02, + 0x30, 0x08, 0x80, 0x01, 0xe0, 0x18, 0x80, 0x80, + 0x4a, 0x00, 0x00, 0x1f, 0xe3, 0x19, 0x01, 0x02, + 0x1a, 0x00, 0x00, 0x2f, 0xe1, 0x91, 0x80, 0x02, + 0x11, 0x94, 0x80, 0x05, 0x0a, 0x00, 0x00, 0x13, + 0xe0, 0x11, 0x60, 0x80, 0x43, 0xc1, 0x11, 0x02, + 0x42, 0x80, 0x00, 0x01, 0xe0, 0x14, 0x60, 0x83, + 0x43, 0xc4, 0x41, 0x02, 0x42, 0x83, 0x30, 0x01, + 0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, + 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, + 0xe0, 0x88, 0x30, 0x09, 0xe2, 0x43, 0x3c, 0x3f, + 0xe2, 0x43, 0x30, 0xfe, 0xe9, 0x2d, 0x40, 0x00, + 0xe3, 0x11, 0x01, 0x02, 0x0b, 0x00, 0x06, 0x7c, + 0xe3, 0x14, 0x01, 0x02, 0x0b, 0x00, 0x06, 0x93, + 0xe8, 0xbd, 0x40, 0x00, 0xea, 0xff, 0xff, 0x44, + 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, + 0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x20, 0x00, + 0xe3, 0xa0, 0x30, 0x00, 0xe3, 0xa0, 0x60, 0x00, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x19, 0x01, 0x02, + 0x0a, 0x00, 0x00, 0x09, 0xe1, 0x82, 0x80, 0x81, + 0xe1, 0x88, 0x80, 0x05, 0xe1, 0x98, 0x80, 0x84, + 0x1a, 0x00, 0x06, 0xbc, 0xe0, 0x20, 0x80, 0x03, + 0xe2, 0x08, 0x81, 0x02, 0xe2, 0x8f, 0x00, 0x44, + 0xe8, 0x90, 0x00, 0x07, 0xe1, 0x80, 0x00, 0x08, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x92, 0x80, 0x81, + 0x1a, 0x00, 0x06, 0xc5, 0xe1, 0x94, 0x80, 0x05, + 0x1a, 0xff, 0xff, 0xf5, 0xe3, 0x80, 0x04, 0x61, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x95, 0x80, 0x84, + 0x1a, 0x00, 0x06, 0xb6, 0xe1, 0x91, 0x80, 0x02, + 0x1a, 0xff, 0xff, 0xef, 0xe3, 0x80, 0x04, 0x61, + 0xe1, 0xa0, 0xf0, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x4b, 0xf0, + 0xe5, 0x9f, 0x20, 0x6c, 0xe5, 0x92, 0x10, 0x00, + 0xe1, 0xa0, 0xc1, 0x83, 0xe1, 0xa0, 0xcd, 0xac, + 0xe1, 0x81, 0x10, 0x0c, 0xe5, 0x82, 0x10, 0x00, + 0xe3, 0x13, 0x03, 0x01, 0x1a, 0x00, 0x00, 0x05, + 0xe3, 0x13, 0x04, 0x02, 0x1a, 0x00, 0x00, 0x07, + 0xe3, 0x11, 0x08, 0x01, 0x0a, 0x00, 0x00, 0x44, + 0xe2, 0x8f, 0x00, 0x54, 0xea, 0x00, 0x00, 0x06, + 0xe3, 0x11, 0x07, 0x01, 0x0a, 0x00, 0x00, 0x34, + 0xe2, 0x8f, 0x00, 0x74, 0xea, 0x00, 0x00, 0x02, + 0xe3, 0x11, 0x08, 0x02, 0x0a, 0x00, 0x00, 0x30, + 0xe2, 0x8f, 0x00, 0x8c, 0xe5, 0x9f, 0x10, 0x1c, + 0xe2, 0x4e, 0xe0, 0x04, 0xe5, 0x81, 0xe0, 0x3c, + 0xe3, 0xa0, 0xec, 0xde, 0xe3, 0x8e, 0xe0, 0xad, + 0xe1, 0x8e, 0xe8, 0x0e, 0xe8, 0x81, 0x7f, 0xff, + 0xea, 0x00, 0x00, 0x01, 0x2e, 0x08, 0x23, 0x5c, + 0x2e, 0x08, 0x23, 0x60, 0xe5, 0x9f, 0xc1, 0x2c, + 0xe3, 0x5c, 0x00, 0x00, 0x11, 0x2f, 0xff, 0x1c, + 0xe6, 0x00, 0x00, 0x10, 0x80, 0x00, 0x02, 0x00, + 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x45, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3a, 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x00, 0x80, 0x00, 0x02, 0x01, + 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x45, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3a, 0x20, 0x4f, 0x76, 0x65, 0x72, 0x66, 0x6c, + 0x6f, 0x77, 0x00, 0x00, 0x80, 0x00, 0x02, 0x02, + 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x45, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3a, 0x20, 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, + 0x20, 0x42, 0x79, 0x20, 0x5a, 0x65, 0x72, 0x6f, + 0x00, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x21, 0x02, + 0xe3, 0x13, 0x07, 0x0f, 0x1a, 0x00, 0x00, 0x13, + 0xe3, 0x13, 0x05, 0x02, 0x12, 0x8f, 0x00, 0x0c, + 0x18, 0x90, 0x00, 0x03, 0x05, 0x9f, 0x00, 0x0c, + 0xe1, 0x80, 0x00, 0x02, 0xe1, 0x2f, 0xff, 0x1e, + 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0xe3, 0x13, 0x07, 0x0f, + 0x12, 0x00, 0x21, 0x02, 0x1a, 0x00, 0x00, 0x07, + 0xe3, 0x13, 0x05, 0x02, 0x12, 0x8f, 0x00, 0x08, + 0x18, 0x90, 0x00, 0x03, 0x05, 0x9f, 0x00, 0x08, + 0xe1, 0x2f, 0xff, 0x1e, 0x7f, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, + 0xe3, 0x13, 0x07, 0x02, 0x13, 0xa0, 0x00, 0x00, + 0x13, 0xa0, 0x10, 0x00, 0x11, 0x2f, 0xff, 0x1e, + 0xe3, 0x13, 0x07, 0x01, 0x13, 0xe0, 0x00, 0x00, + 0x13, 0xe0, 0x10, 0x00, 0x11, 0x2f, 0xff, 0x1e, + 0xe3, 0x13, 0x06, 0x01, 0x13, 0xa0, 0x00, 0x00, + 0x13, 0xa0, 0x11, 0x02, 0x03, 0xa0, 0x01, 0x02, + 0xe3, 0x32, 0x01, 0x02, 0x11, 0xe0, 0x00, 0x00, + 0x11, 0xe0, 0x10, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0x2e, 0x01, 0xfb, 0xe5, 0xe3, 0x10, 0x02, 0x06, + 0x1a, 0x00, 0x00, 0x0d, 0xe1, 0xb0, 0x80, 0x86, + 0x0a, 0x00, 0x00, 0x0d, 0x22, 0x92, 0x20, 0x01, + 0x22, 0x91, 0x10, 0x01, 0x23, 0xa0, 0x11, 0x02, + 0xe2, 0xb3, 0x30, 0x00, 0x4a, 0x00, 0x00, 0x0a, + 0xe2, 0x83, 0xc0, 0x01, 0xe3, 0xcc, 0xc1, 0x01, + 0xe3, 0x5c, 0x09, 0x02, 0xc3, 0xa0, 0x33, 0x19, + 0xe2, 0x00, 0x01, 0x02, 0xe1, 0x83, 0x00, 0x00, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0xa0, 0x30, 0x00, + 0xe1, 0xa0, 0xf0, 0x0e, 0x21, 0xb0, 0x80, 0xa2, + 0xea, 0xff, 0xff, 0xef, 0xe3, 0x11, 0x01, 0x02, + 0x1a, 0x00, 0x00, 0x04, 0xe3, 0xa0, 0x10, 0x00, + 0xe3, 0xa0, 0x20, 0x00, 0xe2, 0x00, 0x01, 0x02, + 0xe3, 0xa0, 0x30, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0xb0, 0xc8, 0x21, 0x01, 0xa0, 0xc8, 0x22, + 0x01, 0x8c, 0x18, 0x01, 0x02, 0x83, 0x30, 0x10, + 0xe1, 0xb0, 0xcc, 0x21, 0x01, 0xa0, 0xcc, 0x22, + 0x01, 0x8c, 0x14, 0x01, 0x02, 0x83, 0x30, 0x08, + 0xe1, 0xb0, 0xce, 0x21, 0x01, 0xa0, 0xce, 0x22, + 0x01, 0x8c, 0x12, 0x01, 0x02, 0x83, 0x30, 0x04, + 0xe1, 0xb0, 0xcf, 0x21, 0x01, 0xa0, 0xcf, 0x22, + 0x01, 0x8c, 0x11, 0x01, 0x02, 0x83, 0x30, 0x02, + 0xe1, 0xb0, 0xcf, 0xa1, 0x01, 0xa0, 0xcf, 0xa2, + 0x01, 0x8c, 0x10, 0x81, 0x02, 0x83, 0x30, 0x01, + 0xe1, 0xb0, 0x30, 0x03, 0x4a, 0xff, 0xff, 0xe4, + 0x5a, 0xff, 0xff, 0xda, 0xe3, 0x11, 0x01, 0x02, + 0x01, 0xa0, 0xf0, 0x0e, 0xe9, 0x2d, 0x40, 0x08, + 0xe3, 0xd1, 0x11, 0x02, 0x0a, 0x00, 0x00, 0x15, + 0xe1, 0xb0, 0x38, 0x21, 0x01, 0xa0, 0x18, 0x01, + 0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, + 0xe1, 0xb0, 0x3c, 0x21, 0x01, 0xa0, 0x14, 0x01, + 0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x3e, 0x21, + 0x01, 0xa0, 0x12, 0x01, 0x02, 0x8c, 0xc0, 0x04, + 0xe1, 0xb0, 0x3f, 0x21, 0x01, 0xa0, 0x11, 0x01, + 0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x3f, 0xa1, + 0x01, 0xa0, 0x10, 0x81, 0x02, 0x8c, 0xc0, 0x01, + 0xe2, 0x6c, 0x30, 0x20, 0xe1, 0x81, 0x13, 0x32, + 0xe1, 0xa0, 0x2c, 0x12, 0xe0, 0x40, 0x00, 0x0c, + 0xe2, 0x80, 0x00, 0x01, 0xe8, 0xbd, 0x80, 0x08, + 0xe1, 0xb0, 0x38, 0x22, 0x01, 0xa0, 0x28, 0x02, + 0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, + 0xe1, 0xb0, 0x3c, 0x22, 0x01, 0xa0, 0x24, 0x02, + 0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x3e, 0x22, + 0x01, 0xa0, 0x22, 0x02, 0x02, 0x8c, 0xc0, 0x04, + 0xe1, 0xb0, 0x3f, 0x22, 0x01, 0xa0, 0x21, 0x02, + 0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x3f, 0xa2, + 0x01, 0xa0, 0x20, 0x82, 0x02, 0x8c, 0xc0, 0x01, + 0xe1, 0xa0, 0x10, 0x02, 0xe3, 0xa0, 0x20, 0x00, + 0xe2, 0x40, 0x00, 0x1f, 0xe0, 0x40, 0x00, 0x0c, + 0xe8, 0xbd, 0x80, 0x08, 0xe3, 0x14, 0x01, 0x02, + 0x01, 0xa0, 0xf0, 0x0e, 0xe9, 0x2d, 0x40, 0x01, + 0xe3, 0xd4, 0x41, 0x02, 0x0a, 0x00, 0x00, 0x15, + 0xe1, 0xb0, 0x08, 0x24, 0x01, 0xa0, 0x48, 0x04, + 0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, + 0xe1, 0xb0, 0x0c, 0x24, 0x01, 0xa0, 0x44, 0x04, + 0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x0e, 0x24, + 0x01, 0xa0, 0x42, 0x04, 0x02, 0x8c, 0xc0, 0x04, + 0xe1, 0xb0, 0x0f, 0x24, 0x01, 0xa0, 0x41, 0x04, + 0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x0f, 0xa4, + 0x01, 0xa0, 0x40, 0x84, 0x02, 0x8c, 0xc0, 0x01, + 0xe2, 0x6c, 0x00, 0x20, 0xe1, 0x84, 0x40, 0x35, + 0xe1, 0xa0, 0x5c, 0x15, 0xe0, 0x43, 0x30, 0x0c, + 0xe2, 0x83, 0x30, 0x01, 0xe8, 0xbd, 0x80, 0x01, + 0xe1, 0xb0, 0x08, 0x25, 0x01, 0xa0, 0x58, 0x05, + 0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, + 0xe1, 0xb0, 0x0c, 0x25, 0x01, 0xa0, 0x54, 0x05, + 0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x0e, 0x25, + 0x01, 0xa0, 0x52, 0x05, 0x02, 0x8c, 0xc0, 0x04, + 0xe1, 0xb0, 0x0f, 0x25, 0x01, 0xa0, 0x51, 0x05, + 0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x0f, 0xa5, + 0x01, 0xa0, 0x50, 0x85, 0x02, 0x8c, 0xc0, 0x01, + 0xe1, 0xa0, 0x40, 0x05, 0xe3, 0xa0, 0x50, 0x00, + 0xe2, 0x43, 0x30, 0x1f, 0xe0, 0x43, 0x30, 0x0c, + 0xe8, 0xbd, 0x80, 0x01, 0xe1, 0xa0, 0x80, 0x00, + 0xe1, 0xa0, 0x00, 0x03, 0xe1, 0xa0, 0x30, 0x08, + 0xe1, 0xa0, 0x80, 0x01, 0xe1, 0xa0, 0x10, 0x04, + 0xe1, 0xa0, 0x40, 0x08, 0xe1, 0xa0, 0x80, 0x02, + 0xe1, 0xa0, 0x20, 0x05, 0xe1, 0xa0, 0x50, 0x08, + 0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, + 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, + 0xe0, 0x49, 0x30, 0x08, 0xe2, 0x83, 0x3c, 0x3f, + 0xe2, 0x83, 0x30, 0xff, 0xe9, 0x2d, 0x48, 0x89, + 0xe1, 0xa0, 0x08, 0x21, 0xe1, 0xc1, 0x78, 0x00, + 0xe1, 0xa0, 0xb8, 0x22, 0xe1, 0xc2, 0xe8, 0x0b, + 0xe2, 0x8f, 0x6e, 0x36, 0xe7, 0xd6, 0x64, 0x20, + 0xe0, 0x28, 0x66, 0x90, 0xe2, 0x68, 0x85, 0x02, + 0xe0, 0x06, 0x06, 0x98, 0xe1, 0xa0, 0x69, 0xa6, + 0xe2, 0x86, 0x60, 0x02, 0xe1, 0xa0, 0x86, 0xa1, + 0xe0, 0x29, 0x66, 0x98, 0xe2, 0x69, 0x92, 0x02, + 0xe1, 0xa0, 0x88, 0x29, 0xe1, 0xc9, 0x98, 0x08, + 0xe0, 0x02, 0x06, 0x99, 0xe0, 0x01, 0x06, 0x98, + 0xe0, 0x81, 0x68, 0x22, 0xe1, 0xa0, 0x63, 0x26, + 0xe1, 0xb0, 0x40, 0xa4, 0xe1, 0xb0, 0x50, 0x65, + 0x33, 0xa0, 0x30, 0x00, 0x23, 0xa0, 0x31, 0x02, + 0xe1, 0xa0, 0x87, 0xa4, 0xe0, 0x09, 0x08, 0x96, + 0xe1, 0xa0, 0x98, 0x29, 0xe0, 0x08, 0x0b, 0x99, + 0xe0, 0x55, 0x50, 0x08, 0xe0, 0x08, 0x09, 0x90, + 0xe0, 0xc4, 0x40, 0x08, 0xe0, 0x08, 0x0e, 0x99, + 0xe0, 0x53, 0x38, 0x08, 0xe0, 0xd5, 0x58, 0x28, + 0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x58, 0x08, + 0x20, 0x55, 0x58, 0x08, 0xe0, 0xc4, 0x48, 0x28, + 0xe1, 0xa0, 0x18, 0x09, 0xe1, 0xa0, 0x81, 0x24, + 0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29, + 0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x53, 0x39, 0x88, + 0xe0, 0xd5, 0x56, 0xa8, 0xe0, 0x08, 0x09, 0x90, + 0x30, 0x45, 0x59, 0x88, 0x20, 0x55, 0x59, 0x88, + 0xe0, 0xc4, 0x46, 0xa8, 0xe0, 0x08, 0x0e, 0x99, + 0xe0, 0x53, 0x31, 0x88, 0xe0, 0xd5, 0x5e, 0xa8, + 0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x51, 0x88, + 0x20, 0x55, 0x51, 0x88, 0xe0, 0xc4, 0x4e, 0xa8, + 0xe1, 0xa0, 0x4d, 0x04, 0xe1, 0x84, 0x43, 0x25, + 0xe1, 0xa0, 0x5d, 0x05, 0xe1, 0x85, 0x53, 0x23, + 0xe1, 0xa0, 0x3d, 0x03, 0xe0, 0x81, 0x11, 0x89, + 0xe5, 0x9d, 0x80, 0x0c, 0xe3, 0x18, 0x00, 0x01, + 0x1a, 0x00, 0x00, 0x94, 0xe1, 0xa0, 0x87, 0xa4, + 0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29, + 0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x55, 0x50, 0x08, + 0xe0, 0x08, 0x09, 0x90, 0xe0, 0xc4, 0x40, 0x08, + 0xe0, 0x08, 0x0e, 0x99, 0xe0, 0x53, 0x38, 0x08, + 0xe0, 0xd5, 0x58, 0x28, 0xe0, 0x08, 0x07, 0x99, + 0x30, 0x45, 0x58, 0x08, 0x20, 0x55, 0x58, 0x08, + 0xe0, 0xc4, 0x48, 0x28, 0xe1, 0xa0, 0x2b, 0x09, + 0xe0, 0x81, 0x15, 0x29, 0xe1, 0xa0, 0x81, 0x24, + 0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29, + 0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x53, 0x39, 0x88, + 0xe0, 0xd5, 0x56, 0xa8, 0xe0, 0x08, 0x09, 0x90, + 0x30, 0x45, 0x59, 0x88, 0x20, 0x55, 0x59, 0x88, + 0xe0, 0xc4, 0x46, 0xa8, 0xe0, 0x08, 0x0e, 0x99, + 0xe0, 0x53, 0x31, 0x88, 0xe0, 0xd5, 0x5e, 0xa8, + 0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x51, 0x88, + 0x20, 0x55, 0x51, 0x88, 0xe0, 0xc4, 0x4e, 0xa8, + 0xe1, 0xa0, 0x4d, 0x04, 0xe1, 0x84, 0x43, 0x25, + 0xe1, 0xa0, 0x5d, 0x05, 0xe1, 0x85, 0x53, 0x23, + 0xe1, 0xa0, 0x3d, 0x03, 0xe0, 0x92, 0x24, 0x89, + 0xe2, 0xa1, 0x10, 0x00, 0xe5, 0x9d, 0x80, 0x0c, + 0xe3, 0x18, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x3f, + 0xe1, 0xa0, 0x87, 0xa4, 0xe0, 0x09, 0x08, 0x96, + 0xe1, 0xa0, 0x98, 0x29, 0xe0, 0x08, 0x0b, 0x99, + 0xe0, 0x55, 0x50, 0x08, 0xe0, 0x08, 0x09, 0x90, + 0xe0, 0xc4, 0x40, 0x08, 0xe0, 0x08, 0x0e, 0x99, + 0xe0, 0x53, 0x38, 0x08, 0xe0, 0xd5, 0x58, 0x28, + 0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x58, 0x08, + 0x20, 0x55, 0x58, 0x08, 0xe0, 0xc4, 0x48, 0x28, + 0xe1, 0xa0, 0x47, 0x04, 0xe1, 0x84, 0x49, 0x25, + 0xe1, 0xa0, 0x57, 0x05, 0xe1, 0x85, 0x59, 0x23, + 0xe1, 0xa0, 0x37, 0x03, 0xe1, 0xa0, 0x6e, 0x09, + 0xe0, 0x92, 0x22, 0x29, 0xe2, 0xa1, 0x10, 0x00, + 0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b, + 0xe3, 0xa0, 0xe0, 0x00, 0xe0, 0x55, 0x90, 0x07, + 0xe0, 0xd4, 0x80, 0x00, 0x21, 0xa0, 0x50, 0x09, + 0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e, + 0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03, + 0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04, + 0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07, + 0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00, + 0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, + 0xe0, 0xae, 0xe0, 0x0e, 0xe3, 0xa0, 0xb0, 0x00, + 0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, + 0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b, + 0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, + 0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09, + 0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e, + 0xe1, 0x94, 0x80, 0x05, 0x13, 0x86, 0x60, 0x01, + 0xe0, 0x96, 0x6e, 0x0e, 0xe2, 0xb2, 0x20, 0x00, + 0xe2, 0xb1, 0x10, 0x00, 0x48, 0xbd, 0x88, 0x89, + 0xe8, 0xbd, 0x48, 0x89, 0xe0, 0x96, 0x60, 0x06, + 0xe0, 0xb2, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, + 0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b, + 0xe3, 0xa0, 0xe0, 0x00, 0xe0, 0x93, 0x30, 0x03, + 0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xa4, 0x40, 0x04, + 0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, + 0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, + 0xe0, 0xae, 0xe0, 0x0e, 0xe3, 0xa0, 0xb0, 0x00, + 0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, + 0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b, + 0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, + 0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09, + 0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e, + 0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03, + 0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04, + 0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07, + 0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00, + 0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, + 0xe0, 0xae, 0xe0, 0x0e, 0xe1, 0x84, 0x60, 0x05, + 0xe0, 0x92, 0x24, 0x8e, 0xe2, 0xb1, 0x10, 0x00, + 0x48, 0xbd, 0x88, 0x89, 0xe8, 0xbd, 0x48, 0x89, + 0xe0, 0x92, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, + 0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b, + 0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, + 0xe0, 0xa4, 0x40, 0x04, 0xe0, 0x55, 0x90, 0x07, + 0xe0, 0xd4, 0x80, 0x00, 0x21, 0xa0, 0x50, 0x09, + 0x21, 0xa0, 0x40, 0x08, 0x22, 0x81, 0x10, 0x20, + 0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03, + 0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04, + 0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07, + 0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00, + 0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, + 0x22, 0x81, 0x10, 0x10, 0xe3, 0xa0, 0xb0, 0x00, + 0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, + 0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b, + 0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, + 0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09, + 0x21, 0xa0, 0x40, 0x08, 0x22, 0x81, 0x10, 0x08, + 0xe1, 0x84, 0x60, 0x05, 0xe3, 0xa0, 0x20, 0x00, + 0xe3, 0x31, 0x00, 0x00, 0x48, 0xbd, 0x88, 0x89, + 0xe8, 0xbd, 0x48, 0x89, 0xe1, 0xa0, 0x10, 0x81, + 0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, + 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, + 0x79, 0x78, 0x77, 0x76, 0x76, 0x75, 0x74, 0x73, + 0x72, 0x71, 0x71, 0x70, 0x6f, 0x6e, 0x6e, 0x6d, + 0x6c, 0x6c, 0x6b, 0x6a, 0x6a, 0x69, 0x68, 0x68, + 0x67, 0x66, 0x66, 0x65, 0x64, 0x64, 0x63, 0x63, + 0x62, 0x61, 0x61, 0x60, 0x60, 0x5f, 0x5f, 0x5e, + 0x5e, 0x5d, 0x5d, 0x5c, 0x5c, 0x5b, 0x5b, 0x5a, + 0x5a, 0x59, 0x59, 0x58, 0x58, 0x57, 0x57, 0x56, + 0x56, 0x55, 0x55, 0x55, 0x54, 0x54, 0x53, 0x53, + 0x52, 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x50, + 0x4f, 0x4f, 0x4f, 0x4e, 0x4e, 0x4d, 0x4d, 0x4d, + 0x4c, 0x4c, 0x4c, 0x4b, 0x4b, 0x4b, 0x4a, 0x4a, + 0x4a, 0x49, 0x49, 0x49, 0x48, 0x48, 0x48, 0x47, + 0x47, 0x47, 0x47, 0x46, 0x46, 0x46, 0x45, 0x45, + 0x45, 0x44, 0x44, 0x44, 0x44, 0x43, 0x43, 0x43, + 0x43, 0x42, 0x42, 0x42, 0x42, 0x41, 0x41, 0x41, + 0xe1, 0xa0, 0x98, 0x83, 0xe3, 0x79, 0x08, 0x02, + 0x30, 0x09, 0x90, 0x04, 0xe0, 0x19, 0x90, 0x83, + 0xe1, 0xa0, 0x88, 0x80, 0xe3, 0x78, 0x08, 0x02, + 0x30, 0x08, 0x80, 0x01, 0xe0, 0x18, 0x80, 0x80, + 0x4a, 0x00, 0x00, 0x20, 0xe3, 0x19, 0x01, 0x02, + 0x1a, 0x00, 0x00, 0x32, 0xe3, 0x1b, 0x00, 0x04, + 0x1a, 0x00, 0x00, 0x08, 0xe1, 0xa0, 0x80, 0x00, + 0xe1, 0xa0, 0x00, 0x03, 0xe1, 0xa0, 0x30, 0x08, + 0xe1, 0xa0, 0x80, 0x01, 0xe1, 0xa0, 0x10, 0x04, + 0xe1, 0xa0, 0x40, 0x08, 0xe1, 0xa0, 0x80, 0x02, + 0xe1, 0xa0, 0x20, 0x05, 0xe1, 0xa0, 0x50, 0x08, + 0xe0, 0x11, 0x60, 0x80, 0x43, 0xc1, 0x11, 0x02, + 0x42, 0x80, 0x00, 0x01, 0xe0, 0x14, 0x60, 0x83, + 0x43, 0xc4, 0x41, 0x02, 0x42, 0x83, 0x30, 0x01, + 0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, + 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, + 0xe0, 0x49, 0x30, 0x08, 0xe2, 0x83, 0x3c, 0x3f, + 0xe2, 0x83, 0x30, 0xff, 0xe9, 0x2d, 0x40, 0x00, + 0xe3, 0x11, 0x01, 0x02, 0x0b, 0x00, 0x04, 0x30, + 0xe3, 0x14, 0x01, 0x02, 0x0b, 0x00, 0x04, 0x15, + 0xe8, 0xbd, 0x40, 0x00, 0xea, 0xff, 0xfe, 0xb6, + 0xe3, 0x19, 0x01, 0x02, 0x0a, 0x00, 0x00, 0x05, + 0xe1, 0x82, 0x80, 0x81, 0xe1, 0x88, 0x80, 0x05, + 0xe1, 0x98, 0x80, 0x84, 0x1a, 0x00, 0x04, 0x45, + 0xe3, 0x80, 0x04, 0x61, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0x92, 0x80, 0x81, 0x1a, 0x00, 0x04, 0x52, + 0xe0, 0x20, 0x80, 0x03, 0xe2, 0x08, 0x81, 0x02, + 0xe3, 0x1b, 0x00, 0x04, 0x02, 0x8f, 0x00, 0x50, + 0x12, 0x8f, 0x00, 0x40, 0xe8, 0x90, 0x00, 0x07, + 0xe1, 0x80, 0x00, 0x08, 0xe3, 0xa0, 0x30, 0x00, + 0xe3, 0xa0, 0x60, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0x95, 0x80, 0x84, 0x1a, 0x00, 0x04, 0x3d, + 0xe0, 0x20, 0x80, 0x03, 0xe2, 0x08, 0x81, 0x02, + 0xe3, 0x1b, 0x00, 0x04, 0x12, 0x8f, 0x00, 0x20, + 0x02, 0x8f, 0x00, 0x10, 0xe8, 0x90, 0x00, 0x07, + 0xe1, 0x80, 0x00, 0x08, 0xe3, 0xa0, 0x30, 0x00, + 0xe3, 0xa0, 0x60, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7f, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe9, 0x2d, 0x40, 0x00, 0xe1, 0xa0, 0x68, 0x80, + 0xe0, 0x56, 0x88, 0x83, 0xe0, 0x20, 0xe0, 0x03, + 0xe2, 0x00, 0x01, 0x02, 0xe1, 0xa0, 0x38, 0xa6, + 0x8a, 0x00, 0x00, 0x1a, 0x01, 0xa0, 0x90, 0x08, + 0x0a, 0x00, 0x00, 0x2e, 0xe2, 0x68, 0x60, 0x00, + 0xe1, 0xa0, 0x68, 0xa6, 0xe0, 0x83, 0x30, 0x06, + 0xe1, 0xa0, 0x92, 0xa6, 0xe1, 0xc6, 0x62, 0x89, + 0xe3, 0x59, 0x00, 0x02, 0x33, 0x39, 0x00, 0x00, + 0xe2, 0x66, 0x90, 0x20, 0xe1, 0xa0, 0x89, 0x12, + 0xe1, 0xa0, 0x26, 0x32, 0xe1, 0x82, 0x29, 0x11, + 0xe1, 0xa0, 0x16, 0x31, 0x0a, 0x00, 0x00, 0x03, + 0x11, 0x88, 0x81, 0x08, 0x11, 0x82, 0x81, 0x28, + 0x11, 0xa0, 0x20, 0x01, 0x13, 0xa0, 0x10, 0x00, + 0x3a, 0x00, 0x00, 0x04, 0x21, 0x88, 0x80, 0x02, + 0x21, 0x88, 0x81, 0x08, 0x21, 0x81, 0x81, 0x28, + 0x23, 0xa0, 0x20, 0x00, 0x23, 0xa0, 0x10, 0x00, + 0xe3, 0xa0, 0x90, 0x00, 0xea, 0x00, 0x00, 0x15, + 0xe1, 0xa0, 0x68, 0xa8, 0xe1, 0xa0, 0x82, 0xa6, + 0xe1, 0xc6, 0x62, 0x88, 0xe3, 0x58, 0x00, 0x02, + 0x33, 0x38, 0x00, 0x00, 0xe2, 0x66, 0x80, 0x20, + 0xe1, 0xa0, 0x98, 0x15, 0xe1, 0xa0, 0x56, 0x35, + 0xe1, 0x85, 0x58, 0x14, 0xe1, 0xa0, 0x46, 0x34, + 0x0a, 0x00, 0x00, 0x03, 0x11, 0x89, 0x91, 0x09, + 0x11, 0x85, 0x91, 0x29, 0x11, 0xa0, 0x50, 0x04, + 0x13, 0xa0, 0x40, 0x00, 0x3a, 0x00, 0x00, 0x04, + 0x21, 0x89, 0x90, 0x05, 0x21, 0x89, 0x91, 0x09, + 0x21, 0x84, 0x91, 0x29, 0x23, 0xa0, 0x50, 0x00, + 0x23, 0xa0, 0x40, 0x00, 0xe3, 0xa0, 0x80, 0x00, + 0xe3, 0x1e, 0x01, 0x02, 0x1a, 0x00, 0x00, 0x09, + 0xe0, 0x98, 0x60, 0x09, 0xe0, 0xb2, 0x20, 0x05, + 0xe0, 0xb1, 0x10, 0x04, 0x38, 0xbd, 0x80, 0x00, + 0xe2, 0x83, 0x30, 0x01, 0xe1, 0xb0, 0x10, 0x61, + 0xe1, 0xb0, 0x20, 0x62, 0xe1, 0x86, 0x60, 0x86, + 0xe1, 0xa0, 0x60, 0x66, 0xe8, 0xbd, 0x80, 0x00, + 0xe0, 0x58, 0x60, 0x09, 0xe0, 0xd2, 0x20, 0x05, + 0xe0, 0xd1, 0x10, 0x04, 0x2a, 0x00, 0x00, 0x03, + 0xe2, 0x20, 0x01, 0x02, 0xe2, 0x76, 0x60, 0x00, + 0xe2, 0xf2, 0x20, 0x00, 0xe2, 0xe1, 0x10, 0x00, + 0xe3, 0x11, 0x01, 0x02, 0x18, 0xbd, 0x80, 0x00, + 0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, + 0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, + 0xe3, 0x11, 0x01, 0x02, 0x18, 0xbd, 0x80, 0x00, + 0xe1, 0x91, 0xe0, 0x02, 0x1b, 0x00, 0x03, 0x7e, + 0x18, 0xbd, 0x80, 0x00, 0xe3, 0xa0, 0x00, 0x00, + 0xe3, 0xa0, 0x10, 0x00, 0xe2, 0x8d, 0xd0, 0x04, + 0xe8, 0xbd, 0x4b, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x98, 0x83, 0xe3, 0x79, 0x08, 0x02, + 0x30, 0x09, 0x90, 0x04, 0xe0, 0x19, 0x90, 0x83, + 0xe1, 0xa0, 0x88, 0x80, 0xe3, 0x78, 0x08, 0x02, + 0x30, 0x08, 0x80, 0x01, 0xe0, 0x18, 0x80, 0x80, + 0x4a, 0x00, 0x00, 0x14, 0xe3, 0x19, 0x01, 0x02, + 0x1a, 0x00, 0x00, 0x22, 0xe9, 0x2d, 0x40, 0x00, + 0xe0, 0x11, 0x60, 0x80, 0x43, 0xc1, 0x11, 0x02, + 0x42, 0x80, 0x00, 0x01, 0xe0, 0x14, 0x60, 0x83, + 0x43, 0xc4, 0x41, 0x02, 0x42, 0x83, 0x30, 0x01, + 0xe3, 0x10, 0x01, 0x01, 0x11, 0xb0, 0x68, 0x80, + 0x1b, 0x00, 0x02, 0xe6, 0xe3, 0x13, 0x01, 0x01, + 0x11, 0xb0, 0x68, 0x83, 0x1b, 0x00, 0x03, 0x1d, + 0xeb, 0xff, 0xff, 0x8a, 0xe3, 0x11, 0x01, 0x02, + 0x18, 0xbd, 0x80, 0x00, 0xe1, 0x91, 0xe0, 0x02, + 0x1b, 0x00, 0x03, 0x5b, 0xe8, 0xbd, 0x80, 0x00, + 0xe3, 0x19, 0x01, 0x02, 0x0a, 0x00, 0x00, 0x09, + 0xe1, 0x82, 0x80, 0x81, 0xe1, 0x88, 0x80, 0x05, + 0xe1, 0x98, 0x80, 0x84, 0x1a, 0x00, 0x03, 0xa5, + 0xe0, 0x23, 0x85, 0x0b, 0xe0, 0x38, 0x80, 0x00, + 0x52, 0x00, 0x81, 0x02, 0x5a, 0x00, 0x00, 0x0a, + 0xe3, 0x80, 0x04, 0x61, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0x92, 0x80, 0x81, 0x1a, 0x00, 0x03, 0xae, + 0xe2, 0x00, 0x81, 0x02, 0xea, 0x00, 0x00, 0x04, + 0xe1, 0x95, 0x80, 0x84, 0x1a, 0x00, 0x03, 0xa1, + 0xe2, 0x03, 0x81, 0x02, 0xe3, 0x1b, 0x06, 0x02, + 0x12, 0x28, 0x81, 0x02, 0xe3, 0x1b, 0x06, 0x01, + 0x12, 0x28, 0x81, 0x02, 0xe2, 0x8f, 0x00, 0x14, + 0xe8, 0x90, 0x00, 0x07, 0xe1, 0x80, 0x00, 0x08, + 0xe1, 0xa0, 0xf0, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x49, 0x02, + 0xf0, 0x00, 0xf9, 0x2a, 0xbc, 0x08, 0x47, 0x18, + 0xff, 0xff, 0xff, 0xfd, 0xb5, 0x80, 0x1c, 0x07, + 0x28, 0x0a, 0xd2, 0x14, 0xa3, 0x01, 0x5c, 0x1b, + 0x00, 0x5b, 0x44, 0x9f, 0x10, 0x04, 0x10, 0x06, + 0x08, 0x0a, 0x0c, 0x10, 0x0e, 0x0e, 0xa0, 0x0f, + 0xe0, 0x0c, 0xa0, 0x1a, 0xe0, 0x0a, 0xa0, 0x33, + 0xe0, 0x08, 0xa0, 0x3f, 0xe0, 0x06, 0xa0, 0x4b, + 0xe0, 0x04, 0xa0, 0x52, 0xe0, 0x02, 0x1c, 0x38, + 0xf0, 0x00, 0xff, 0x71, 0x21, 0x03, 0xf0, 0x00, + 0xf9, 0x27, 0x2f, 0x04, 0xd1, 0x05, 0x20, 0x01, + 0xf7, 0xfd, 0xfc, 0x2c, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0xf7, 0xfe, 0xfc, 0xd3, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x41, 0x62, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x61, + 0x62, 0x6f, 0x72, 0x74, 0x28, 0x29, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x6c, 0x6c, 0x65, + 0x67, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, + 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x75, + 0x70, 0x74, 0x65, 0x64, 0x29, 0x0a, 0x5b, 0x69, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x65, 0x6d, 0x75, + 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x3f, + 0x5d, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x72, 0x75, 0x70, 0x74, 0x20, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x20, 0x2d, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, + 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x77, 0x69, + 0x6c, 0x64, 0x6c, 0x79, 0x20, 0x6f, 0x75, 0x74, + 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x73, 0x29, 0x00, 0x00, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x73, 0x65, 0x72, + 0x2d, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x00, + 0xb5, 0x00, 0x20, 0x01, 0x49, 0x05, 0x70, 0x08, + 0xa0, 0x05, 0x21, 0x03, 0xf0, 0x00, 0xf8, 0x78, + 0x20, 0x64, 0xf7, 0xfd, 0xfb, 0x7f, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x23, 0x48, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x76, + 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x0a, 0x00, + 0xb5, 0x00, 0x28, 0x07, 0xd1, 0x03, 0xf7, 0xff, + 0xff, 0xe3, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, + 0xff, 0x19, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, + 0xf7, 0xff, 0xff, 0xf2, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x90, 0x28, 0x00, 0xdd, 0x01, 0x28, 0x0b, + 0xdb, 0x05, 0x20, 0x03, 0x49, 0x0b, 0x60, 0x08, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x87, + 0x4b, 0x09, 0x59, 0xd9, 0x4a, 0x09, 0x42, 0x91, + 0xd1, 0x02, 0xf7, 0xff, 0xff, 0xdd, 0xe0, 0x05, + 0x4c, 0x07, 0x42, 0xa1, 0xd0, 0x02, 0x51, 0xda, + 0xf7, 0xfb, 0xfe, 0x9c, 0x20, 0x00, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0x30, + 0x2e, 0x08, 0xd2, 0x18, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x28, 0x00, 0xdd, 0x09, + 0x28, 0x0b, 0xda, 0x07, 0x00, 0x80, 0x49, 0x04, + 0x58, 0x08, 0x49, 0x04, 0x42, 0x88, 0xd0, 0x01, + 0x20, 0x01, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x2e, 0x08, 0xd2, 0x18, 0xff, 0xff, 0xff, 0xff, + 0x28, 0x00, 0xdd, 0x01, 0x28, 0x0b, 0xdb, 0x01, + 0x48, 0x03, 0x47, 0x70, 0x00, 0x83, 0x4a, 0x03, + 0x58, 0xd0, 0x50, 0xd1, 0x47, 0x70, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xfe, 0x2e, 0x08, 0xd2, 0x18, + 0xb5, 0x90, 0x27, 0x01, 0x4c, 0x05, 0x1c, 0x38, + 0x1c, 0x21, 0xf7, 0xff, 0xff, 0xe9, 0x37, 0x01, + 0x2f, 0x0b, 0xdb, 0xf8, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0x48, 0x12, + 0x28, 0x00, 0xd0, 0x09, 0x48, 0x11, 0x78, 0x00, + 0x28, 0x00, 0xd1, 0x05, 0x1c, 0x38, 0x1c, 0x21, + 0xf0, 0x00, 0xfb, 0x2c, 0x28, 0x00, 0xd1, 0x13, + 0x08, 0x60, 0xd3, 0x02, 0x20, 0x0a, 0xf0, 0x00, + 0xf8, 0xd3, 0x78, 0x38, 0x28, 0x00, 0xd0, 0x06, + 0x78, 0x38, 0x37, 0x01, 0xf0, 0x00, 0xf8, 0xcc, + 0x78, 0x38, 0x28, 0x00, 0xd1, 0xf8, 0x08, 0xa0, + 0xd3, 0x02, 0x20, 0x0a, 0xf0, 0x00, 0xf8, 0xc4, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x02, 0x2b, 0xa9, 0x2e, 0x08, 0x23, 0x48, + 0xb5, 0x80, 0xb0, 0x83, 0x90, 0x00, 0x91, 0x01, + 0xf7, 0xfb, 0xfe, 0xf8, 0x90, 0x02, 0x46, 0x69, + 0x20, 0x01, 0xf0, 0x01, 0xf8, 0x49, 0x23, 0x01, + 0x1c, 0x07, 0x42, 0xd8, 0xd1, 0x05, 0x21, 0x00, + 0x20, 0x13, 0xf0, 0x01, 0xf8, 0x41, 0x49, 0x03, + 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x03, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0x30, + 0xb5, 0x80, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, + 0x20, 0x02, 0xf0, 0x01, 0xf8, 0x31, 0x1c, 0x07, + 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, + 0xf8, 0x2b, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, + 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x21, 0x30, 0xb5, 0x80, 0xb0, 0x84, + 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x46, 0x69, + 0x20, 0x05, 0xf0, 0x01, 0xf8, 0x19, 0x1c, 0x07, + 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, + 0xf8, 0x13, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, + 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x21, 0x30, 0xb5, 0x80, 0xb0, 0x84, + 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x93, 0x03, + 0x46, 0x69, 0x20, 0x06, 0xf0, 0x01, 0xf8, 0x00, + 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, + 0xf0, 0x00, 0xff, 0xfa, 0x49, 0x03, 0x60, 0x08, + 0x1c, 0x38, 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x30, + 0xb5, 0x00, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, + 0x20, 0x08, 0xf0, 0x00, 0xff, 0xe9, 0xb0, 0x01, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x69, 0x40, + 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, 0x20, 0x09, + 0xf0, 0x00, 0xff, 0xde, 0xb0, 0x01, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x80, 0xb0, 0x82, 0x90, 0x00, + 0x91, 0x01, 0x46, 0x69, 0x20, 0x0a, 0xf0, 0x00, + 0xff, 0xd3, 0x1c, 0x07, 0xd5, 0x05, 0x21, 0x00, + 0x20, 0x13, 0xf0, 0x00, 0xff, 0xcd, 0x49, 0x03, + 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0x30, + 0xb5, 0x80, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, + 0x20, 0x0b, 0xf0, 0x00, 0xff, 0xbd, 0x1c, 0x07, + 0xd5, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, + 0xff, 0xb7, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, + 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x21, 0x30, 0xb5, 0x00, 0xb0, 0x81, + 0x90, 0x00, 0x46, 0x69, 0x20, 0x0c, 0xf0, 0x00, + 0xff, 0xa7, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x00, 0xb0, 0x83, 0x90, 0x00, 0x91, 0x01, + 0x92, 0x02, 0x46, 0x69, 0x20, 0x0d, 0xf0, 0x00, + 0xff, 0x9b, 0xb0, 0x03, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x01, 0x46, 0x69, 0x20, 0x03, 0xf0, 0x00, + 0xff, 0x93, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x80, 0xb0, 0x82, 0x90, 0x00, 0xf7, 0xfb, + 0xfe, 0x35, 0x90, 0x01, 0x46, 0x69, 0x20, 0x12, + 0xf0, 0x00, 0xff, 0x86, 0x1c, 0x07, 0xd0, 0x05, + 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x80, + 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x02, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x21, 0x30, 0xb5, 0x80, 0xb0, 0x82, + 0x90, 0x00, 0xf7, 0xfb, 0xfe, 0x1b, 0x90, 0x01, + 0x46, 0x69, 0x20, 0x0e, 0xf0, 0x00, 0xff, 0x6c, + 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, + 0xf0, 0x00, 0xff, 0x66, 0x49, 0x03, 0x60, 0x08, + 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x30, + 0xb5, 0x80, 0xb0, 0x84, 0x90, 0x00, 0x1c, 0x0f, + 0xf7, 0xfb, 0xfe, 0x00, 0x90, 0x01, 0x97, 0x02, + 0x1c, 0x38, 0xf7, 0xfb, 0xfd, 0xfb, 0x90, 0x03, + 0x46, 0x69, 0x20, 0x0f, 0xf0, 0x00, 0xff, 0x4c, + 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, + 0xf0, 0x00, 0xff, 0x46, 0x49, 0x03, 0x60, 0x08, + 0x1c, 0x38, 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x30, + 0xb5, 0x80, 0xb0, 0x82, 0x4f, 0x08, 0x97, 0x00, + 0x20, 0xff, 0x30, 0x01, 0x90, 0x01, 0x46, 0x69, + 0x20, 0x15, 0xf0, 0x00, 0xff, 0x31, 0x28, 0x00, + 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x1c, 0x38, + 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xd2, 0x48, 0xb5, 0x00, 0x21, 0x00, + 0x20, 0x10, 0xf0, 0x00, 0xff, 0x21, 0x49, 0x02, + 0x68, 0x09, 0x1a, 0x40, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x23, 0x58, 0xb5, 0x00, 0x21, 0x00, + 0x20, 0x10, 0xf0, 0x00, 0xff, 0x15, 0x49, 0x02, + 0x60, 0x08, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x23, 0x58, 0xb5, 0x80, 0x21, 0x00, + 0x1c, 0x07, 0x20, 0x11, 0xf0, 0x00, 0xff, 0x08, + 0x2f, 0x00, 0xd0, 0x00, 0x60, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x47, 0x70, + 0xb5, 0x80, 0x49, 0x07, 0x68, 0x09, 0xf7, 0xfb, + 0xfc, 0xd9, 0x1c, 0x07, 0xd1, 0x03, 0xa1, 0x05, + 0xa0, 0x05, 0xf0, 0x00, 0xfc, 0xe7, 0x1c, 0x38, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x21, 0x28, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x6f, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x49, 0x2f, 0x4f, 0x20, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, + 0x00, 0x00, 0x00, 0x00, 0x23, 0x80, 0x68, 0xc1, + 0x43, 0x19, 0x60, 0xc1, 0x21, 0x00, 0x60, 0x01, + 0x60, 0x81, 0x47, 0x70, 0xb5, 0xf7, 0x68, 0xd5, + 0x69, 0x56, 0x1c, 0x0c, 0x1c, 0x17, 0x0d, 0x68, + 0xd3, 0x05, 0x23, 0x10, 0x43, 0x1d, 0x1c, 0x30, + 0xf7, 0xff, 0xff, 0x14, 0x61, 0xb8, 0x48, 0x12, + 0x40, 0x28, 0xd0, 0x08, 0x69, 0xb9, 0x1c, 0x30, + 0xf7, 0xff, 0xfe, 0xdf, 0x28, 0x00, 0xdb, 0x10, + 0x4b, 0x0e, 0x40, 0x1d, 0x60, 0xfd, 0x99, 0x00, + 0x1c, 0x30, 0x1c, 0x22, 0x1c, 0x2b, 0xf7, 0xff, + 0xfe, 0x8d, 0x00, 0x41, 0x08, 0x49, 0x1a, 0x61, + 0x69, 0xba, 0x18, 0x51, 0x61, 0xb9, 0x28, 0x00, + 0xd0, 0x08, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xce, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xe7, 0xf9, + 0x00, 0x02, 0x00, 0x10, 0xff, 0xfd, 0xff, 0xef, + 0xb5, 0xb0, 0x48, 0x15, 0x68, 0xc1, 0x4b, 0x15, + 0x40, 0x19, 0x1c, 0x1d, 0x42, 0x99, 0xd1, 0x01, + 0xf0, 0x00, 0xfc, 0xd6, 0x48, 0x12, 0x68, 0xc1, + 0x4b, 0x10, 0x40, 0x19, 0x42, 0xa9, 0xd1, 0x01, + 0xf0, 0x00, 0xfc, 0xce, 0x48, 0x0f, 0x68, 0xc1, + 0x4b, 0x0c, 0x40, 0x19, 0x42, 0xa9, 0xd1, 0x01, + 0xf0, 0x00, 0xfc, 0xc6, 0x27, 0x00, 0x4c, 0x0c, + 0x01, 0xb8, 0x19, 0x00, 0x68, 0xc1, 0x4b, 0x07, + 0x40, 0x19, 0x42, 0xa9, 0xd1, 0x01, 0xf0, 0x00, + 0xfc, 0xbb, 0x37, 0x01, 0x2f, 0x0d, 0xdb, 0xf3, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0xd3, 0x48, 0x00, 0x00, 0x02, 0x02, + 0x2e, 0x08, 0xd3, 0x88, 0x2e, 0x08, 0xd3, 0xc8, + 0x2e, 0x08, 0xd4, 0x08, 0xb5, 0xf0, 0x1c, 0x07, + 0x69, 0x04, 0x6a, 0xc0, 0x68, 0x79, 0x42, 0x88, + 0xd9, 0x00, 0x1c, 0x01, 0x68, 0xf8, 0x4b, 0x13, + 0x40, 0x18, 0x07, 0x82, 0x0f, 0x92, 0x25, 0x00, + 0x60, 0xf8, 0x2a, 0x01, 0xd0, 0x1a, 0x22, 0x82, + 0x40, 0x02, 0x15, 0x1e, 0x2a, 0x02, 0xd1, 0x0a, + 0x0c, 0x40, 0xd3, 0x13, 0x42, 0xa1, 0xd0, 0x0a, + 0x1b, 0x09, 0x1c, 0x20, 0x1c, 0x3a, 0xf7, 0xff, + 0xff, 0x75, 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x30, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x62, 0xfc, + 0x60, 0x7c, 0x60, 0xbd, 0x68, 0xf8, 0x4b, 0x04, + 0x40, 0x18, 0x60, 0xf8, 0x1c, 0x28, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xb5, 0x80, 0x1c, 0x07, + 0x68, 0xc0, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, + 0x60, 0xf8, 0x69, 0xb8, 0x6a, 0xb9, 0x42, 0x88, + 0xd0, 0x0d, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xbe, + 0x68, 0xf8, 0x4b, 0x08, 0x40, 0x18, 0x23, 0x10, + 0x43, 0x18, 0x60, 0xf8, 0x6a, 0xb8, 0x61, 0xb8, + 0x69, 0x38, 0x62, 0xf8, 0x60, 0x78, 0x68, 0xf8, + 0x4b, 0x03, 0x40, 0x18, 0x60, 0xf8, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xbf, 0xbf, 0xb5, 0xf0, 0x1c, 0x07, + 0x69, 0x40, 0xb0, 0x83, 0x90, 0x01, 0x69, 0x38, + 0x90, 0x00, 0x25, 0x00, 0x68, 0xfe, 0x07, 0xb0, + 0xd1, 0x01, 0x43, 0xc0, 0xe0, 0x48, 0x09, 0x30, + 0xd2, 0x40, 0x24, 0x10, 0x1c, 0x38, 0xf0, 0x00, + 0xfc, 0x3f, 0x1c, 0x05, 0x0d, 0x70, 0xd3, 0x1b, + 0x24, 0x00, 0x49, 0x21, 0x91, 0x02, 0x01, 0xa0, + 0x99, 0x02, 0x18, 0x40, 0x42, 0xb8, 0xd0, 0x10, + 0x68, 0xc1, 0x07, 0x8a, 0xd0, 0x0d, 0x69, 0x42, + 0x9b, 0x01, 0x42, 0x9a, 0xd1, 0x09, 0x0d, 0x49, + 0xd3, 0x07, 0x68, 0xc1, 0x4b, 0x19, 0x40, 0x19, + 0x60, 0xc1, 0x68, 0xf8, 0x40, 0x18, 0x60, 0xf8, + 0xe0, 0x02, 0x34, 0x01, 0x2c, 0x10, 0xdb, 0xe6, + 0x2c, 0x10, 0xd1, 0x06, 0x98, 0x01, 0xf7, 0xff, + 0xfd, 0x9b, 0x28, 0x00, 0xda, 0x01, 0x25, 0x00, + 0x43, 0xed, 0x0b, 0x30, 0xd3, 0x04, 0x98, 0x00, + 0x49, 0x0f, 0x68, 0x09, 0xf7, 0xfb, 0xfb, 0xa6, + 0x0d, 0xf0, 0x05, 0xc0, 0x23, 0xa5, 0x05, 0xdb, + 0x42, 0xd8, 0xd1, 0x07, 0x48, 0x0b, 0x28, 0x00, + 0xd0, 0x04, 0x1c, 0x38, 0x1c, 0x29, 0xf7, 0xff, + 0xff, 0xfe, 0x1c, 0x05, 0x22, 0x40, 0x21, 0x00, + 0x1c, 0x38, 0xf7, 0xfb, 0xfc, 0xe7, 0x1c, 0x28, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xd3, 0x48, 0xff, 0xef, 0xff, 0xff, + 0x2e, 0x08, 0x21, 0x2c, 0x00, 0x00, 0x00, 0x00, + 0xb5, 0xf7, 0x1c, 0x10, 0x1c, 0x0c, 0x1c, 0x17, + 0xf7, 0xff, 0xff, 0x98, 0x78, 0x20, 0x34, 0x01, + 0x28, 0x61, 0xd0, 0x09, 0x28, 0x72, 0xd0, 0x04, + 0x28, 0x77, 0xd1, 0x25, 0x26, 0x02, 0x25, 0x04, + 0xe0, 0x04, 0x26, 0x01, 0x25, 0x00, 0xe0, 0x01, + 0x4e, 0x1a, 0x25, 0x08, 0x78, 0x20, 0x34, 0x01, + 0x28, 0x2b, 0xd0, 0x06, 0x28, 0x62, 0xd1, 0x09, + 0x23, 0x04, 0x43, 0x1e, 0x23, 0x01, 0x43, 0x1d, + 0xe7, 0xf4, 0x23, 0x03, 0x43, 0x1e, 0x23, 0x02, + 0x43, 0x1d, 0xe7, 0xef, 0x1f, 0xe0, 0x38, 0x19, + 0x7f, 0xc0, 0x28, 0x74, 0xd1, 0x01, 0x23, 0x10, + 0x43, 0x1d, 0x98, 0x00, 0x1c, 0x29, 0xf7, 0xff, + 0xfd, 0x23, 0x23, 0x01, 0x42, 0xd8, 0xd1, 0x04, + 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x00, 0x60, 0x79, 0x61, 0x39, + 0x21, 0x01, 0x03, 0x09, 0x61, 0x78, 0x61, 0xf9, + 0x60, 0xfe, 0x09, 0x28, 0xd3, 0x04, 0x22, 0x02, + 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xfb, 0xc4, + 0x1c, 0x38, 0xe7, 0xea, 0x00, 0x00, 0x80, 0x02, + 0xb5, 0x90, 0x23, 0x03, 0x4f, 0x08, 0x01, 0x9a, + 0x19, 0xd2, 0x68, 0xd4, 0x07, 0xa4, 0xd1, 0x04, + 0xf7, 0xff, 0xff, 0xaa, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x33, 0x01, 0x2b, 0x10, 0xdb, 0xf2, + 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xd3, 0x48, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x0f, 0x4d, 0x10, 0x68, 0xe8, 0x08, 0x80, + 0xd3, 0x18, 0x20, 0x01, 0x4e, 0x0e, 0x70, 0x30, + 0x40, 0x38, 0xd0, 0x03, 0x20, 0x0a, 0x1c, 0x29, + 0xf0, 0x00, 0xfc, 0x1e, 0x1c, 0x20, 0x1c, 0x29, + 0xf0, 0x00, 0xfc, 0x2c, 0x08, 0xb8, 0xd3, 0x03, + 0x20, 0x0a, 0x1c, 0x29, 0xf0, 0x00, 0xfc, 0x14, + 0x20, 0x00, 0x70, 0x30, 0x20, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0xd3, 0xc8, + 0x2e, 0x08, 0x23, 0x48, 0xb5, 0x80, 0x1c, 0x07, + 0xa0, 0x06, 0x21, 0x01, 0xf7, 0xff, 0xfc, 0x98, + 0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x94, + 0x20, 0x01, 0xf7, 0xfc, 0xff, 0x95, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x43, 0x6f, 0x75, 0x6c, + 0x64, 0x6e, 0x27, 0x74, 0x20, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x00, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x15, 0x1c, 0x0f, 0x48, 0x20, 0x22, 0x01, + 0x02, 0x92, 0x21, 0x00, 0x1c, 0x06, 0xf7, 0xfb, + 0xfc, 0x2d, 0x4a, 0x1e, 0x1c, 0x28, 0xa1, 0x1e, + 0xf7, 0xff, 0xff, 0x4e, 0x28, 0x00, 0xd1, 0x02, + 0x1c, 0x28, 0xf7, 0xff, 0xff, 0xd3, 0x1c, 0x20, + 0x1c, 0x32, 0xa1, 0x1a, 0xf7, 0xff, 0xff, 0x44, + 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x20, 0xf7, 0xff, + 0xff, 0xc9, 0x4a, 0x17, 0x1c, 0x38, 0x1c, 0x15, + 0xa1, 0x13, 0xf7, 0xff, 0xff, 0x39, 0x28, 0x00, + 0xd1, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xbe, + 0x1c, 0x30, 0x26, 0x01, 0x03, 0x36, 0x08, 0xf2, + 0x21, 0x00, 0x1c, 0x33, 0xf0, 0x00, 0xf8, 0x52, + 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x20, 0xf7, 0xff, + 0xff, 0xb1, 0x22, 0x01, 0x02, 0x52, 0x21, 0x00, + 0x1c, 0x28, 0x1c, 0x33, 0xf0, 0x00, 0xf8, 0x46, + 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38, 0xf7, 0xff, + 0xff, 0xa5, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xd3, 0x48, 0x2e, 0x08, 0xd3, 0xc8, + 0x77, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0xd3, 0x88, 0xb5, 0x90, 0x27, 0x03, + 0x4c, 0x09, 0x01, 0xb8, 0x19, 0x00, 0xf7, 0xff, + 0xfe, 0xa5, 0x37, 0x01, 0x2f, 0x10, 0xdb, 0xf8, + 0x27, 0x00, 0x01, 0xb8, 0x19, 0x00, 0xf7, 0xff, + 0xfe, 0x9d, 0x37, 0x01, 0x2f, 0x03, 0xdb, 0xf8, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0xd3, 0x48, 0xb5, 0xb0, 0x01, 0x80, + 0x1c, 0x0f, 0x4c, 0x0a, 0x19, 0x00, 0x1c, 0x05, + 0xf7, 0xff, 0xfe, 0x8c, 0x01, 0xb8, 0x19, 0x00, + 0x23, 0x01, 0x05, 0x1b, 0x68, 0xc1, 0x43, 0x19, + 0x60, 0xc1, 0x4b, 0x05, 0x40, 0x19, 0x60, 0xe9, + 0x69, 0x40, 0x61, 0x68, 0x1c, 0x38, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0xd3, 0x48, + 0x00, 0x10, 0x8f, 0x03, 0xb4, 0xf0, 0x1c, 0x1f, + 0x68, 0xc3, 0x07, 0x9e, 0x0f, 0xb6, 0x25, 0x01, + 0x1c, 0x1c, 0x2e, 0x00, 0xd0, 0x13, 0x1c, 0x1e, + 0x0d, 0xf3, 0xd2, 0x10, 0x02, 0x2b, 0x42, 0x9a, + 0xd0, 0x09, 0x00, 0x5b, 0x42, 0x9a, 0xd0, 0x06, + 0x00, 0x5b, 0x42, 0x9a, 0xd1, 0x07, 0x27, 0x01, + 0x1d, 0xc1, 0x31, 0x1d, 0xe0, 0x06, 0x1e, 0x7e, + 0x4b, 0x08, 0x42, 0x9e, 0xd3, 0x02, 0x1c, 0x28, + 0xbc, 0xf0, 0x47, 0x70, 0x61, 0x01, 0x23, 0x0f, + 0x02, 0x1b, 0x43, 0x9c, 0x60, 0x41, 0x61, 0xc7, + 0x1c, 0x21, 0x43, 0x11, 0x60, 0xc1, 0x20, 0x00, + 0xbc, 0xf0, 0x47, 0x70, 0x00, 0xff, 0xff, 0xff, + 0xe2, 0x00, 0x01, 0x02, 0xe3, 0x31, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x17, 0xe3, 0xa0, 0x80, 0x00, + 0xe1, 0xb0, 0x98, 0x21, 0x01, 0xa0, 0x18, 0x01, + 0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x21, + 0x01, 0xa0, 0x14, 0x01, 0x02, 0x88, 0x80, 0x08, + 0xe1, 0xb0, 0x9e, 0x21, 0x01, 0xa0, 0x12, 0x01, + 0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x21, + 0x01, 0xa0, 0x11, 0x01, 0x02, 0x88, 0x80, 0x02, + 0xe1, 0xb0, 0x9f, 0xa1, 0x01, 0xa0, 0x10, 0x81, + 0x02, 0x88, 0x80, 0x01, 0xe0, 0x58, 0x98, 0xa6, + 0x81, 0xa0, 0x19, 0x31, 0x81, 0xa0, 0x88, 0xa6, + 0xe2, 0x68, 0x60, 0x20, 0xe1, 0x81, 0x16, 0x32, + 0xe1, 0xa0, 0x28, 0x12, 0x30, 0x40, 0x00, 0x09, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x56, 0x05, 0x01, + 0x3a, 0x00, 0x00, 0x16, 0xe1, 0xb0, 0x10, 0x02, + 0x01, 0xa0, 0xf0, 0x0e, 0xe3, 0xa0, 0x20, 0x00, + 0xe3, 0xa0, 0x80, 0x20, 0xe1, 0xb0, 0x98, 0x21, + 0x01, 0xa0, 0x18, 0x01, 0x02, 0x88, 0x80, 0x10, + 0xe1, 0xb0, 0x9c, 0x21, 0x01, 0xa0, 0x14, 0x01, + 0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x21, + 0x01, 0xa0, 0x12, 0x01, 0x02, 0x88, 0x80, 0x04, + 0xe1, 0xb0, 0x9f, 0x21, 0x01, 0xa0, 0x11, 0x01, + 0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa1, + 0x01, 0xa0, 0x10, 0x81, 0x02, 0x88, 0x80, 0x01, + 0xe0, 0x58, 0x98, 0xa6, 0x81, 0xa0, 0x19, 0x31, + 0x30, 0x40, 0x00, 0x09, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0xa0, 0x88, 0xa6, 0xe2, 0x68, 0x90, 0x20, + 0xe1, 0xa0, 0x18, 0x11, 0xe1, 0x81, 0x19, 0x32, + 0xe1, 0xa0, 0x28, 0x12, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe2, 0x03, 0x31, 0x02, 0xe3, 0x34, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x17, 0xe3, 0xa0, 0x80, 0x00, + 0xe1, 0xb0, 0x98, 0x24, 0x01, 0xa0, 0x48, 0x04, + 0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x24, + 0x01, 0xa0, 0x44, 0x04, 0x02, 0x88, 0x80, 0x08, + 0xe1, 0xb0, 0x9e, 0x24, 0x01, 0xa0, 0x42, 0x04, + 0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x24, + 0x01, 0xa0, 0x41, 0x04, 0x02, 0x88, 0x80, 0x02, + 0xe1, 0xb0, 0x9f, 0xa4, 0x01, 0xa0, 0x40, 0x84, + 0x02, 0x88, 0x80, 0x01, 0xe0, 0x58, 0x98, 0xa6, + 0x81, 0xa0, 0x49, 0x34, 0x81, 0xa0, 0x88, 0xa6, + 0xe2, 0x68, 0x60, 0x20, 0xe1, 0x84, 0x46, 0x35, + 0xe1, 0xa0, 0x58, 0x15, 0x30, 0x43, 0x30, 0x09, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x56, 0x05, 0x01, + 0x3a, 0x00, 0x00, 0x16, 0xe1, 0xb0, 0x40, 0x05, + 0x01, 0xa0, 0xf0, 0x0e, 0xe3, 0xa0, 0x50, 0x00, + 0xe3, 0xa0, 0x80, 0x20, 0xe1, 0xb0, 0x98, 0x24, + 0x01, 0xa0, 0x48, 0x04, 0x02, 0x88, 0x80, 0x10, + 0xe1, 0xb0, 0x9c, 0x24, 0x01, 0xa0, 0x44, 0x04, + 0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x24, + 0x01, 0xa0, 0x42, 0x04, 0x02, 0x88, 0x80, 0x04, + 0xe1, 0xb0, 0x9f, 0x24, 0x01, 0xa0, 0x41, 0x04, + 0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa4, + 0x01, 0xa0, 0x40, 0x84, 0x02, 0x88, 0x80, 0x01, + 0xe0, 0x58, 0x98, 0xa6, 0x81, 0xa0, 0x49, 0x34, + 0x30, 0x43, 0x30, 0x09, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0xa0, 0x88, 0xa6, 0xe2, 0x68, 0x90, 0x20, + 0xe1, 0xa0, 0x48, 0x14, 0xe1, 0x84, 0x49, 0x35, + 0xe1, 0xa0, 0x58, 0x15, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe3, 0xa0, 0x20, 0x00, 0xe2, 0x16, 0x01, 0x02, + 0x12, 0x66, 0x10, 0x00, 0x01, 0xb0, 0x10, 0x06, + 0x03, 0xa0, 0x30, 0x00, 0x01, 0xa0, 0xf0, 0x0e, + 0xe3, 0xa0, 0x39, 0x01, 0xe3, 0x83, 0x30, 0x1e, + 0xe3, 0xa0, 0x60, 0x00, 0xe3, 0x31, 0x00, 0x00, + 0x01, 0xa0, 0x10, 0x02, 0x03, 0xa0, 0x20, 0x00, + 0x02, 0x43, 0x30, 0x20, 0xe3, 0xa0, 0x80, 0x00, + 0xe1, 0xb0, 0x98, 0x21, 0x01, 0xa0, 0x18, 0x01, + 0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x21, + 0x01, 0xa0, 0x14, 0x01, 0x02, 0x88, 0x80, 0x08, + 0xe1, 0xb0, 0x9e, 0x21, 0x01, 0xa0, 0x12, 0x01, + 0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x21, + 0x01, 0xa0, 0x11, 0x01, 0x02, 0x88, 0x80, 0x02, + 0xe1, 0xb0, 0x9f, 0xa1, 0x01, 0xa0, 0x10, 0x81, + 0x02, 0x88, 0x80, 0x01, 0xe2, 0x78, 0x90, 0x20, + 0xe1, 0x81, 0x19, 0x32, 0xe1, 0xa0, 0x28, 0x12, + 0xe0, 0x43, 0x30, 0x08, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe3, 0x34, 0x00, 0x00, 0x01, 0xa0, 0x40, 0x05, + 0x03, 0xa0, 0x50, 0x00, 0x02, 0x43, 0x30, 0x20, + 0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x24, + 0x01, 0xa0, 0x48, 0x04, 0x02, 0x88, 0x80, 0x10, + 0xe1, 0xb0, 0x9c, 0x24, 0x01, 0xa0, 0x44, 0x04, + 0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x24, + 0x01, 0xa0, 0x42, 0x04, 0x02, 0x88, 0x80, 0x04, + 0xe1, 0xb0, 0x9f, 0x24, 0x01, 0xa0, 0x41, 0x04, + 0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa4, + 0x01, 0xa0, 0x40, 0x84, 0x02, 0x88, 0x80, 0x01, + 0xe2, 0x78, 0x90, 0x20, 0xe1, 0x84, 0x49, 0x35, + 0xe1, 0xa0, 0x58, 0x15, 0xe0, 0x43, 0x30, 0x08, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x31, 0x00, 0x00, + 0x01, 0xa0, 0x10, 0x02, 0x03, 0xa0, 0x20, 0x00, + 0x02, 0x83, 0x30, 0x20, 0xe3, 0xa0, 0x80, 0x00, + 0xe1, 0xb0, 0x98, 0x21, 0x01, 0xa0, 0x18, 0x01, + 0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x21, + 0x01, 0xa0, 0x14, 0x01, 0x02, 0x88, 0x80, 0x08, + 0xe1, 0xb0, 0x9e, 0x21, 0x01, 0xa0, 0x12, 0x01, + 0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x21, + 0x01, 0xa0, 0x11, 0x01, 0x02, 0x88, 0x80, 0x02, + 0xe1, 0xb0, 0x9f, 0xa1, 0x01, 0xa0, 0x10, 0x81, + 0x02, 0x88, 0x80, 0x01, 0xe2, 0x78, 0x90, 0x20, + 0xe1, 0x81, 0x19, 0x32, 0xe1, 0xa0, 0x28, 0x12, + 0xe0, 0x83, 0x30, 0x08, 0xe1, 0xa0, 0xf0, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7f, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe1, 0x92, 0x80, 0x81, 0x0a, 0x00, 0x00, 0x05, + 0xe3, 0x11, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x0c, + 0xe1, 0x95, 0x80, 0x84, 0x0a, 0x00, 0x00, 0x0a, + 0xe3, 0x14, 0x01, 0x01, 0x1a, 0x00, 0x00, 0x08, + 0xe3, 0x14, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x28, + 0xe1, 0xa0, 0x00, 0x03, 0xe1, 0xa0, 0x10, 0x04, + 0xe1, 0xa0, 0x20, 0x05, 0xea, 0x00, 0x00, 0x04, + 0xe3, 0x11, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x22, + 0xea, 0x00, 0x00, 0x01, 0xe3, 0x11, 0x01, 0x01, + 0x0a, 0x00, 0x00, 0x1f, 0xe3, 0x1b, 0x00, 0x01, + 0x1a, 0x00, 0x00, 0x16, 0xe3, 0x1b, 0x00, 0x02, + 0x1a, 0x00, 0x00, 0x0c, 0xe3, 0x1b, 0x0c, 0x02, + 0x1a, 0x00, 0x00, 0x05, 0xe3, 0xc0, 0x81, 0x03, + 0xe3, 0xa0, 0x90, 0xff, 0xe3, 0x89, 0x9c, 0x43, + 0xe1, 0x58, 0x00, 0x09, 0x33, 0xc2, 0x20, 0x01, + 0x03, 0x82, 0x20, 0x01, 0xe2, 0x00, 0x01, 0x03, + 0xe3, 0x80, 0x00, 0xff, 0xe3, 0x80, 0x0c, 0x7f, + 0xe1, 0x30, 0x00, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe2, 0x00, 0x01, 0x03, 0xe3, 0x80, 0x00, 0xff, + 0xe3, 0x80, 0x0c, 0x43, 0xe1, 0xa0, 0x25, 0xa2, + 0xe1, 0xa0, 0x25, 0x82, 0xe3, 0x81, 0x11, 0x02, + 0xe1, 0x30, 0x00, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe2, 0x00, 0x01, 0x03, 0xe3, 0x80, 0x00, 0x7f, + 0xe3, 0x80, 0x09, 0x01, 0xe3, 0xa0, 0x20, 0x00, + 0xe3, 0xc1, 0x10, 0xff, 0xe3, 0x81, 0x11, 0x02, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x80, 0x04, 0x61, + 0xe1, 0xa0, 0xf0, 0x0e, 0xb5, 0x80, 0x1c, 0x0f, + 0x29, 0x0f, 0xdd, 0x04, 0x11, 0x39, 0xf7, 0xff, + 0xff, 0xf9, 0x07, 0x3f, 0x0f, 0x3f, 0x2f, 0x09, + 0xdd, 0x02, 0x1d, 0xf9, 0x31, 0x29, 0xe0, 0x01, + 0x1d, 0xf9, 0x31, 0x50, 0x70, 0x01, 0x30, 0x01, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, + 0x1c, 0x07, 0x48, 0x0d, 0x68, 0x01, 0x29, 0x00, + 0xd1, 0x12, 0x4c, 0x0c, 0x1c, 0x20, 0xa1, 0x0c, + 0x22, 0x14, 0xf7, 0xfb, 0xf8, 0x67, 0x1d, 0xe0, + 0x30, 0x0b, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0xda, + 0x21, 0x29, 0x70, 0x01, 0x21, 0x00, 0x70, 0x41, + 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x30, 0x08, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x21, 0x4c, 0x2e, 0x08, 0xd7, 0x48, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x28, + 0x30, 0x78, 0x00, 0x00, 0xb5, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0xa0, 0x09, 0x21, 0x01, 0xf7, 0xff, + 0xf9, 0x87, 0x21, 0x00, 0x1c, 0x20, 0xf7, 0xff, + 0xf9, 0x83, 0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, + 0xf9, 0x7f, 0x20, 0x01, 0xf7, 0xfc, 0xfc, 0x80, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2a, 0x2a, 0x2a, 0x20, 0x66, 0x61, 0x74, 0x61, + 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, + 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x74, + 0x69, 0x6d, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x3a, 0x20, 0x00, 0x00, 0x00, 0x00, + 0xb5, 0xb0, 0x1c, 0x07, 0x68, 0xc0, 0x07, 0x81, + 0xd0, 0x1f, 0x23, 0x20, 0x40, 0x18, 0xd0, 0x01, + 0x6a, 0xbd, 0xe0, 0x04, 0x68, 0x79, 0x69, 0xba, + 0x18, 0x89, 0x69, 0x3a, 0x1a, 0x8d, 0x28, 0x00, + 0xd0, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xfb, 0xa2, + 0x68, 0xf8, 0x4b, 0x0a, 0x40, 0x18, 0x60, 0xf8, + 0x1c, 0x38, 0xf7, 0xff, 0xfb, 0x67, 0x1c, 0x04, + 0x22, 0x00, 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x00, + 0xf8, 0x27, 0x1c, 0x20, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, 0xcf, 0xff, + 0xb5, 0xb0, 0x24, 0x00, 0x28, 0x00, 0xd0, 0x03, + 0xf7, 0xff, 0xff, 0xce, 0x1c, 0x04, 0xe0, 0x0c, + 0x27, 0x00, 0x4d, 0x08, 0x01, 0xb8, 0x19, 0x40, + 0xf7, 0xff, 0xff, 0xc6, 0x28, 0x00, 0xd0, 0x01, + 0x24, 0x00, 0x43, 0xe4, 0x37, 0x01, 0x2f, 0x10, + 0xdb, 0xf4, 0x1c, 0x20, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0xd3, 0x48, + 0xb5, 0xf7, 0x68, 0xc5, 0x69, 0x46, 0x1c, 0x0c, + 0x1c, 0x07, 0xb0, 0x81, 0x48, 0x3c, 0x40, 0x28, + 0xd0, 0x04, 0x1c, 0x38, 0xf7, 0xff, 0xf9, 0xaa, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0x02, 0xe0, 0x6a, + 0x9a, 0x03, 0x2a, 0x00, 0xd0, 0x26, 0x2a, 0x01, + 0xd0, 0x0b, 0x2a, 0x02, 0xd1, 0x24, 0x1c, 0x30, + 0xf7, 0xff, 0xf9, 0xd4, 0x28, 0x00, 0xda, 0x09, + 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0xa7, 0x20, 0x01, + 0xe0, 0x59, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x8c, + 0x19, 0x04, 0xe0, 0x13, 0x68, 0x79, 0x6a, 0xfa, + 0x42, 0x8a, 0xd9, 0x00, 0x1c, 0x11, 0x69, 0xba, + 0x18, 0x89, 0x69, 0x3a, 0x1a, 0x89, 0x68, 0xfa, + 0x09, 0x92, 0xd3, 0x03, 0x6a, 0xba, 0x42, 0x8a, + 0xdd, 0x00, 0x1c, 0x11, 0x42, 0x81, 0xdd, 0x00, + 0x1c, 0x08, 0x18, 0x24, 0x2c, 0x00, 0xda, 0x03, + 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x87, 0xe7, 0xcd, + 0x0b, 0xa8, 0xd3, 0x04, 0x68, 0x78, 0x6a, 0xf9, + 0x42, 0x81, 0xd2, 0x00, 0x62, 0xf8, 0x69, 0xb8, + 0x42, 0xa0, 0xdc, 0x10, 0x68, 0x79, 0x6a, 0xfa, + 0x42, 0x8a, 0xd9, 0x01, 0x1c, 0x13, 0xe0, 0x00, + 0x1c, 0x0b, 0x18, 0x1b, 0x69, 0x3e, 0x1b, 0x9b, + 0x42, 0xa3, 0xdb, 0x04, 0x6b, 0x3b, 0x93, 0x00, + 0x18, 0xc3, 0x42, 0xa3, 0xdc, 0x06, 0x20, 0x20, + 0x43, 0x28, 0x21, 0x00, 0x60, 0x39, 0x60, 0xb9, + 0x62, 0xbc, 0xe0, 0x14, 0x1a, 0x24, 0x08, 0xa8, + 0xd3, 0x03, 0x9b, 0x00, 0x1b, 0x18, 0x42, 0x40, + 0x60, 0xb8, 0x08, 0x68, 0xd3, 0x06, 0x42, 0x8a, + 0xd9, 0x00, 0x1c, 0x11, 0x1b, 0x88, 0x1b, 0x00, + 0x42, 0x40, 0x60, 0x38, 0x19, 0x30, 0x23, 0x20, + 0x43, 0x9d, 0x60, 0x78, 0x1c, 0x28, 0x4b, 0x05, + 0x40, 0x18, 0x60, 0xf8, 0x20, 0x00, 0xb0, 0x01, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x10, 0x00, 0x03, 0xff, 0xf7, 0xcf, 0xbf, + 0xb5, 0x00, 0x68, 0x8a, 0x68, 0x4b, 0x3a, 0x01, + 0xd5, 0x03, 0xf0, 0x00, 0xf8, 0x3f, 0xbc, 0x08, + 0x47, 0x18, 0x06, 0x00, 0x0e, 0x00, 0x70, 0x18, + 0x33, 0x01, 0x60, 0x8a, 0x60, 0x4b, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xb5, 0xb0, 0x1c, 0x07, + 0x78, 0x00, 0x1c, 0x0c, 0x37, 0x01, 0x28, 0x00, + 0xd0, 0x0e, 0x25, 0x00, 0x43, 0xed, 0x1c, 0x21, + 0xf0, 0x00, 0xf8, 0xe8, 0x42, 0xa8, 0xd1, 0x03, + 0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x78, 0x38, 0x37, 0x01, 0x28, 0x00, 0xd1, 0xf2, + 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x68, 0xc1, 0x07, 0x8a, 0xd1, 0x04, 0x20, 0x01, + 0x49, 0x09, 0x60, 0x08, 0x42, 0x40, 0x47, 0x70, + 0x09, 0x8a, 0xd3, 0x01, 0x6a, 0x80, 0xe0, 0x04, + 0x68, 0x42, 0x69, 0x83, 0x18, 0xd2, 0x69, 0x00, + 0x1a, 0x10, 0x0d, 0x09, 0xd3, 0xf3, 0x28, 0x00, + 0xdd, 0xf1, 0x38, 0x01, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x21, 0x30, 0xb5, 0xf0, 0x1c, 0x04, + 0x68, 0xc8, 0x1c, 0x0f, 0x4b, 0x5a, 0x40, 0x18, + 0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, 0x60, 0xc8, + 0x09, 0x80, 0xd3, 0x02, 0x1c, 0x38, 0xf7, 0xff, + 0xfa, 0x95, 0x06, 0x26, 0x0e, 0x36, 0x68, 0xb9, + 0x29, 0x00, 0xda, 0x12, 0x68, 0xf8, 0x0a, 0x82, + 0xd2, 0x0f, 0x22, 0x00, 0x43, 0xd2, 0x1a, 0x51, + 0x23, 0x09, 0x03, 0x5b, 0x43, 0x18, 0x60, 0xf8, + 0x60, 0xb9, 0x68, 0x79, 0x70, 0x0e, 0x31, 0x01, + 0x60, 0x79, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0xf8, 0x49, 0x49, 0x40, 0x01, + 0x29, 0x02, 0xd0, 0x03, 0x1c, 0x38, 0xf7, 0xff, + 0xf9, 0xcd, 0xe0, 0x7f, 0x49, 0x46, 0x40, 0x01, + 0x23, 0x01, 0x03, 0xdb, 0x42, 0x99, 0xd1, 0x0b, + 0x22, 0x02, 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff, + 0xfe, 0xfb, 0x68, 0xf8, 0x09, 0x80, 0xd3, 0x02, + 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x63, 0x68, 0xf8, + 0x25, 0x09, 0x03, 0x6d, 0x43, 0x05, 0x60, 0xfd, + 0x69, 0x38, 0x28, 0x00, 0xd1, 0x2f, 0x1c, 0x38, + 0xf7, 0xff, 0xf8, 0xa0, 0x28, 0x00, 0xd0, 0x18, + 0x68, 0xf8, 0x0a, 0x00, 0x07, 0x80, 0xd0, 0x09, + 0x69, 0xf8, 0xf7, 0xff, 0xf9, 0x7d, 0x61, 0x38, + 0x60, 0x78, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x1d, + 0x68, 0xf8, 0xe0, 0x1a, 0x1d, 0xf8, 0x30, 0x1d, + 0x61, 0x38, 0x60, 0x78, 0x20, 0x01, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x1d, 0x61, 0xf8, 0x60, 0xfd, + 0xe0, 0x11, 0x69, 0xf8, 0xf7, 0xff, 0xf9, 0x68, + 0x61, 0x38, 0x60, 0x78, 0x23, 0x01, 0x02, 0xdb, + 0x43, 0x1d, 0x68, 0xf8, 0x43, 0x28, 0x60, 0xf8, + 0x0a, 0x29, 0x07, 0x89, 0xd1, 0x03, 0x08, 0xdb, + 0x43, 0x1d, 0x43, 0x28, 0x60, 0xf8, 0x0a, 0x68, + 0xd3, 0x19, 0x68, 0x78, 0x6a, 0xf9, 0x69, 0x3c, + 0x42, 0x81, 0xd9, 0x00, 0x1c, 0x08, 0x1b, 0x01, + 0xd0, 0x05, 0x1c, 0x20, 0x1c, 0x3a, 0xf7, 0xff, + 0xf9, 0x7d, 0x28, 0x00, 0xd1, 0x26, 0x1c, 0x60, + 0x62, 0xf8, 0x60, 0x78, 0x69, 0xf8, 0x1e, 0x41, + 0x63, 0x38, 0x60, 0xb9, 0x70, 0x26, 0x1c, 0x30, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x69, 0x38, + 0x68, 0x7a, 0x70, 0x14, 0x32, 0x01, 0x60, 0x7a, + 0x6a, 0xf9, 0x42, 0x91, 0xd8, 0x00, 0x1c, 0x11, + 0x1a, 0x09, 0x69, 0xfa, 0x63, 0x3a, 0x0a, 0xeb, + 0xd2, 0x03, 0x2e, 0x0a, 0xd0, 0x01, 0x42, 0x8a, + 0xdc, 0x0d, 0x62, 0xf8, 0x22, 0x00, 0x60, 0x78, + 0x60, 0xba, 0x1c, 0x3a, 0xf7, 0xff, 0xf9, 0x56, + 0x28, 0x00, 0xd0, 0x04, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x30, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0xff, 0xf7, 0xff, 0xff, 0x00, 0x00, 0x10, 0x8a, + 0x00, 0x00, 0xa0, 0x10, 0xb5, 0x00, 0x68, 0x8a, + 0x68, 0x4b, 0x3a, 0x01, 0xd5, 0x03, 0xf7, 0xff, + 0xff, 0x39, 0xbc, 0x08, 0x47, 0x18, 0x06, 0x00, + 0x0e, 0x00, 0x70, 0x18, 0x33, 0x01, 0x60, 0x8a, + 0x60, 0x4b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x47, 0x78, 0x46, 0xc0, 0xe9, 0x2d, 0x40, 0x00, + 0xe2, 0x8f, 0xe0, 0x00, 0xef, 0x12, 0x34, 0x56, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x00, 0x18, + 0xe5, 0x9f, 0x10, 0x18, 0xef, 0x12, 0x34, 0x56, + 0xea, 0xff, 0xff, 0xfe, 0xe1, 0xa0, 0x10, 0x00, + 0xe3, 0xa0, 0x00, 0x18, 0xe5, 0x9f, 0x10, 0x08, + 0xef, 0x12, 0x34, 0x56, 0xea, 0xff, 0xff, 0xfe, + 0x00, 0x02, 0x00, 0x26, 0x00, 0x02, 0x00, 0x23, + 0xe8, 0xb0, 0x01, 0xf0, 0xe8, 0xa1, 0x01, 0xf0, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe2, 0x52, 0x20, 0xbc, 0x1a, 0xff, 0xff, 0xed, + 0xe8, 0xbd, 0x01, 0xf8, 0xe1, 0x2f, 0xff, 0x1e, + 0xe4, 0x90, 0x40, 0x04, 0xe1, 0x85, 0x54, 0x24, + 0xe4, 0x81, 0x50, 0x04, 0xe1, 0xa0, 0x5c, 0x04, + 0xe2, 0x53, 0x30, 0x04, 0x1a, 0xff, 0xff, 0xf9, + 0xe5, 0x9f, 0xf0, 0x88, 0xe4, 0x90, 0x40, 0x04, + 0xe1, 0x85, 0x5c, 0x24, 0xe4, 0x81, 0x50, 0x04, + 0xe1, 0xa0, 0x54, 0x04, 0xe2, 0x53, 0x30, 0x04, + 0x1a, 0xff, 0xff, 0xf9, 0xe5, 0x9f, 0xf0, 0x70, + 0xe4, 0x90, 0x40, 0x04, 0xe1, 0xa0, 0x58, 0x24, + 0xe0, 0xc1, 0x50, 0xb2, 0xe0, 0xc1, 0x40, 0xb2, + 0xe2, 0x53, 0x30, 0x04, 0x1a, 0xff, 0xff, 0xf9, + 0xe5, 0x9f, 0xf0, 0x4c, 0xe2, 0x03, 0x40, 0x0f, + 0xe0, 0x53, 0x40, 0x04, 0x0a, 0x00, 0x00, 0x0a, + 0xe9, 0x2d, 0x00, 0xc4, 0xe1, 0xa0, 0x20, 0x03, + 0xe1, 0xa0, 0x30, 0x04, 0xe8, 0xb0, 0x00, 0xf0, + 0xe8, 0xa1, 0x00, 0xf0, 0xe2, 0x53, 0x30, 0x10, + 0x1a, 0xff, 0xff, 0xfb, 0xe1, 0xa0, 0x30, 0x02, + 0xe8, 0xbd, 0x00, 0xc4, 0xe2, 0x13, 0x30, 0x0f, + 0x0a, 0x00, 0x00, 0x03, 0xe4, 0x90, 0x40, 0x04, + 0xe4, 0x81, 0x40, 0x04, 0xe2, 0x53, 0x30, 0x04, + 0x1a, 0xff, 0xff, 0xfb, 0xe5, 0x9f, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x02, 0x38, 0x58, + 0x2e, 0x02, 0x37, 0xfc, 0x2e, 0x02, 0x38, 0x2c, + 0xe9, 0x2d, 0x00, 0x38, 0xe3, 0x52, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x3f, 0xe3, 0xe0, 0x30, 0x03, + 0xe0, 0x12, 0x30, 0x03, 0x0a, 0x00, 0x00, 0x30, + 0xe2, 0x10, 0x30, 0x01, 0x0a, 0x00, 0x00, 0x03, + 0xe4, 0xd0, 0x30, 0x01, 0xe4, 0xc1, 0x30, 0x01, + 0xe2, 0x52, 0x20, 0x01, 0x0a, 0x00, 0x00, 0x36, + 0xe2, 0x10, 0x30, 0x02, 0x0a, 0x00, 0x00, 0x05, + 0xe0, 0xd0, 0x30, 0xb2, 0xe1, 0xa0, 0x44, 0x23, + 0xe4, 0xc1, 0x40, 0x01, 0xe4, 0xc1, 0x30, 0x01, + 0xe2, 0x52, 0x20, 0x02, 0x0a, 0x00, 0x00, 0x2e, + 0xe3, 0xe0, 0x30, 0x03, 0xe0, 0x12, 0x30, 0x03, + 0x0a, 0x00, 0x00, 0x1f, 0xe2, 0x11, 0x40, 0x01, + 0x0a, 0x00, 0x00, 0x19, 0xe2, 0x11, 0x40, 0x02, + 0x1a, 0x00, 0x00, 0x0b, 0xe2, 0x41, 0x10, 0x01, + 0xe5, 0x91, 0x50, 0x00, 0xe1, 0xa0, 0x5c, 0x25, + 0xe1, 0xa0, 0x5c, 0x05, 0xe5, 0x9f, 0xf0, 0xa8, + 0xe5, 0x91, 0x40, 0x00, 0xe1, 0xa0, 0x44, 0x04, + 0xe1, 0xa0, 0x44, 0x24, 0xe1, 0x85, 0x50, 0x04, + 0xe5, 0x81, 0x50, 0x00, 0xe2, 0x81, 0x10, 0x01, + 0xea, 0x00, 0x00, 0x0f, 0xe2, 0x41, 0x10, 0x03, + 0xe5, 0x91, 0x50, 0x00, 0xe1, 0xa0, 0x54, 0x25, + 0xe1, 0xa0, 0x54, 0x05, 0xe5, 0x9f, 0xf0, 0x7c, + 0xe5, 0x91, 0x40, 0x00, 0xe1, 0xa0, 0x4c, 0x04, + 0xe1, 0xa0, 0x4c, 0x24, 0xe1, 0x85, 0x50, 0x04, + 0xe5, 0x81, 0x50, 0x00, 0xe2, 0x81, 0x10, 0x03, + 0xea, 0x00, 0x00, 0x03, 0xe2, 0x11, 0x40, 0x02, + 0x0a, 0x00, 0x00, 0x00, 0xe5, 0x9f, 0xf0, 0x5c, + 0xe5, 0x9f, 0xf0, 0x48, 0xe2, 0x12, 0x20, 0x03, + 0x0a, 0x00, 0x00, 0x09, 0xe4, 0xd0, 0x40, 0x01, + 0xe4, 0xc1, 0x40, 0x01, 0xe2, 0x52, 0x20, 0x01, + 0x0a, 0x00, 0x00, 0x05, 0xe4, 0xd0, 0x40, 0x01, + 0xe4, 0xc1, 0x40, 0x01, 0xe2, 0x52, 0x20, 0x01, + 0x0a, 0x00, 0x00, 0x01, 0xe4, 0xd0, 0x40, 0x01, + 0xe4, 0xc1, 0x40, 0x01, 0xe8, 0xbd, 0x00, 0x38, + 0xe3, 0x8e, 0xe0, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0xe9, 0x2d, 0x01, 0xf8, 0xe5, 0x9f, 0xf0, 0x18, + 0x2e, 0x02, 0x36, 0xcc, 0x2e, 0x02, 0x37, 0x04, + 0x2e, 0x02, 0x37, 0x20, 0x2e, 0x02, 0x36, 0xcc, + 0x2e, 0x02, 0x36, 0xe8, 0x2e, 0x02, 0x37, 0x20, + 0x2e, 0x02, 0x37, 0x04, 0x2e, 0x02, 0x36, 0x7c, + 0xe9, 0x2d, 0x5f, 0xff, 0xe1, 0x4f, 0x00, 0x00, + 0xe9, 0x2d, 0x00, 0x01, 0xe2, 0x8f, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x10, 0x21, 0xff, 0x48, 0x37, + 0x68, 0x00, 0x40, 0x52, 0x42, 0x08, 0xd1, 0x0b, + 0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x07, + 0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x03, + 0x0a, 0x00, 0x42, 0x08, 0xd0, 0x23, 0x32, 0x20, + 0x21, 0x0f, 0x42, 0x08, 0xd1, 0x01, 0x32, 0x10, + 0x09, 0x00, 0x21, 0x01, 0x42, 0x08, 0xd1, 0x08, + 0x1d, 0x12, 0x21, 0x02, 0x42, 0x08, 0xd1, 0x04, + 0x1d, 0x12, 0x21, 0x04, 0x42, 0x08, 0xd1, 0x00, + 0x1d, 0x12, 0x48, 0x25, 0x68, 0x00, 0xb4, 0x01, + 0x08, 0x90, 0x21, 0x01, 0x40, 0x81, 0x48, 0x21, + 0x60, 0x01, 0x48, 0x1d, 0x58, 0x82, 0x48, 0x01, + 0x46, 0x86, 0x47, 0x10, 0x2e, 0x02, 0x39, 0x35, + 0xbc, 0x02, 0x48, 0x1d, 0x60, 0x01, 0x00, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe8, 0xbd, 0x00, 0x01, + 0xe1, 0x69, 0xf0, 0x00, 0xe8, 0xbd, 0x5f, 0xff, + 0xe2, 0x5e, 0xf0, 0x04, 0x48, 0x12, 0x21, 0x20, + 0x4a, 0x12, 0x60, 0x02, 0x1d, 0x00, 0x1e, 0x49, + 0xd1, 0xfb, 0x20, 0x00, 0x47, 0x70, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x46, 0x73, 0x49, 0x0e, + 0x60, 0x08, 0x20, 0x00, 0x47, 0x18, 0x46, 0x73, + 0x49, 0x0c, 0x60, 0x08, 0x20, 0x00, 0x47, 0x18, + 0x46, 0x73, 0x48, 0x0b, 0x68, 0x00, 0x47, 0x18, + 0x46, 0x73, 0x49, 0x09, 0x60, 0x08, 0x47, 0x18, + 0x46, 0x73, 0x4a, 0x03, 0x00, 0x80, 0x18, 0x12, + 0x68, 0x10, 0x60, 0x11, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x3b, 0xa4, 0x2e, 0x02, 0x39, 0x64, + 0x66, 0x00, 0x00, 0x10, 0x66, 0x00, 0x00, 0x14, + 0x66, 0x00, 0x00, 0x18, 0x66, 0x00, 0x00, 0x1c, + 0xe9, 0x2d, 0x5f, 0xf0, 0xe1, 0x4f, 0x40, 0x00, + 0xe3, 0x14, 0x00, 0x20, 0x11, 0x5e, 0x40, 0xb2, + 0x13, 0xc4, 0x4c, 0xff, 0x05, 0x1e, 0x40, 0x04, + 0x03, 0xc4, 0x44, 0xff, 0xe5, 0x9f, 0x50, 0x14, + 0xe7, 0x95, 0x51, 0x04, 0xe5, 0x9f, 0xe0, 0x00, + 0xe1, 0x2f, 0xff, 0x15, 0x2e, 0x02, 0x39, 0xe4, + 0xe8, 0xbd, 0x5f, 0xf0, 0xe1, 0xb0, 0xf0, 0x0e, + 0x2e, 0x08, 0x20, 0x68, 0x00, 0x00, 0x00, 0xc0, + 0x46, 0x73, 0x47, 0x78, 0xe1, 0x0f, 0x10, 0x00, + 0xe3, 0x81, 0x00, 0x80, 0xe1, 0x29, 0xf0, 0x00, + 0xe2, 0x01, 0x00, 0x80, 0xe1, 0x2f, 0xff, 0x13, + 0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x4f, 0x10, 0x00, 0xe3, 0x81, 0x00, 0x80, + 0xe1, 0x69, 0xf0, 0x00, 0xe2, 0x01, 0x00, 0x80, + 0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0x0f, 0x10, 0x00, + 0xe3, 0x81, 0x00, 0x40, 0xe1, 0x29, 0xf0, 0x00, + 0xe2, 0x01, 0x00, 0x40, 0xe1, 0x2f, 0xff, 0x13, + 0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x4f, 0x10, 0x00, 0xe3, 0x81, 0x00, 0x40, + 0xe1, 0x69, 0xf0, 0x00, 0xe2, 0x01, 0x00, 0x40, + 0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0x0f, 0x00, 0x00, + 0xe3, 0xc0, 0x00, 0x80, 0xe1, 0x29, 0xf0, 0x00, + 0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x13, + 0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x4f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x80, + 0xe1, 0x69, 0xf0, 0x00, 0xe3, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0x0f, 0x00, 0x00, + 0xe3, 0xc0, 0x00, 0x40, 0xe1, 0x29, 0xf0, 0x00, + 0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x13, + 0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x4f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x40, + 0xe1, 0x69, 0xf0, 0x00, 0xe3, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x49, 0x02, + 0x60, 0x08, 0x20, 0x00, 0x46, 0x9f, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x00, 0x46, 0x73, 0x49, 0x02, + 0x60, 0x08, 0x20, 0x00, 0x46, 0x9f, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x04, 0x46, 0x73, 0x48, 0x03, + 0x68, 0x00, 0x47, 0x18, 0x46, 0x73, 0x49, 0x01, + 0x60, 0x08, 0x47, 0x18, 0x66, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x46, 0x6c, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x50, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x02, 0xd0, + 0x00, 0x00, 0x00, 0x15, 0x00, 0x03, 0xb1, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x90, 0x85, + 0x00, 0x00, 0xa6, 0xee, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x02, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0xa0, + 0x00, 0x08, 0x08, 0x28, 0x00, 0x08, 0x88, 0x68, + 0x00, 0x08, 0xa0, 0x98, 0x00, 0x08, 0x88, 0x68, + 0x00, 0x08, 0x28, 0x98, 0x00, 0x08, 0xac, 0xf4, + 0x00, 0x08, 0xb8, 0x7c, 0x00, 0x02, 0x02, 0x88, + 0x00, 0x02, 0x08, 0x22, 0x00, 0x02, 0x88, 0xaa, + 0x00, 0x02, 0x22, 0xaa, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x24, + 0x00, 0x04, 0x04, 0x24, 0x00, 0x04, 0x28, 0x6c, + 0x00, 0x04, 0x28, 0x6c, 0x00, 0x01, 0x10, 0x44, + 0x00, 0x01, 0x20, 0x44, 0x00, 0x01, 0x11, 0xaa, + 0x00, 0x01, 0x88, 0x55, 0x00, 0x01, 0x44, 0xaa, + 0x00, 0x01, 0x44, 0x55, 0x00, 0x20, 0x80, 0xa0, + 0x00, 0x20, 0x80, 0xc0, 0x00, 0x20, 0x20, 0xa0, + 0x00, 0x20, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, + 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x13, 0x16, + 0x1a, 0x1b, 0x1d, 0x22, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x13, 0x16, + 0x1a, 0x1b, 0x1d, 0x22, 0x10, 0x10, 0x16, 0x18, + 0x1b, 0x1d, 0x22, 0x25, 0x13, 0x16, 0x1a, 0x1b, + 0x1d, 0x22, 0x22, 0x26, 0x16, 0x16, 0x1a, 0x1b, + 0x1d, 0x22, 0x25, 0x28, 0x16, 0x1a, 0x1b, 0x1d, + 0x20, 0x23, 0x28, 0x30, 0x1a, 0x1b, 0x1d, 0x20, + 0x23, 0x28, 0x30, 0x3a, 0x1a, 0x1b, 0x1d, 0x22, + 0x26, 0x2e, 0x38, 0x45, 0x1b, 0x1d, 0x23, 0x26, + 0x2e, 0x38, 0x45, 0x53, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xd6, 0x00, + 0x00, 0x1b, 0x08, 0x00, 0x00, 0x1f, 0xde, 0x00, + 0x00, 0x00, 0x50, 0x00, 0x00, 0x09, 0xce, 0x00, + 0x00, 0x13, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x05, 0x28, 0x20, 0x01, 0x00, 0x00, 0x02, 0x40, + 0x71, 0x01, 0x00, 0x68, 0xe0, 0x7f, 0xb0, 0x7f, + 0x60, 0x40, 0xe0, 0x1d, 0x90, 0x10, 0xb4, 0x81, + 0xe8, 0xc0, 0xe0, 0xc2, 0x90, 0x18, 0x00, 0x8a, + 0x70, 0xc0, 0x0f, 0x87, 0xe3, 0xe8, 0xc0, 0x00, + 0x70, 0x40, 0xe0, 0x01, 0xe0, 0x86, 0x00, 0x26, + 0xd0, 0x28, 0xe0, 0x0e, 0xd0, 0x0e, 0x0f, 0x0b, + 0x70, 0x1d, 0xe0, 0x67, 0x0f, 0x87, 0x0f, 0x87, + 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 0x02, 0x20, + 0xd0, 0x01, 0xe0, 0x25, 0x0f, 0x45, 0x6f, 0x81, + 0xdf, 0xa6, 0xe0, 0x36, 0xe1, 0x30, 0xa0, 0x37, + 0xc0, 0x00, 0xe0, 0x26, 0x00, 0x33, 0xdf, 0x00, + 0xe0, 0x32, 0x0f, 0xc5, 0x0f, 0x87, 0x00, 0x27, + 0xd0, 0x4c, 0xe0, 0x21, 0x00, 0x33, 0xdf, 0x60, + 0x00, 0x27, 0xd0, 0x56, 0x60, 0x01, 0xe0, 0x2d, + 0x03, 0xa0, 0xd0, 0x41, 0xa0, 0x78, 0x00, 0x60, + 0xd0, 0x41, 0xa0, 0x77, 0x00, 0x22, 0xd0, 0x58, + 0xa0, 0x76, 0x00, 0x21, 0xd0, 0x7c, 0x00, 0x4a, + 0xd0, 0x72, 0x70, 0x40, 0x00, 0x06, 0x0f, 0x87, + 0x00, 0x22, 0xdc, 0xf8, 0xf0, 0x4a, 0xe1, 0x70, + 0x07, 0xef, 0xdd, 0xbf, 0x4f, 0x36, 0x1d, 0x99, + 0x4d, 0x80, 0x10, 0x18, 0xdd, 0x50, 0x60, 0x35, + 0xdd, 0x72, 0xdd, 0x10, 0x3d, 0xb4, 0xec, 0x57, + 0x2d, 0x36, 0x1d, 0x03, 0xbd, 0x04, 0xe4, 0x2b, + 0x01, 0x46, 0x00, 0x06, 0xac, 0xf6, 0x80, 0x3f, + 0x0d, 0x0a, 0x10, 0x02, 0x7d, 0x40, 0x10, 0x1e, + 0xb0, 0x20, 0xbc, 0xe0, 0x00, 0x06, 0x00, 0xc6, + 0xe0, 0x52, 0xb7, 0x60, 0xb7, 0x60, 0xc0, 0x5d, + 0x30, 0x5f, 0xe4, 0x72, 0xc7, 0x5e, 0x00, 0xed, + 0xd0, 0x28, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, + 0xc0, 0x1d, 0x30, 0x1c, 0xf8, 0x7e, 0x00, 0x21, + 0xd0, 0x01, 0x00, 0x26, 0xd0, 0x78, 0xa0, 0x38, + 0x80, 0x3f, 0x70, 0x01, 0xb0, 0x3f, 0x60, 0x01, + 0x0f, 0x87, 0x80, 0x34, 0x03, 0xef, 0xd8, 0x3f, + 0xa8, 0x38, 0x01, 0x35, 0xdc, 0x33, 0xe0, 0x46, + 0xc0, 0x1c, 0xe4, 0xa5, 0x97, 0x2e, 0x30, 0x1c, + 0xe8, 0x8e, 0x00, 0x21, 0xd0, 0x00, 0xa0, 0x38, + 0xc0, 0x5d, 0x00, 0x23, 0xd0, 0x00, 0x30, 0x40, + 0x30, 0x5e, 0xe4, 0x99, 0x20, 0x5e, 0xc0, 0x01, + 0x30, 0x1c, 0xec, 0xa4, 0xe0, 0x9d, 0x20, 0x5f, + 0xc0, 0x1c, 0x30, 0x01, 0xf4, 0xa5, 0xc0, 0x1c, + 0x30, 0x1d, 0xec, 0xa4, 0xe4, 0xa5, 0x90, 0x38, + 0x00, 0x1b, 0xe8, 0xa5, 0xa0, 0x66, 0xb1, 0x3f, + 0xe4, 0xb3, 0xe8, 0xb1, 0xc0, 0x4b, 0x30, 0x44, + 0xf8, 0xb3, 0x60, 0x45, 0xb1, 0x7c, 0x01, 0x20, + 0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 0x72, 0xc5, + 0x00, 0x06, 0x90, 0x55, 0xd0, 0x01, 0x00, 0x40, + 0xa0, 0x55, 0x0f, 0x87, 0x01, 0x46, 0x00, 0x06, + 0x03, 0xef, 0xd0, 0x3f, 0xa0, 0x38, 0xb0, 0x01, + 0xa0, 0x37, 0x80, 0x3f, 0x82, 0x34, 0x80, 0x3f, + 0xf2, 0x1a, 0x80, 0x34, 0x80, 0x3f, 0xf2, 0x1a, + 0xd8, 0x00, 0xd8, 0x40, 0xd8, 0x80, 0xd8, 0xc0, + 0xd9, 0x00, 0xd9, 0x40, 0xd9, 0x80, 0xd9, 0xc0, + 0xda, 0x00, 0xda, 0x40, 0xda, 0x80, 0xda, 0xc0, + 0xdb, 0x00, 0xdb, 0x40, 0xdb, 0x80, 0xdb, 0xc0, + 0xdc, 0x00, 0xdc, 0x40, 0xdc, 0x80, 0xdc, 0xc0, + 0xdd, 0x00, 0xdd, 0x40, 0xdd, 0x80, 0xdd, 0xc0, + 0xde, 0x00, 0xde, 0x40, 0xde, 0x80, 0xde, 0xc0, + 0xdf, 0x00, 0xdf, 0x40, 0xdf, 0x80, 0xdf, 0xc0, + 0xde, 0x80, 0xde, 0xc1, 0x00, 0x28, 0xd0, 0x60, + 0x6e, 0x81, 0x80, 0x00, 0x80, 0x05, 0x00, 0xe3, + 0xd1, 0x88, 0x00, 0x73, 0xd5, 0x80, 0x60, 0x06, + 0xb1, 0xbc, 0x00, 0xfa, 0xd0, 0x80, 0x60, 0x06, + 0x00, 0x26, 0xd0, 0x6c, 0x6e, 0x81, 0x04, 0xf4, + 0xdc, 0x00, 0x00, 0xee, 0xd1, 0x94, 0x60, 0x06, + 0x00, 0xed, 0xd0, 0x50, 0x6e, 0x81, 0x00, 0x22, + 0xd0, 0x70, 0x6e, 0x81, 0x00, 0xee, 0xd0, 0x74, + 0x6e, 0x81, 0xd0, 0x4c, 0x6e, 0x81, 0xd0, 0x02, + 0x00, 0xef, 0xd0, 0x6c, 0x60, 0x01, 0xd0, 0x03, + 0x00, 0xef, 0xd0, 0x70, 0x60, 0x01, 0x00, 0xe0, + 0xd0, 0x48, 0xd0, 0x02, 0x60, 0x01, 0x00, 0x32, + 0xdf, 0x20, 0xa0, 0x1c, 0x00, 0x21, 0xd0, 0x60, + 0xa0, 0x76, 0x00, 0x34, 0xd5, 0x70, 0x80, 0x3f, + 0x00, 0x23, 0xd0, 0x5c, 0x00, 0x4a, 0xd0, 0x72, + 0x70, 0x40, 0x00, 0x06, 0x00, 0x22, 0xd1, 0xa4, + 0x6e, 0xc6, 0xd0, 0x58, 0x6e, 0xc1, 0xd0, 0xc9, + 0x00, 0xed, 0xd0, 0x54, 0x60, 0xc1, 0x00, 0x22, + 0xd0, 0x40, 0x60, 0xc1, 0x00, 0x22, 0xd0, 0x60, + 0x60, 0xc1, 0x82, 0x34, 0x80, 0x3f, 0xd6, 0xd9, + 0x01, 0x2d, 0xd6, 0x0c, 0x16, 0x08, 0xd0, 0x55, + 0xd0, 0x2c, 0x60, 0x40, 0xd0, 0x70, 0x00, 0xfb, + 0xd1, 0x00, 0x60, 0x01, 0x00, 0x2b, 0xd4, 0x10, + 0x00, 0x29, 0xd4, 0x40, 0x00, 0x2b, 0xd0, 0x90, + 0xc0, 0xc2, 0xd1, 0x18, 0xd1, 0x44, 0xa1, 0x50, + 0x00, 0x21, 0xd0, 0xb6, 0xd0, 0xd7, 0x00, 0x29, + 0xd0, 0x04, 0x64, 0x00, 0xb0, 0x3c, 0x64, 0x40, + 0x80, 0x34, 0x80, 0x3f, 0xd0, 0x40, 0x00, 0x35, + 0xd0, 0x00, 0x60, 0x01, 0xd0, 0x48, 0x6e, 0x81, + 0xd0, 0x44, 0x6e, 0x81, 0x00, 0x64, 0xd1, 0x80, + 0x6e, 0x86, 0x01, 0x3c, 0xd2, 0x39, 0xe0, 0x46, + 0xd0, 0x00, 0xd0, 0x40, 0xd0, 0x80, 0xd0, 0xc0, + 0xd1, 0x00, 0xd1, 0x40, 0xd1, 0x80, 0xd1, 0xc0, + 0xd2, 0x00, 0xd2, 0x40, 0xd2, 0x80, 0xd2, 0xc0, + 0xd3, 0x00, 0xd3, 0x40, 0xd3, 0x80, 0xd3, 0xc0, + 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, + 0xd5, 0x00, 0xd5, 0x40, 0xd5, 0x80, 0xd5, 0xc0, + 0xd6, 0x00, 0xd6, 0x40, 0xd6, 0x80, 0xd6, 0xc0, + 0xd7, 0x00, 0xd7, 0x40, 0xd7, 0x80, 0xd7, 0xc0, + 0x0f, 0xc5, 0x50, 0x00, 0x01, 0x46, 0x00, 0x06, + 0xde, 0x80, 0xde, 0xc1, 0x03, 0x2f, 0xd0, 0x33, + 0xa0, 0x38, 0xb0, 0x01, 0xa0, 0x37, 0x80, 0x3f, + 0x08, 0x20, 0xdf, 0x00, 0x82, 0x34, 0x80, 0x3f, + 0x00, 0xee, 0xd0, 0x08, 0x77, 0xc0, 0xb0, 0x04, + 0x77, 0x80, 0xb0, 0x04, 0xc0, 0x5f, 0x30, 0x5e, + 0x60, 0x40, 0xd7, 0x00, 0xb7, 0x01, 0x80, 0x34, + 0x80, 0x3f, 0x00, 0x60, 0xd0, 0x80, 0x00, 0xec, + 0xd0, 0x40, 0x60, 0x81, 0xb0, 0x7c, 0x60, 0x81, + 0x00, 0xa0, 0xd0, 0x80, 0xb0, 0x74, 0x60, 0x81, + 0xb0, 0x7c, 0x60, 0x81, 0x00, 0x68, 0xd0, 0x80, + 0x6e, 0x82, 0x00, 0xef, 0xd0, 0x8c, 0x6e, 0x82, + 0x00, 0x06, 0xd0, 0x11, 0xa0, 0x38, 0x80, 0x3f, + 0x08, 0x20, 0xd0, 0x40, 0x10, 0x48, 0xa0, 0x4a, + 0xa0, 0x5b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08, + 0xa0, 0x27, 0xa0, 0x0a, 0x90, 0x4d, 0x0f, 0xff, + 0xd8, 0x1f, 0x40, 0x40, 0xa0, 0x4d, 0x80, 0x0a, + 0x80, 0x07, 0x80, 0x1b, 0x80, 0x27, 0x00, 0x60, + 0xd0, 0x00, 0xa0, 0x09, 0x80, 0x28, 0x01, 0x20, + 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, + 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, + 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x29, + 0x80, 0x2b, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38, + 0x80, 0x3f, 0x01, 0xb0, 0xd0, 0x10, 0xa0, 0x37, + 0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38, + 0x00, 0xea, 0xd0, 0x00, 0xd0, 0x4e, 0x0f, 0x0b, + 0x70, 0x40, 0x00, 0x06, 0x00, 0x21, 0xd0, 0x88, + 0x00, 0xe1, 0xd0, 0x60, 0x60, 0x81, 0x00, 0x2b, + 0xd0, 0x80, 0x00, 0xe0, 0xd0, 0x6c, 0x60, 0x81, + 0xb0, 0x7c, 0x00, 0x29, 0xd0, 0x80, 0x60, 0x81, + 0xb0, 0x7c, 0xd0, 0x82, 0x60, 0x81, 0xb0, 0x7c, + 0xd0, 0x85, 0x60, 0x81, 0xb0, 0x7c, 0x03, 0xaa, + 0xd0, 0x98, 0x60, 0x81, 0xb0, 0x7c, 0x6e, 0x81, + 0x00, 0x27, 0xd0, 0x40, 0x6e, 0x81, 0xb0, 0x7c, + 0x6e, 0x81, 0xb0, 0x7c, 0x6e, 0x81, 0x00, 0x27, + 0xd1, 0x90, 0x6e, 0x86, 0x00, 0x21, 0xd1, 0xb8, + 0x6e, 0x86, 0x00, 0x66, 0xd1, 0xa0, 0xd0, 0x00, + 0x01, 0x64, 0xd0, 0x58, 0x30, 0x01, 0x60, 0x06, + 0x00, 0xed, 0xd1, 0xbc, 0x6e, 0x86, 0x00, 0xec, + 0xd1, 0xb8, 0x6e, 0x86, 0xb1, 0x84, 0x6e, 0x86, + 0x00, 0xee, 0xd1, 0x84, 0x70, 0x46, 0x00, 0x65, + 0xd1, 0x94, 0x60, 0x46, 0x00, 0x64, 0xd1, 0xbc, + 0x6e, 0x86, 0x00, 0x65, 0xd1, 0x80, 0x6e, 0x86, + 0xb1, 0xbc, 0x6e, 0x86, 0xb1, 0xbc, 0x6e, 0x86, + 0x00, 0xed, 0xd1, 0xa8, 0x6e, 0x86, 0xd0, 0x0e, + 0xb1, 0xbc, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, + 0x00, 0x65, 0xd1, 0xa4, 0x60, 0x06, 0x00, 0x28, + 0xd1, 0xa4, 0x6e, 0x86, 0x00, 0x27, 0xd1, 0x98, + 0x6e, 0x86, 0x00, 0x64, 0xd1, 0xa4, 0x6e, 0x86, + 0xd2, 0x01, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, + 0x00, 0x64, 0xd1, 0x80, 0x70, 0x46, 0x6e, 0x86, + 0x00, 0xef, 0xd1, 0x98, 0x70, 0x86, 0x08, 0x20, + 0xd0, 0xcf, 0x30, 0xc1, 0xea, 0x42, 0xd0, 0x81, + 0x00, 0x21, 0xd1, 0xa8, 0x60, 0x86, 0x00, 0xed, + 0xd1, 0xa0, 0x6e, 0xc6, 0x00, 0x65, 0xd1, 0x98, + 0x6e, 0xc6, 0x00, 0x22, 0xd0, 0x00, 0xa0, 0x05, + 0x80, 0x40, 0x00, 0xc6, 0x01, 0x73, 0xd4, 0x3d, + 0xe0, 0x46, 0x50, 0x00, 0x08, 0x20, 0xd0, 0x00, + 0x5f, 0x00, 0x00, 0x64, 0xd0, 0x60, 0x70, 0xc1, + 0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0xb0, 0x7c, + 0x71, 0xc1, 0xc0, 0x87, 0x30, 0x86, 0xf9, 0x83, + 0x10, 0xee, 0xe9, 0x76, 0x10, 0xe1, 0xe9, 0x76, + 0xe2, 0x57, 0x00, 0x63, 0xd0, 0xbf, 0x72, 0x06, + 0xb1, 0xbc, 0x41, 0x82, 0x02, 0x1b, 0xe9, 0x8d, + 0x72, 0x86, 0xb1, 0xbc, 0x41, 0x82, 0xd0, 0x75, + 0x30, 0x48, 0xe9, 0xfe, 0xb0, 0x7f, 0xea, 0x00, + 0x02, 0x1c, 0xe9, 0x96, 0x15, 0xa3, 0xea, 0x57, + 0x10, 0xf0, 0xe9, 0x9a, 0x10, 0xfa, 0xf9, 0xa1, + 0x15, 0xa3, 0xea, 0x57, 0x00, 0x21, 0xd0, 0x4c, + 0x70, 0x41, 0x10, 0x61, 0xfa, 0x57, 0x00, 0xed, + 0xd0, 0x08, 0x70, 0x40, 0xd0, 0x85, 0x40, 0x42, + 0x60, 0x40, 0x00, 0x64, 0xd0, 0x64, 0x62, 0x01, + 0x12, 0x2b, 0xe9, 0xeb, 0x12, 0x3b, 0xe9, 0xd5, + 0x00, 0xec, 0xd0, 0x40, 0x61, 0x81, 0x12, 0x2d, + 0xe9, 0xbf, 0x12, 0x30, 0xe9, 0xd4, 0x12, 0x36, + 0xe9, 0xd4, 0x12, 0x3a, 0xe9, 0xd4, 0xd0, 0x62, + 0x30, 0x48, 0xe9, 0xf2, 0x12, 0x2e, 0xe9, 0xf9, + 0xe1, 0x76, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x40, + 0xd0, 0x85, 0x40, 0x42, 0x60, 0x40, 0xb0, 0x08, + 0x00, 0x21, 0xd0, 0x41, 0x60, 0x40, 0x00, 0x64, + 0xd0, 0x60, 0x62, 0x01, 0xf2, 0x5a, 0x00, 0xed, + 0xd0, 0x20, 0xd0, 0x41, 0x60, 0x40, 0x10, 0xe1, + 0xea, 0x3a, 0xe2, 0x57, 0xe2, 0x53, 0x10, 0xee, + 0xf9, 0xe9, 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, + 0x97, 0x2e, 0xc7, 0x5c, 0xa7, 0x66, 0x81, 0x34, + 0x80, 0x3f, 0x00, 0x21, 0xd0, 0x01, 0xa0, 0x38, + 0x00, 0xc6, 0x00, 0x21, 0xd0, 0x15, 0x0b, 0x09, + 0x00, 0x4d, 0xb0, 0x01, 0xed, 0xe5, 0xd2, 0x1a, + 0xe1, 0xec, 0xf1, 0x18, 0x00, 0xec, 0xd0, 0x40, + 0x71, 0x81, 0xd0, 0x4e, 0x60, 0x46, 0xe2, 0x54, + 0xc0, 0x0a, 0x10, 0x06, 0x52, 0x80, 0x00, 0xed, + 0xd0, 0x40, 0x62, 0x81, 0xe2, 0x53, 0x00, 0x64, + 0xd0, 0x60, 0x62, 0x01, 0xf2, 0x5a, 0xe1, 0x70, + 0x12, 0xa3, 0xf6, 0x57, 0x15, 0xa1, 0xfa, 0x57, + 0x12, 0xa0, 0xea, 0x23, 0x00, 0x65, 0xd1, 0x1c, + 0xd0, 0x75, 0x30, 0x48, 0xea, 0x0a, 0xb1, 0x3c, + 0x71, 0x04, 0x11, 0x20, 0xfa, 0x11, 0x00, 0xec, + 0xd0, 0x40, 0x61, 0x81, 0xe2, 0x57, 0x12, 0xa1, + 0xea, 0x33, 0x00, 0xe2, 0xd0, 0x60, 0x70, 0x01, + 0xb0, 0x7c, 0x70, 0x41, 0x10, 0x0c, 0x50, 0x40, + 0x0c, 0x30, 0xd0, 0x00, 0x31, 0x01, 0xee, 0x21, + 0x21, 0x00, 0xe6, 0x57, 0xe2, 0x23, 0x31, 0x00, + 0xfe, 0x57, 0xd0, 0x75, 0x30, 0x48, 0xea, 0x28, + 0xf2, 0x5a, 0xe2, 0x0d, 0x00, 0xec, 0xd0, 0x40, + 0x71, 0x81, 0x00, 0x63, 0xd1, 0x3f, 0xb1, 0xbc, + 0x41, 0x84, 0x61, 0x81, 0xd0, 0x50, 0x60, 0x46, + 0xe2, 0x57, 0x00, 0xed, 0xd0, 0x7c, 0x70, 0x41, + 0x08, 0x20, 0xd0, 0x00, 0x10, 0x08, 0xe2, 0x1c, + 0xd2, 0x84, 0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86, + 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x46, 0x82, 0x34, + 0x80, 0x3f, 0xc7, 0x5e, 0x97, 0x2e, 0x81, 0x34, + 0x80, 0x3f, 0x02, 0xe8, 0xd0, 0x30, 0xa0, 0x37, + 0xa0, 0x38, 0x08, 0x20, 0xdf, 0x00, 0x80, 0x73, + 0x80, 0x3f, 0x00, 0xc6, 0x01, 0x7a, 0xde, 0x1a, + 0xe0, 0x46, 0xf2, 0x5a, 0x00, 0x64, 0xd0, 0x60, + 0x62, 0x01, 0x02, 0x3c, 0xdc, 0x89, 0xe0, 0x46, + 0x00, 0x28, 0xd0, 0x64, 0x70, 0x81, 0x00, 0x22, + 0xd0, 0x00, 0x50, 0x80, 0x60, 0x81, 0x0f, 0xc5, + 0x50, 0x00, 0x50, 0x00, 0x00, 0xed, 0xd1, 0xa4, + 0x72, 0x86, 0x00, 0xef, 0xd1, 0x90, 0x70, 0x46, + 0x10, 0x5c, 0x10, 0x65, 0xed, 0x7d, 0xd0, 0x46, + 0xc0, 0x0a, 0x10, 0x40, 0x60, 0x46, 0x00, 0x22, + 0xd0, 0x73, 0x30, 0x54, 0xe9, 0x8e, 0x12, 0xa4, + 0xe9, 0xb5, 0x15, 0x20, 0xe9, 0xc0, 0xb0, 0x7b, + 0xe9, 0xc3, 0xb0, 0x41, 0xe9, 0xc9, 0xc0, 0x54, + 0x10, 0x5c, 0x10, 0x6e, 0xe9, 0xc6, 0xe1, 0xb5, + 0x00, 0x28, 0xd1, 0xb0, 0xd0, 0x00, 0x60, 0x06, + 0x12, 0xa4, 0xf9, 0xb2, 0x00, 0xed, 0xd1, 0x9c, + 0x62, 0x86, 0xd2, 0x80, 0x00, 0xed, 0xd1, 0xa4, + 0x62, 0x86, 0xd0, 0x02, 0x00, 0xec, 0xd1, 0xbc, + 0x60, 0x06, 0x00, 0x64, 0xd1, 0xa0, 0x72, 0x06, + 0x12, 0x21, 0xf9, 0xa6, 0xd2, 0x0d, 0x62, 0x06, + 0x00, 0xed, 0xd1, 0xa0, 0x61, 0x86, 0xd0, 0x0e, + 0x00, 0xed, 0xd1, 0xac, 0x60, 0x06, 0xb1, 0xbc, + 0x60, 0x06, 0x00, 0x65, 0xd1, 0xa4, 0x60, 0x06, + 0x01, 0x7e, 0xd2, 0x32, 0xe1, 0xcb, 0x01, 0x46, + 0x90, 0x49, 0x00, 0x60, 0xd0, 0x00, 0x50, 0x40, + 0xa0, 0x49, 0x80, 0x3f, 0x00, 0xc6, 0x0c, 0x09, + 0x05, 0x0d, 0xe1, 0x70, 0x01, 0xbf, 0xd0, 0x41, + 0xe1, 0xcb, 0x01, 0xbb, 0xda, 0x10, 0xe1, 0xcb, + 0x01, 0xbd, 0xda, 0x0b, 0xe1, 0xcb, 0x03, 0xb9, + 0xd8, 0x10, 0x01, 0x46, 0x90, 0x49, 0x00, 0x60, + 0xd1, 0x00, 0x50, 0x44, 0x30, 0x44, 0xa0, 0x49, + 0x80, 0x3f, 0x00, 0xc6, 0xe0, 0x46, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x01, 0xfa, 0xd4, 0x3d, + 0x00, 0x25, 0xdc, 0xd8, 0xf0, 0x4a, 0x00, 0x26, + 0xd0, 0x18, 0xd0, 0x40, 0x60, 0x40, 0x00, 0x28, + 0xd0, 0x24, 0x70, 0x40, 0xd0, 0x82, 0x50, 0x42, + 0x60, 0x40, 0x00, 0xec, 0xd0, 0xa4, 0x70, 0xc2, + 0x10, 0xe0, 0xf9, 0x81, 0x00, 0xec, 0xd1, 0x98, + 0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0, + 0xe9, 0x8e, 0xd0, 0x40, 0x60, 0x46, 0xe1, 0x81, + 0xd0, 0x40, 0x00, 0xe6, 0xd0, 0x10, 0x60, 0x40, + 0xb0, 0x3c, 0x60, 0x40, 0xb0, 0x3c, 0x60, 0x40, + 0xd0, 0xe0, 0x00, 0xea, 0xd0, 0x40, 0x00, 0xe8, + 0xd0, 0x82, 0x01, 0x46, 0x70, 0x01, 0xb0, 0x7c, + 0x60, 0x02, 0xb0, 0xbc, 0x00, 0x06, 0x00, 0xc6, + 0xb0, 0xc1, 0xed, 0x9b, 0x80, 0x49, 0xd6, 0x44, + 0xd5, 0x43, 0x00, 0xe0, 0xd1, 0x80, 0x00, 0x06, + 0x0b, 0x09, 0x01, 0x0d, 0x0b, 0x09, 0x61, 0x06, + 0xb1, 0xbc, 0x01, 0x4d, 0x09, 0x09, 0x61, 0x46, + 0xb1, 0xbc, 0x00, 0xcd, 0x09, 0x09, 0x10, 0xe4, + 0xed, 0xb8, 0x60, 0xc6, 0xb1, 0xbc, 0x00, 0xcd, + 0x60, 0xc6, 0x00, 0xed, 0xd0, 0x04, 0x70, 0x00, + 0x10, 0x20, 0xf9, 0xd8, 0xd0, 0x0a, 0x40, 0x03, + 0xe9, 0xc9, 0x10, 0xe2, 0xe9, 0xc9, 0x10, 0xe7, + 0xe9, 0xc9, 0x10, 0xe8, 0xf9, 0xd8, 0x01, 0x46, + 0x90, 0x10, 0x00, 0x20, 0xd0, 0x44, 0x50, 0x40, + 0x00, 0xc6, 0xa0, 0x50, 0x00, 0xa0, 0xd0, 0x00, + 0xa0, 0x05, 0x80, 0x40, 0x00, 0xed, 0xd1, 0xa4, + 0xd0, 0x04, 0x60, 0x06, 0x00, 0xee, 0xd1, 0xac, + 0x73, 0x86, 0x10, 0xe3, 0xe5, 0xe3, 0xe9, 0xe8, + 0x00, 0xe7, 0xd0, 0x40, 0x00, 0xae, 0xd0, 0xbb, + 0xe1, 0xec, 0x01, 0x24, 0xd0, 0x6b, 0x00, 0xea, + 0xd0, 0xa6, 0xe1, 0xec, 0x01, 0x21, 0xd0, 0x7b, + 0x00, 0xe8, 0xd0, 0x90, 0x13, 0xa0, 0xf9, 0xef, + 0xc0, 0x42, 0x00, 0xe0, 0xd1, 0xa8, 0x60, 0x46, + 0xb1, 0x98, 0x0b, 0xc9, 0x00, 0x4d, 0x09, 0x09, + 0x10, 0x44, 0x00, 0x8d, 0x20, 0x42, 0x10, 0x5f, + 0x60, 0x46, 0xb1, 0xb8, 0x00, 0x90, 0xea, 0x1c, + 0x0a, 0x89, 0x00, 0x8d, 0x60, 0x86, 0xb1, 0xbc, + 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, + 0xea, 0x10, 0x00, 0xe8, 0xd1, 0x80, 0xf2, 0xb0, + 0x10, 0x60, 0xfa, 0x1c, 0x08, 0x49, 0x00, 0xe0, + 0xd1, 0xa4, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, + 0xea, 0x20, 0x00, 0xe9, 0xd1, 0x80, 0xf2, 0xb0, + 0x10, 0x60, 0xea, 0x20, 0x00, 0xe0, 0xd1, 0x88, + 0xd0, 0x40, 0x60, 0x46, 0xd0, 0x00, 0x00, 0xe0, + 0xd1, 0xa8, 0x70, 0x46, 0x00, 0xef, 0xd1, 0x9c, + 0x70, 0x86, 0xb0, 0xb0, 0xee, 0x2a, 0xd0, 0x81, + 0x00, 0x90, 0xea, 0x2d, 0x20, 0x01, 0x10, 0x41, + 0x10, 0x9f, 0x10, 0xa0, 0xee, 0x2a, 0x10, 0x1c, + 0x00, 0x65, 0xd1, 0xa8, 0x60, 0x06, 0x01, 0xb4, + 0xd6, 0x3a, 0xe0, 0x46, 0x02, 0x31, 0xde, 0x13, + 0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x0c, 0x09, + 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, + 0x30, 0x54, 0xe9, 0xea, 0xb0, 0x7d, 0xfa, 0x05, + 0x09, 0x09, 0x01, 0xcd, 0x11, 0xe1, 0xf9, 0xc7, + 0x80, 0x09, 0x80, 0x27, 0x0a, 0x09, 0xd6, 0x45, + 0x00, 0xe1, 0xd1, 0xa0, 0x00, 0x4d, 0x60, 0x46, + 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, + 0x00, 0x50, 0xe9, 0x91, 0xd4, 0x01, 0xb1, 0xbc, + 0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0x00, 0xe0, + 0xd1, 0x80, 0x08, 0x89, 0x00, 0x4d, 0x08, 0x89, + 0x10, 0x4c, 0x71, 0x06, 0x21, 0x01, 0x61, 0x06, + 0xb1, 0xbc, 0x00, 0x4d, 0x0b, 0x49, 0x10, 0x4c, + 0x71, 0x46, 0x21, 0x41, 0x61, 0x46, 0xb1, 0xb0, + 0x00, 0x4d, 0x10, 0x5f, 0x60, 0x46, 0xb1, 0xbc, + 0x0a, 0x09, 0x00, 0x4d, 0x10, 0x4a, 0x70, 0x86, + 0x20, 0x81, 0x60, 0x86, 0x00, 0xe1, 0xd1, 0xac, + 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x09, 0x49, 0x00, 0x8d, 0x60, 0x86, 0xc0, 0x02, + 0x00, 0xe0, 0xd1, 0xa8, 0x70, 0xc6, 0x10, 0xc0, + 0xd0, 0x20, 0x30, 0x01, 0x10, 0xc0, 0x60, 0xc6, + 0xe1, 0x75, 0x11, 0xe2, 0xf9, 0x75, 0x00, 0xe2, + 0xd1, 0x80, 0x08, 0xc9, 0x00, 0x4d, 0x60, 0x46, + 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, + 0xb1, 0xbc, 0x10, 0x60, 0xf9, 0xd7, 0xb1, 0xb4, + 0xe1, 0xde, 0xd2, 0x03, 0x0a, 0x09, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0xb2, 0x01, 0xf9, 0xd8, + 0x0b, 0xc9, 0x00, 0x4d, 0x10, 0x49, 0x10, 0x56, + 0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x89, 0x00, 0x4d, + 0x10, 0x4a, 0x10, 0x56, 0x60, 0x46, 0xe1, 0x75, + 0x0b, 0x2c, 0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0x77, + 0x00, 0xe0, 0xd0, 0x6c, 0x00, 0xe0, 0xd1, 0x80, + 0xd0, 0x0a, 0xf1, 0xfe, 0x00, 0xe1, 0xd1, 0xb0, + 0xd0, 0x02, 0xf1, 0xfe, 0x00, 0xe0, 0xd1, 0x80, + 0x76, 0x86, 0xb1, 0xbc, 0x73, 0x46, 0xe2, 0x3c, + 0x70, 0x81, 0x60, 0x86, 0xb1, 0xbc, 0xb0, 0x7c, + 0xb0, 0x01, 0xed, 0xfe, 0x0f, 0xc5, 0x00, 0xe1, + 0xd1, 0xa0, 0x70, 0x46, 0xd0, 0x8f, 0x40, 0x42, + 0x00, 0x25, 0xd0, 0xe0, 0x00, 0x24, 0xd1, 0x20, + 0x10, 0x6a, 0xea, 0x1e, 0x00, 0x66, 0xd0, 0xe0, + 0x00, 0x62, 0xd1, 0x00, 0x10, 0x66, 0xea, 0x1e, + 0x00, 0x6e, 0xd0, 0xc0, 0x10, 0x64, 0xea, 0x1e, + 0x00, 0x2b, 0xd0, 0xd0, 0x00, 0x29, 0xd1, 0x00, + 0x00, 0xe0, 0xd1, 0x80, 0x76, 0x86, 0x16, 0xa0, + 0xe9, 0xee, 0x30, 0xda, 0xe5, 0xee, 0xb1, 0xbc, + 0x73, 0x46, 0x13, 0x60, 0xe9, 0xee, 0x31, 0x0d, + 0xe5, 0xee, 0xd0, 0x82, 0xb1, 0xbc, 0x70, 0x46, + 0x10, 0x60, 0xe9, 0xee, 0xb0, 0x81, 0xee, 0x2c, + 0x00, 0xe0, 0xd0, 0x40, 0x00, 0xe0, 0xd1, 0xac, + 0xd0, 0x0a, 0xf1, 0xfe, 0x00, 0xe1, 0xd0, 0x70, + 0xd0, 0x02, 0xf1, 0xfe, 0x00, 0xec, 0xd1, 0x98, + 0xd0, 0x40, 0x60, 0x46, 0x00, 0xe0, 0xd0, 0x8c, + 0x70, 0x82, 0x00, 0x21, 0xd0, 0x70, 0x60, 0x81, + 0xd0, 0x40, 0x00, 0x25, 0xd0, 0x20, 0x30, 0x1a, + 0xfa, 0x50, 0x00, 0x24, 0xd0, 0x20, 0x30, 0x0d, + 0xfa, 0x50, 0xd0, 0x41, 0x00, 0x21, 0xd1, 0x84, + 0x60, 0x46, 0xb6, 0xb1, 0x16, 0x9c, 0x01, 0x7a, + 0xde, 0x1a, 0xe0, 0x46, 0x02, 0x31, 0xde, 0x13, + 0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x00, 0xec, + 0xd0, 0xa8, 0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x77, + 0x00, 0xec, 0xd1, 0x9c, 0xd0, 0x41, 0x60, 0x46, + 0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x84, 0xd0, 0x40, + 0x60, 0x46, 0xe1, 0x77, 0x0b, 0x49, 0x00, 0xe2, + 0xd1, 0xa0, 0x00, 0x4d, 0x10, 0x5f, 0x00, 0x6f, + 0xd0, 0xff, 0x40, 0x43, 0x60, 0x46, 0xb1, 0xbc, + 0x0b, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x61, + 0xf9, 0x9b, 0xd3, 0xc2, 0x00, 0xec, 0xd1, 0xbc, + 0x63, 0xc6, 0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, + 0xe5, 0x9c, 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, + 0xd0, 0x72, 0x30, 0x54, 0xf9, 0xa9, 0x0b, 0xa0, + 0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0xa0, 0x00, 0xec, + 0xd1, 0x9c, 0xd0, 0x40, 0x60, 0x46, 0x01, 0x7a, + 0xde, 0x1a, 0xe0, 0x46, 0x0b, 0x09, 0x00, 0x4d, + 0x0b, 0x09, 0x00, 0x4d, 0x0a, 0x09, 0x01, 0x4d, + 0x0a, 0x09, 0x00, 0x4d, 0x01, 0x59, 0xe9, 0x96, + 0x09, 0x09, 0x00, 0x4d, 0x10, 0x5f, 0x10, 0x61, + 0xf9, 0x96, 0x09, 0x09, 0x01, 0x4d, 0x11, 0x5f, + 0x0b, 0xc9, 0x00, 0x4d, 0xc0, 0x01, 0x10, 0x5f, + 0x11, 0x4e, 0x51, 0x41, 0x08, 0x49, 0x00, 0x4d, + 0x0b, 0xc9, 0x10, 0x0f, 0x00, 0x4d, 0x50, 0x01, + 0x00, 0xed, 0xd1, 0xb6, 0x01, 0x46, 0x00, 0x06, + 0xa0, 0x3c, 0xa1, 0x7d, 0x60, 0x06, 0x00, 0xc6, + 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, + 0xe0, 0x46, 0x50, 0x00, 0x00, 0xec, 0xd0, 0xac, + 0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x70, 0x00, 0xec, + 0xd1, 0xa0, 0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, + 0x10, 0xe0, 0xe9, 0x7f, 0xd0, 0x40, 0x60, 0x46, + 0xe1, 0x70, 0x0a, 0x89, 0x0b, 0xcd, 0x00, 0xe3, + 0xd1, 0x80, 0x6b, 0xc6, 0x08, 0xc9, 0x05, 0x8d, + 0x15, 0xa3, 0xee, 0x6e, 0x15, 0xa0, 0xea, 0x6e, + 0x90, 0x4d, 0xd0, 0x9f, 0xd0, 0xdf, 0x40, 0x81, + 0x10, 0x55, 0x40, 0xc1, 0x01, 0x46, 0x82, 0x34, + 0x80, 0x3f, 0xc8, 0x1d, 0x81, 0x34, 0x80, 0x3f, + 0x00, 0xc6, 0xd1, 0x23, 0x31, 0x03, 0x11, 0x02, + 0x38, 0x04, 0xb0, 0x8d, 0x10, 0x9d, 0x28, 0x02, + 0xc0, 0x60, 0x00, 0x65, 0xd1, 0x94, 0x71, 0x06, + 0x68, 0x06, 0x30, 0x44, 0x00, 0xed, 0xd1, 0xa8, + 0x70, 0x06, 0x10, 0x20, 0xe9, 0xb0, 0x00, 0xee, + 0xd0, 0xc0, 0x70, 0xc3, 0x20, 0x43, 0xb0, 0x01, + 0xf9, 0xac, 0x60, 0x06, 0x00, 0x64, 0xd1, 0xbc, + 0x71, 0x06, 0xc0, 0x04, 0x21, 0x01, 0x61, 0x06, + 0x10, 0x20, 0xf5, 0xbb, 0x11, 0x20, 0xe5, 0xbb, + 0xb0, 0x41, 0x00, 0x65, 0xd1, 0x80, 0x71, 0x06, + 0x21, 0x01, 0x61, 0x06, 0x00, 0xed, 0xd1, 0xac, + 0x71, 0x06, 0x15, 0xa1, 0xe9, 0xcb, 0xb1, 0x3f, + 0x61, 0x06, 0x15, 0xa3, 0xf9, 0xd6, 0xd0, 0xbf, + 0xe1, 0xd3, 0xd0, 0x40, 0x60, 0x46, 0xb1, 0xbc, + 0x70, 0x86, 0x61, 0x06, 0x31, 0x02, 0xe5, 0xd3, + 0x20, 0x84, 0x00, 0x65, 0xd1, 0xa4, 0x60, 0x86, + 0xd9, 0x40, 0x00, 0xec, 0xd1, 0x94, 0x79, 0x06, + 0xb1, 0x84, 0x78, 0xc6, 0xc0, 0x63, 0x30, 0x64, + 0xe9, 0xf8, 0x00, 0xa7, 0xd0, 0xff, 0x7a, 0x63, + 0x00, 0x65, 0xd0, 0x00, 0x71, 0x00, 0x31, 0x29, + 0xe5, 0xf8, 0xc0, 0x63, 0xc8, 0xc1, 0xb0, 0x78, + 0x40, 0x43, 0xc0, 0xa4, 0x30, 0x81, 0xe9, 0xf2, + 0x7a, 0x41, 0x31, 0x29, 0xf5, 0xe8, 0x21, 0x29, + 0x61, 0x00, 0xb8, 0xfc, 0x79, 0x63, 0xb8, 0xfc, + 0x48, 0xc3, 0x68, 0xc6, 0x00, 0xed, 0xd1, 0xb8, + 0x69, 0x46, 0x80, 0x28, 0x0b, 0xc9, 0x00, 0x4d, + 0x08, 0x49, 0x10, 0x41, 0x00, 0xe3, 0xd1, 0x84, + 0x00, 0x8d, 0x20, 0x42, 0x60, 0x46, 0x00, 0xee, + 0xd1, 0xa4, 0x70, 0x86, 0x10, 0xa1, 0xee, 0x18, + 0xe6, 0x6b, 0x90, 0x86, 0x00, 0x90, 0xea, 0x18, + 0x00, 0xed, 0xd0, 0x1c, 0x70, 0x80, 0xb0, 0x81, + 0xe6, 0x6b, 0x60, 0x80, 0xb1, 0xa8, 0x70, 0x86, + 0x10, 0xa0, 0xfa, 0x6b, 0x00, 0x21, 0xd0, 0x38, + 0x70, 0x80, 0x10, 0xa0, 0xfa, 0x6b, 0x0f, 0xef, + 0xd0, 0xbf, 0x30, 0x81, 0xfa, 0x22, 0x60, 0x00, + 0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, 0x15, 0xa3, + 0xea, 0x6b, 0x00, 0xee, 0xd1, 0x80, 0x79, 0x46, + 0x00, 0xf8, 0xd0, 0x00, 0xc4, 0x40, 0x00, 0xe3, + 0xd1, 0x84, 0x78, 0x46, 0x0f, 0xef, 0xd0, 0x3f, + 0x30, 0x21, 0xea, 0x48, 0x00, 0xe0, 0xd1, 0x90, + 0x78, 0x06, 0xc0, 0xa1, 0x18, 0x43, 0x28, 0x42, + 0x18, 0x43, 0x28, 0x42, 0x18, 0x1e, 0xd8, 0x80, + 0x08, 0x11, 0xea, 0x41, 0x28, 0xa1, 0x18, 0x01, + 0x18, 0x5f, 0x18, 0x60, 0xee, 0x3e, 0xc0, 0x51, + 0x30, 0x62, 0xee, 0x4e, 0xc8, 0x91, 0x18, 0x9f, + 0x00, 0x21, 0xd1, 0xb8, 0xd0, 0x01, 0x60, 0x06, + 0x00, 0xef, 0xd0, 0x10, 0xd0, 0x72, 0x60, 0x40, + 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc8, 0xdc, + 0xc9, 0x1d, 0x81, 0x34, 0x80, 0x3f, 0x00, 0xc6, + 0x38, 0xe4, 0xee, 0x5e, 0xea, 0x52, 0x28, 0xe5, + 0x01, 0x46, 0x90, 0x6d, 0x28, 0xc1, 0x00, 0xc6, + 0x38, 0xe2, 0xf6, 0x6b, 0xdb, 0x08, 0xf1, 0x16, + 0xf1, 0x18, 0x00, 0x21, 0xd1, 0xb4, 0x61, 0x86, + 0xe2, 0x52, 0x01, 0xf7, 0xd2, 0x19, 0xe0, 0x46, + 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, + 0xe0, 0x46, 0x50, 0x00, 0x02, 0x31, 0xde, 0x13, + 0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0xdb, 0x09, + 0x00, 0xe3, 0xd0, 0x1c, 0x6b, 0x00, 0xda, 0xc1, + 0x00, 0xe6, 0xd1, 0x98, 0x70, 0x06, 0xb1, 0x84, + 0x60, 0x06, 0xb1, 0x84, 0x60, 0x06, 0x05, 0x9f, + 0xe9, 0x9f, 0x08, 0x49, 0xd1, 0x17, 0x46, 0x44, + 0x00, 0x4d, 0x10, 0x43, 0x26, 0x41, 0x08, 0xc9, + 0x05, 0xcd, 0xb5, 0xc1, 0xe5, 0xcc, 0xc0, 0x57, + 0x15, 0xc6, 0x25, 0xc1, 0x15, 0xa3, 0xf9, 0x9f, + 0x08, 0x49, 0xd1, 0x0f, 0x46, 0x44, 0x00, 0x4d, + 0x10, 0x44, 0x26, 0x41, 0x08, 0xc9, 0x06, 0x0d, + 0xb6, 0x01, 0xe5, 0xcc, 0xc0, 0x58, 0x16, 0x06, + 0x26, 0x01, 0x08, 0x49, 0x00, 0x4d, 0x10, 0x60, + 0xe9, 0xa6, 0x0a, 0x09, 0x00, 0x4d, 0xe1, 0x9f, + 0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, 0xe5, 0xa7, + 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, + 0x30, 0x54, 0xf9, 0xb3, 0xd4, 0x40, 0xf3, 0xb0, + 0xe1, 0xab, 0xb0, 0x7d, 0xf9, 0xb8, 0x02, 0x34, + 0xd4, 0x44, 0xe0, 0x46, 0x00, 0xec, 0xd1, 0xa0, + 0xd0, 0x40, 0x60, 0x46, 0x02, 0x3c, 0xdc, 0x89, + 0x00, 0xec, 0xd1, 0x80, 0x70, 0x46, 0xb1, 0xbc, + 0x70, 0x86, 0x30, 0x81, 0xe8, 0x46, 0x15, 0x63, + 0xe9, 0xc9, 0x05, 0x5e, 0xe8, 0x46, 0x01, 0x73, + 0xd4, 0x3d, 0xe0, 0x46, 0xd5, 0x00, 0xb5, 0x01, + 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0xcc, 0xc0, 0xcd, 0x01, + 0xcd, 0x42, 0xcd, 0x83, 0x00, 0xa0, 0xd0, 0x01, + 0xa0, 0x38, 0xc8, 0x7f, 0xc8, 0x06, 0xb1, 0xbe, + 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x58, 0x80, + 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x96, 0xc9, 0x00, + 0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, 0xc9, 0x40, + 0xf3, 0x92, 0x59, 0x40, 0xc0, 0x22, 0xc0, 0x65, + 0xc0, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0x80, + 0xf3, 0x92, 0x59, 0x00, 0xf3, 0x96, 0xc9, 0x40, + 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x59, 0x40, + 0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x92, 0x58, 0x80, + 0xc0, 0x23, 0xc0, 0x62, 0xd0, 0x88, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, + 0x58, 0xc0, 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, + 0x59, 0xc0, 0xc0, 0x24, 0xc0, 0x67, 0xd0, 0x90, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x00, + 0xf3, 0x92, 0x59, 0x80, 0xf3, 0x96, 0xc9, 0xc0, + 0xf3, 0x96, 0xca, 0x00, 0xf3, 0x92, 0x59, 0xc0, + 0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, 0x59, 0x00, + 0xc0, 0x25, 0xc0, 0x64, 0xd0, 0x98, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, + 0x58, 0x80, 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, + 0x59, 0x00, 0xc0, 0x23, 0xc0, 0x64, 0xd0, 0x84, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0xc0, + 0xf3, 0x92, 0x59, 0x40, 0xf3, 0x96, 0xc9, 0x00, + 0xf3, 0x92, 0x5a, 0x40, 0xc0, 0x26, 0xc0, 0x69, + 0xd0, 0xa0, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, + 0xc9, 0x80, 0xf3, 0x92, 0x5a, 0x00, 0xf3, 0x96, + 0xca, 0x40, 0xf3, 0x92, 0x5a, 0x40, 0xf3, 0x96, + 0xca, 0x80, 0xf3, 0x92, 0x59, 0x80, 0xc0, 0x27, + 0xc0, 0x66, 0xd0, 0xa8, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x92, 0x59, 0x00, + 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x58, 0xc0, + 0xc0, 0x22, 0xc0, 0x63, 0xd0, 0x8c, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x92, 0x59, 0x80, 0xc0, 0x25, + 0xc0, 0x66, 0xd0, 0x94, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x59, 0xc0, + 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, 0x5a, 0x80, + 0xc0, 0x28, 0xc0, 0x6a, 0xd0, 0xb0, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, + 0x59, 0x40, 0xc0, 0x29, 0xc0, 0x65, 0xd0, 0xb8, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x80, + 0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, 0xca, 0x00, + 0xf3, 0x92, 0x58, 0x80, 0xc0, 0x24, 0xc0, 0x62, + 0xd0, 0x9c, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92, + 0x5a, 0x00, 0xc0, 0x27, 0xc0, 0x68, 0xd0, 0xa4, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xca, 0x80, + 0xf3, 0x92, 0x59, 0x80, 0xf3, 0x96, 0xca, 0x40, + 0xf3, 0x92, 0x5a, 0x40, 0xf3, 0x96, 0xc9, 0x40, + 0xf3, 0x92, 0x5a, 0x80, 0xc0, 0x23, 0xc0, 0x6a, + 0xd0, 0xac, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92, + 0x59, 0x40, 0xc0, 0x26, 0xc0, 0x65, 0xd0, 0xb4, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x00, + 0xf3, 0x92, 0x59, 0x00, 0xc0, 0x29, 0xc0, 0x64, + 0xd0, 0xbc, 0x20, 0x86, 0xf3, 0x9a, 0xc0, 0x33, + 0xc0, 0x74, 0xc0, 0xb5, 0xc0, 0xf6, 0xd0, 0x40, + 0x00, 0xa0, 0xd8, 0x00, 0xa8, 0x38, 0x08, 0x45, + 0x0a, 0x09, 0x00, 0x0d, 0x0f, 0xc5, 0x50, 0x00, + 0x0a, 0x09, 0x00, 0x0d, 0x10, 0x08, 0x0f, 0xc5, + 0x01, 0x46, 0x00, 0x06, 0xa0, 0x7c, 0xa0, 0x3d, + 0x60, 0x42, 0x00, 0xc6, 0x0f, 0xc5, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x14, 0x48, 0xd0, 0x81, + 0x00, 0xef, 0xd1, 0x8c, 0x71, 0x46, 0x11, 0x60, + 0xfb, 0xb1, 0x60, 0x86, 0x71, 0x46, 0x31, 0x42, + 0xfb, 0xb1, 0x00, 0xec, 0xd1, 0x0c, 0x74, 0x84, + 0x00, 0x68, 0xd0, 0x80, 0x70, 0x02, 0x10, 0x20, + 0xfb, 0xc4, 0xc4, 0x82, 0xc4, 0xd2, 0xb4, 0xfc, + 0xda, 0x00, 0xda, 0x4f, 0x0a, 0x09, 0x0f, 0xef, + 0xd0, 0x3f, 0xb4, 0x7f, 0xca, 0x29, 0x1a, 0x18, + 0x4a, 0x00, 0x1a, 0x48, 0x00, 0x8d, 0x2a, 0x42, + 0xd0, 0x03, 0x40, 0x11, 0xfb, 0xe3, 0xb4, 0x44, + 0x00, 0xa0, 0xd0, 0xc0, 0x30, 0xd3, 0xff, 0xe3, + 0xb4, 0xfe, 0x01, 0x46, 0x00, 0x06, 0xaa, 0x3d, + 0xaa, 0x7c, 0x6a, 0x53, 0x00, 0xc6, 0xb4, 0xfe, + 0xb4, 0x7c, 0x1a, 0x61, 0xfb, 0xc8, 0xb4, 0x43, + 0x00, 0xef, 0xd0, 0x3f, 0x40, 0x11, 0xeb, 0xf7, + 0xb0, 0xc4, 0xe7, 0xf7, 0xeb, 0xee, 0x61, 0x53, + 0x64, 0x52, 0x64, 0xc4, 0x00, 0x28, 0xd1, 0x24, + 0x70, 0x04, 0x00, 0x21, 0xd0, 0x80, 0x50, 0x02, + 0x60, 0x04, 0x61, 0x46, 0x0a, 0x09, 0x0f, 0xc5, + 0x50, 0x00, 0x50, 0x00, 0x02, 0x31, 0xde, 0x13, + 0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x01, 0xfa, + 0xd4, 0x3d, 0x00, 0x25, 0xdc, 0xd8, 0xf0, 0x4a, + 0x09, 0x09, 0x01, 0xcd, 0x11, 0xe8, 0xf9, 0xe2, + 0x00, 0xe3, 0xd1, 0x9c, 0x09, 0x09, 0x05, 0xcd, + 0xb5, 0xc1, 0x09, 0x09, 0x00, 0x4d, 0xb0, 0x41, + 0x10, 0x46, 0x25, 0xc1, 0x09, 0x09, 0x06, 0x0d, + 0xb6, 0x01, 0x09, 0x09, 0x00, 0x4d, 0x08, 0x89, + 0xb0, 0x41, 0x10, 0x46, 0x26, 0x01, 0x00, 0x8d, + 0x08, 0x89, 0x10, 0x82, 0xd0, 0x04, 0xc0, 0x55, + 0x00, 0x40, 0x40, 0x40, 0x05, 0x4d, 0x08, 0x49, + 0x0b, 0x0d, 0xd1, 0x00, 0x15, 0x63, 0xe9, 0xa2, + 0xd1, 0x01, 0x55, 0x41, 0xdb, 0x01, 0x4b, 0x15, + 0xa1, 0x1b, 0x08, 0x89, 0x00, 0x4d, 0x08, 0x49, + 0x10, 0x41, 0xd1, 0x19, 0x46, 0x44, 0x26, 0x41, + 0x00, 0xcd, 0x08, 0x49, 0x10, 0xc4, 0x00, 0x4d, + 0x08, 0x49, 0x10, 0x41, 0x20, 0x81, 0xa0, 0x89, + 0x00, 0x4d, 0x10, 0x43, 0x20, 0xc1, 0xa0, 0xe8, + 0x08, 0x49, 0x00, 0x4d, 0x1b, 0x03, 0x5b, 0x01, + 0xbb, 0x3f, 0x6b, 0x06, 0x08, 0x49, 0xb1, 0xbc, + 0x00, 0x4d, 0x60, 0x46, 0x08, 0x49, 0xb1, 0xbc, + 0x0a, 0xcd, 0x1a, 0xc2, 0x4a, 0xd9, 0x1a, 0xde, + 0x6a, 0xc6, 0x08, 0x49, 0xb1, 0xbc, 0x00, 0x4d, + 0x60, 0x46, 0x10, 0x60, 0xea, 0x3e, 0xb1, 0xbc, + 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x08, 0xc9, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x09, 0xc9, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x0a, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xe2, 0x3e, + 0x11, 0xe3, 0xfa, 0x00, 0x00, 0xe7, 0xd0, 0xc0, + 0xd0, 0x84, 0xb0, 0x81, 0xe6, 0x3e, 0x08, 0x49, + 0x00, 0x4d, 0x60, 0x43, 0xb0, 0xfc, 0x10, 0x60, + 0xe9, 0xe7, 0x10, 0xa3, 0xf9, 0xf4, 0x00, 0xe8, + 0xd1, 0x80, 0xe1, 0xf8, 0x10, 0xa2, 0xf9, 0xfa, + 0x00, 0xe9, 0xd1, 0x80, 0xf2, 0xb0, 0xe1, 0xe7, + 0xd2, 0x3f, 0x0a, 0x09, 0x00, 0x4d, 0xb2, 0x01, + 0xf5, 0xfb, 0xe1, 0xe7, 0x11, 0xe7, 0xfa, 0x3e, + 0xd4, 0x01, 0x00, 0xe1, 0xd0, 0x24, 0x70, 0x00, + 0x10, 0x21, 0xea, 0x0d, 0x15, 0x63, 0xfa, 0x0d, + 0xd4, 0x03, 0x44, 0x2c, 0xb4, 0x3f, 0x00, 0xe6, + 0xd1, 0x90, 0x0b, 0x09, 0x00, 0x4d, 0x09, 0x49, + 0x10, 0x45, 0x00, 0x8d, 0x50, 0x81, 0xd0, 0x40, + 0x10, 0x87, 0x10, 0x98, 0x30, 0x42, 0xf2, 0x61, + 0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x09, 0x00, 0x0d, + 0x09, 0x49, 0x00, 0x0d, 0xb4, 0x01, 0xfa, 0x0f, + 0x00, 0xe6, 0xd0, 0x18, 0x30, 0x06, 0xe6, 0x29, + 0x60, 0x46, 0xb1, 0xbc, 0xe2, 0x22, 0x00, 0xe0, + 0xd1, 0x88, 0x70, 0x46, 0x10, 0x63, 0xea, 0x39, + 0x10, 0x64, 0xea, 0x39, 0x00, 0xe6, 0xd1, 0x90, + 0xd0, 0x00, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, + 0xb1, 0xbc, 0x60, 0x06, 0xe2, 0x3e, 0x00, 0xef, + 0xd1, 0x84, 0x70, 0x46, 0x10, 0x60, 0xfa, 0x30, + 0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, 0xe6, 0x3f, + 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, + 0x30, 0x54, 0xfa, 0x4b, 0xd4, 0x40, 0xf3, 0xb0, + 0xe2, 0x43, 0xb0, 0x7d, 0xe9, 0x7a, 0x00, 0xec, + 0xd1, 0xa0, 0xd0, 0x40, 0x60, 0x46, 0x02, 0x3c, + 0xdc, 0x89, 0x00, 0xec, 0xd1, 0x80, 0x70, 0x46, + 0xb1, 0xbc, 0x70, 0x86, 0x30, 0x81, 0xe8, 0x46, + 0x15, 0x63, 0xea, 0x5e, 0x05, 0x5e, 0xe8, 0x46, + 0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, 0x00, 0xe0, + 0xd0, 0x00, 0x70, 0xc0, 0x10, 0xc1, 0x00, 0xe0, + 0xd0, 0x08, 0x70, 0x00, 0x10, 0x23, 0xea, 0x75, + 0xc0, 0x83, 0x10, 0x9d, 0x30, 0xc2, 0x10, 0x9f, + 0x30, 0xc2, 0x00, 0xef, 0xd0, 0xac, 0x70, 0x82, + 0x10, 0xa3, 0xea, 0x75, 0x10, 0xc1, 0xc0, 0x83, + 0x30, 0x81, 0xe6, 0x7e, 0xc0, 0x83, 0x20, 0x81, + 0xf6, 0x7f, 0xd0, 0x40, 0x30, 0x43, 0x0f, 0xc5, + 0xc0, 0x43, 0x0f, 0xc5, 0x00, 0xed, 0xd1, 0xa4, + 0x72, 0x86, 0x15, 0xa3, 0xee, 0x23, 0x15, 0xa1, + 0xe6, 0x23, 0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, + 0xd8, 0xc4, 0x15, 0x63, 0xe9, 0x7e, 0x48, 0xd5, + 0x18, 0xde, 0x18, 0xe0, 0xe9, 0xc2, 0x00, 0xed, + 0xd1, 0xb4, 0x79, 0xc6, 0x19, 0xe0, 0xe9, 0x8c, + 0x00, 0xed, 0xd0, 0x3a, 0x79, 0xc6, 0x69, 0xc0, + 0xd9, 0xc0, 0x69, 0xc6, 0x00, 0xed, 0xd0, 0x38, + 0x79, 0x40, 0x19, 0x60, 0xe9, 0x98, 0x00, 0x28, + 0xd0, 0x24, 0x70, 0x40, 0x02, 0x20, 0xd0, 0x80, + 0x50, 0x42, 0x60, 0x40, 0x15, 0xa3, 0xe9, 0x9f, + 0x00, 0xec, 0xd1, 0xb8, 0x79, 0xc6, 0x69, 0x46, + 0xc9, 0x67, 0x00, 0xec, 0xd9, 0xb4, 0x70, 0x66, + 0x00, 0xec, 0xd1, 0xbc, 0x70, 0x06, 0x10, 0x20, + 0xed, 0xbe, 0x10, 0x60, 0xe9, 0xc1, 0x00, 0xe0, + 0xda, 0xa8, 0x7a, 0xaa, 0xc0, 0x2a, 0x10, 0x1f, + 0x00, 0x22, 0xd0, 0xa0, 0x70, 0x82, 0x20, 0x6a, + 0x00, 0x9f, 0xe9, 0xb5, 0x20, 0x40, 0x19, 0x60, + 0xf9, 0xb8, 0xc9, 0x41, 0xb0, 0x48, 0x30, 0x65, + 0xf5, 0xbd, 0xb0, 0x70, 0xed, 0xbe, 0xd9, 0x40, + 0x00, 0xed, 0xd1, 0xbc, 0x69, 0x46, 0x69, 0x66, + 0x12, 0xa4, 0xea, 0x21, 0x00, 0xec, 0xd1, 0xbc, + 0x73, 0xc6, 0x15, 0xa3, 0xe9, 0xdf, 0x33, 0xe3, + 0xe5, 0xd3, 0xed, 0xd2, 0x63, 0xc6, 0x00, 0x21, + 0xd1, 0xa8, 0x63, 0xc6, 0x00, 0xed, 0xd1, 0xa0, + 0x63, 0xc6, 0x15, 0xa1, 0xf9, 0xdc, 0x12, 0xa3, + 0xe5, 0xe3, 0xd3, 0xc2, 0x00, 0xec, 0xd1, 0xbc, + 0x63, 0xc6, 0xe1, 0xe3, 0x12, 0xa3, 0xea, 0x21, + 0xe1, 0xe3, 0x12, 0xa2, 0xf6, 0x21, 0x13, 0xe0, + 0xfa, 0x21, 0x00, 0xee, 0xd1, 0x8c, 0x78, 0x06, + 0xb1, 0xbc, 0x78, 0x46, 0xb1, 0xbc, 0x78, 0x86, + 0xd1, 0x88, 0x72, 0x46, 0xd1, 0x84, 0x73, 0x06, + 0x13, 0x20, 0xf9, 0xe3, 0x00, 0x64, 0xd1, 0xa0, + 0x70, 0x46, 0xd0, 0xa2, 0x30, 0x81, 0xe9, 0xff, + 0x10, 0x70, 0xea, 0x11, 0x10, 0x6d, 0xea, 0x14, + 0x10, 0x76, 0xea, 0x19, 0x10, 0x7a, 0xea, 0x28, + 0xe2, 0x3b, 0x18, 0xe0, 0xea, 0x3b, 0x00, 0xed, + 0xd1, 0x80, 0x70, 0x86, 0xb0, 0x81, 0xd0, 0x3f, + 0x40, 0x02, 0x10, 0x20, 0xea, 0x0c, 0x60, 0x86, + 0xf3, 0x8a, 0xe1, 0xe3, 0xc0, 0x02, 0x10, 0x1a, + 0x50, 0x80, 0x60, 0x86, 0xe2, 0x3b, 0x15, 0xa3, + 0xea, 0x21, 0xe2, 0xe9, 0xd2, 0x80, 0x00, 0xed, + 0xd1, 0xa4, 0x62, 0x86, 0xe3, 0x0c, 0x00, 0xed, + 0xd1, 0x88, 0xd0, 0x60, 0x70, 0x06, 0x50, 0x40, + 0x60, 0x46, 0x15, 0xa3, 0xfb, 0x0c, 0xd5, 0x84, + 0xe3, 0x0c, 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, + 0xde, 0x1a, 0xe0, 0x46, 0x00, 0xed, 0xd1, 0x88, + 0xd0, 0x60, 0x70, 0x06, 0x50, 0x40, 0x60, 0x46, + 0x15, 0xa2, 0xe7, 0x0c, 0xee, 0x21, 0x00, 0x21, + 0xd1, 0x8c, 0x18, 0xe0, 0xfa, 0x39, 0x70, 0x46, + 0x10, 0x61, 0xea, 0x70, 0xe2, 0x21, 0x65, 0x86, + 0xe2, 0x21, 0x18, 0xe0, 0xea, 0x70, 0xd1, 0x80, + 0x73, 0x06, 0x15, 0xa2, 0xee, 0x68, 0x00, 0x22, + 0xd1, 0x80, 0x70, 0x46, 0x6b, 0x06, 0xcb, 0x01, + 0xb1, 0xb4, 0x70, 0x46, 0x6a, 0xc6, 0xca, 0xc1, + 0x00, 0x65, 0xd1, 0x98, 0x70, 0x46, 0x10, 0x61, + 0xfa, 0x50, 0x02, 0x41, 0xc3, 0x21, 0xc7, 0xe0, + 0x02, 0x50, 0xea, 0x56, 0xc3, 0x20, 0xc7, 0xe1, + 0xd1, 0x88, 0xd0, 0x01, 0x02, 0x40, 0x62, 0x46, + 0x0f, 0xef, 0xd0, 0x7f, 0x30, 0x6f, 0xfa, 0x5f, + 0xc3, 0x20, 0xc7, 0x4c, 0xd0, 0x00, 0x00, 0x65, + 0xd1, 0x98, 0x70, 0x46, 0x60, 0x06, 0xb0, 0x41, + 0x43, 0x01, 0xe2, 0x70, 0xc3, 0x22, 0xc7, 0xcc, + 0xc7, 0x60, 0xc7, 0xa1, 0x02, 0x50, 0xea, 0x70, + 0xc7, 0x61, 0xc7, 0xa0, 0xdb, 0x80, 0xd1, 0x00, + 0x00, 0xef, 0xd1, 0xa8, 0x70, 0x46, 0x10, 0x60, + 0xfa, 0x7a, 0x00, 0xe0, 0xd1, 0x88, 0x70, 0x46, + 0x00, 0x22, 0xd1, 0xb0, 0x70, 0x86, 0x30, 0x81, + 0xea, 0x82, 0x60, 0x46, 0xd0, 0x20, 0xf3, 0x06, + 0x10, 0x63, 0xea, 0x87, 0x10, 0x64, 0xea, 0x87, + 0xe2, 0x95, 0x00, 0xef, 0xd1, 0x6c, 0x71, 0x45, + 0xc0, 0x05, 0x30, 0x01, 0xf6, 0x95, 0xdb, 0x82, + 0xd1, 0x01, 0x10, 0x63, 0xea, 0x95, 0xd1, 0x02, + 0x11, 0x62, 0xea, 0x95, 0xd1, 0x03, 0xd1, 0x8c, + 0x61, 0x06, 0xdb, 0x40, 0x00, 0xe0, 0xd0, 0x00, + 0x71, 0x00, 0xc0, 0x84, 0x10, 0x9c, 0xb0, 0x96, + 0xfa, 0xa0, 0xb1, 0x38, 0xb0, 0x96, 0xfa, 0xa3, + 0xb1, 0x30, 0x00, 0x29, 0xd1, 0x84, 0x00, 0x22, + 0xd0, 0x74, 0x70, 0x86, 0x70, 0xc1, 0x61, 0x06, + 0x30, 0xc2, 0xea, 0xae, 0x60, 0x81, 0xdb, 0x41, + 0xb0, 0x3c, 0xb1, 0xbc, 0xb0, 0x7c, 0x71, 0x00, + 0x70, 0x86, 0x70, 0xc1, 0x61, 0x06, 0x30, 0xc2, + 0xea, 0xb9, 0x60, 0x81, 0xdb, 0x41, 0x00, 0xee, + 0xd1, 0xb4, 0x70, 0x06, 0xb1, 0xbc, 0x70, 0x46, + 0x30, 0x40, 0xea, 0xc2, 0x60, 0x06, 0xdb, 0x41, + 0x00, 0x24, 0xd0, 0x60, 0x30, 0x81, 0xea, 0xc7, + 0x30, 0x81, 0x50, 0x02, 0xea, 0xca, 0xd0, 0x01, + 0x00, 0x22, 0xd1, 0xbc, 0x70, 0x86, 0x30, 0x80, + 0xea, 0xd2, 0x60, 0x06, 0xd0, 0x10, 0xf3, 0x06, + 0x00, 0x22, 0xd1, 0xa4, 0x71, 0x06, 0xd0, 0x01, + 0x41, 0x00, 0x5b, 0x44, 0x5b, 0x6e, 0x6b, 0x46, + 0x00, 0x28, 0xd0, 0x70, 0x70, 0x41, 0x10, 0x62, + 0xfa, 0xe6, 0xd1, 0x84, 0x70, 0x06, 0x10, 0x20, + 0xfa, 0xdf, 0x00, 0x22, 0xd0, 0x00, 0xf3, 0x06, + 0x02, 0x7d, 0xde, 0x68, 0xe0, 0x46, 0x00, 0xed, + 0xd1, 0x88, 0x71, 0x06, 0x01, 0x1f, 0xfa, 0xfd, + 0xd0, 0x41, 0x41, 0x01, 0xd0, 0x62, 0x00, 0x65, + 0xd0, 0x30, 0x70, 0x00, 0x10, 0x21, 0xea, 0xfa, + 0xee, 0xf9, 0x1a, 0xe1, 0xfa, 0xfa, 0xd0, 0x52, + 0x51, 0x01, 0x61, 0x06, 0xe3, 0x0c, 0x18, 0xe0, + 0xea, 0x70, 0xc7, 0x60, 0xc7, 0xe1, 0x02, 0x50, + 0xea, 0x70, 0xc7, 0x61, 0xc7, 0xe0, 0xe2, 0x70, + 0x00, 0x28, 0xdc, 0xa4, 0x7c, 0x72, 0x5c, 0x40, + 0x6c, 0x72, 0x0f, 0xc5, 0x18, 0xe0, 0xeb, 0x82, + 0xd9, 0x0d, 0x00, 0xee, 0xd1, 0xa4, 0x70, 0x06, + 0x10, 0x21, 0xfb, 0x7f, 0xd9, 0x0c, 0x90, 0x06, + 0x00, 0x10, 0xeb, 0x7f, 0x00, 0x21, 0xd1, 0x88, + 0x7a, 0x06, 0x1a, 0x20, 0xeb, 0x7f, 0xd9, 0x00, + 0x00, 0xed, 0xd1, 0xbc, 0x79, 0x46, 0x19, 0x60, + 0xeb, 0x7f, 0x39, 0x68, 0xc0, 0xe5, 0xc0, 0x25, + 0x10, 0x13, 0xb0, 0x0f, 0xef, 0x7f, 0xb0, 0x22, + 0xe7, 0x7f, 0x00, 0xe0, 0xd1, 0xa8, 0x71, 0x46, + 0x11, 0x5f, 0x29, 0x45, 0x00, 0x22, 0xd0, 0x18, + 0x00, 0x22, 0xd4, 0x54, 0x00, 0x22, 0xd0, 0x9c, + 0x70, 0x00, 0x74, 0x51, 0x70, 0x42, 0x34, 0x40, + 0xe7, 0x3c, 0xd0, 0x40, 0x00, 0x22, 0xd4, 0x50, + 0x74, 0x51, 0x34, 0x40, 0xef, 0x42, 0x20, 0x45, + 0x60, 0x42, 0x39, 0x41, 0x19, 0x60, 0xf7, 0x5e, + 0x00, 0x65, 0xd1, 0xa8, 0x7a, 0x86, 0x29, 0x6a, + 0x19, 0x59, 0xb9, 0x7e, 0xf7, 0x75, 0x15, 0xa3, + 0xf7, 0x57, 0x00, 0xed, 0xd1, 0xac, 0x70, 0x06, + 0x00, 0xed, 0xd1, 0xb0, 0x70, 0x46, 0x30, 0x01, + 0xfb, 0x7f, 0x00, 0x65, 0xd1, 0x84, 0x70, 0x46, + 0xb0, 0x7f, 0x60, 0x46, 0xd5, 0x84, 0xe3, 0x7f, + 0x11, 0x41, 0xd0, 0x4a, 0x00, 0xed, 0xd1, 0xa0, + 0x74, 0x46, 0xd0, 0x00, 0x60, 0x06, 0x30, 0xc5, + 0x39, 0x45, 0xe7, 0x6e, 0x14, 0x60, 0xeb, 0x6b, + 0xf3, 0x85, 0xb0, 0x41, 0xef, 0x65, 0xe3, 0x71, + 0x00, 0x66, 0xd1, 0xa0, 0x60, 0xc6, 0x15, 0xa3, + 0xeb, 0x7f, 0xf3, 0x85, 0xe3, 0x7f, 0xd9, 0x01, + 0x00, 0x66, 0xd1, 0xa0, 0x70, 0x06, 0x30, 0x03, + 0xe7, 0x7e, 0x10, 0x1d, 0x10, 0x3b, 0xe7, 0x7f, + 0x60, 0xc6, 0x00, 0x66, 0xd1, 0xa4, 0x69, 0x06, + 0x15, 0xa4, 0xea, 0x23, 0xe2, 0x3b, 0x00, 0x65, + 0xdd, 0x08, 0x7c, 0xf4, 0xbc, 0xff, 0x6c, 0xf4, + 0x00, 0xef, 0xdd, 0x10, 0x7c, 0xf4, 0xbc, 0xfe, + 0x6c, 0xf4, 0xc0, 0x3f, 0xf1, 0x18, 0xf1, 0x16, + 0xf1, 0x18, 0x00, 0x05, 0x08, 0x20, 0xd0, 0x40, + 0x5f, 0x01, 0x15, 0x63, 0xe9, 0x77, 0x05, 0x5e, + 0xeb, 0x08, 0x00, 0x22, 0xd1, 0xa0, 0x6b, 0x06, + 0x00, 0x22, 0xd1, 0xa8, 0x6b, 0xc6, 0x00, 0x22, + 0xd1, 0xac, 0x6a, 0xc6, 0x00, 0xee, 0xd0, 0x0c, + 0x00, 0xe6, 0xd1, 0x9c, 0x70, 0x40, 0x30, 0x5f, + 0xe9, 0x8d, 0xb0, 0x3c, 0xb1, 0xb4, 0x70, 0x40, + 0x30, 0x5f, 0xe9, 0x8d, 0xb1, 0xb4, 0x00, 0xe6, + 0xd0, 0x10, 0xd0, 0x83, 0x70, 0x40, 0x60, 0x46, + 0xb0, 0x3c, 0xb1, 0xbc, 0xb0, 0x81, 0xed, 0x90, + 0x00, 0xee, 0xd0, 0x0c, 0x00, 0xe6, 0xd1, 0x9c, + 0x70, 0x40, 0x30, 0x4c, 0xe9, 0xa3, 0xb0, 0x3c, + 0xb1, 0xb4, 0x70, 0x40, 0x30, 0x4c, 0xe9, 0xa3, + 0xb1, 0xb4, 0x00, 0xe6, 0xd0, 0x00, 0x61, 0x80, + 0x00, 0x21, 0xd1, 0xb4, 0x70, 0x06, 0x10, 0x20, + 0xe9, 0xae, 0xd0, 0x00, 0x60, 0x06, 0xf1, 0x18, + 0x00, 0x21, 0xd1, 0x8c, 0x70, 0x46, 0x65, 0x86, + 0xde, 0xc0, 0x00, 0xee, 0xd0, 0x20, 0x70, 0x00, + 0x10, 0x22, 0xfd, 0xb9, 0xde, 0xc2, 0x00, 0x21, + 0xd0, 0x04, 0x70, 0x00, 0x10, 0x21, 0xe9, 0xc0, + 0x15, 0xa3, 0xe9, 0xdc, 0xd0, 0x02, 0x4c, 0x00, + 0x10, 0x63, 0xe9, 0xc5, 0xcc, 0x3b, 0xd0, 0x04, + 0x63, 0x00, 0xd0, 0x00, 0x70, 0x00, 0x30, 0x1f, + 0xfb, 0x08, 0xd0, 0x18, 0x70, 0x00, 0x10, 0x20, + 0xed, 0xc7, 0xd0, 0x04, 0x70, 0x80, 0x10, 0xa0, + 0xeb, 0x08, 0xf1, 0x16, 0x00, 0x21, 0xd0, 0x9a, + 0xc0, 0x39, 0x30, 0x1f, 0x10, 0x18, 0x30, 0x02, + 0xfd, 0xcf, 0xe3, 0x08, 0x00, 0xe0, 0xd9, 0x04, + 0x79, 0x24, 0xb9, 0x38, 0x19, 0x1c, 0xdc, 0x88, + 0x4c, 0xac, 0xd0, 0x02, 0x40, 0x2c, 0x10, 0x02, + 0x0c, 0x80, 0x10, 0x63, 0xea, 0x70, 0x15, 0x63, + 0xf9, 0xec, 0xf1, 0x18, 0x00, 0xef, 0xdc, 0x00, + 0x7c, 0x30, 0x00, 0x24, 0xd0, 0x30, 0x70, 0x00, + 0x10, 0x21, 0xf9, 0xf6, 0xbc, 0x3b, 0xe1, 0xfd, + 0x10, 0x22, 0xf9, 0xfa, 0xbc, 0x38, 0xe1, 0xfd, + 0x10, 0x23, 0xf9, 0xfd, 0xbc, 0x3c, 0x1e, 0xe0, + 0xea, 0x03, 0x15, 0x63, 0xfa, 0x02, 0xbe, 0xfc, + 0xdc, 0x12, 0x0e, 0xde, 0xfa, 0x09, 0xc0, 0x24, + 0x30, 0x30, 0xf6, 0x09, 0x2c, 0x00, 0xd0, 0x2c, + 0x6c, 0x00, 0x1e, 0xe0, 0xea, 0x0f, 0xcc, 0x24, + 0x1c, 0x1f, 0xd9, 0x40, 0x06, 0x50, 0xea, 0x22, + 0xc0, 0x24, 0xb0, 0x12, 0xfe, 0x22, 0xd9, 0x74, + 0x79, 0x65, 0x19, 0x5f, 0x30, 0x25, 0xee, 0x1b, + 0x29, 0x40, 0x19, 0x5f, 0x19, 0x41, 0xc0, 0x25, + 0x20, 0x30, 0x30, 0x24, 0xe6, 0x22, 0x3c, 0x00, + 0xd0, 0x38, 0x69, 0x40, 0x1c, 0x05, 0xbc, 0x38, + 0x3c, 0x32, 0x5c, 0x3b, 0xbc, 0x3f, 0xd8, 0xec, + 0x78, 0xe3, 0xc0, 0xa3, 0x10, 0xb2, 0xf6, 0x2f, + 0xd0, 0x92, 0x02, 0xe4, 0xd8, 0x00, 0xd0, 0xc0, + 0x20, 0xe0, 0xb0, 0x81, 0xee, 0x32, 0xd0, 0x30, + 0x60, 0xc0, 0x00, 0xac, 0xd0, 0x20, 0xc0, 0xc0, + 0xd8, 0x40, 0xc1, 0x23, 0xd4, 0x64, 0x34, 0x63, + 0xdc, 0x40, 0x0c, 0x1f, 0xfa, 0x5b, 0xc0, 0x65, + 0xb0, 0x41, 0xe6, 0x47, 0x68, 0x40, 0xb0, 0x3c, + 0xe2, 0x42, 0xc0, 0xc0, 0x34, 0x65, 0xdc, 0x48, + 0x4c, 0x70, 0x1c, 0x5f, 0x20, 0xf1, 0x15, 0x63, + 0xfa, 0x5c, 0xf2, 0x54, 0xc1, 0x11, 0xc0, 0x83, + 0xf2, 0xa5, 0xe2, 0x6f, 0xb1, 0x01, 0xe6, 0x5a, + 0x68, 0x40, 0x28, 0x60, 0xb0, 0x3c, 0xe2, 0x54, + 0x0f, 0xc5, 0xd9, 0x40, 0xb1, 0x12, 0x11, 0x01, + 0x21, 0x25, 0xf2, 0x54, 0xc1, 0x11, 0xb1, 0x01, + 0xe6, 0x6f, 0x20, 0x31, 0x68, 0x40, 0x30, 0x31, + 0xb0, 0x3c, 0x28, 0x60, 0x70, 0x43, 0x30, 0x31, + 0x60, 0x40, 0x20, 0x31, 0xb0, 0x3c, 0xb0, 0xf8, + 0xe2, 0x61, 0xe2, 0xf7, 0xd8, 0xec, 0x78, 0xe3, + 0x00, 0xa8, 0xd0, 0x80, 0x00, 0xa8, 0xd1, 0x44, + 0x00, 0xac, 0xd0, 0x20, 0xc0, 0xc0, 0x0c, 0x1f, + 0xfa, 0xb3, 0xd9, 0x78, 0x79, 0x65, 0x39, 0x25, + 0x19, 0x5f, 0xc9, 0xa5, 0x19, 0x83, 0x20, 0x26, + 0x20, 0xe6, 0x20, 0xa6, 0x21, 0x66, 0xc1, 0x23, + 0xc0, 0x64, 0x10, 0x5f, 0x10, 0x9d, 0x20, 0x81, + 0x31, 0x01, 0x30, 0x44, 0xf6, 0x8e, 0x21, 0x01, + 0x30, 0x84, 0x10, 0x83, 0xc4, 0x64, 0x34, 0x63, + 0xdc, 0x48, 0x4c, 0x70, 0x1c, 0x5f, 0x15, 0x63, + 0xfa, 0xc3, 0x20, 0xb1, 0xf2, 0xa5, 0xc1, 0x24, + 0x11, 0x1f, 0xc0, 0x85, 0x30, 0xb1, 0xf2, 0xa5, + 0xc1, 0x11, 0xc0, 0x83, 0x0c, 0x9d, 0xfa, 0xa3, + 0xb0, 0xbc, 0xf2, 0xa5, 0xe2, 0xec, 0xb1, 0x01, + 0xe6, 0x5a, 0x70, 0x42, 0xb0, 0xb8, 0x60, 0x40, + 0xb0, 0x3c, 0xe2, 0xa5, 0xb1, 0x01, 0xe6, 0x5a, + 0x70, 0x42, 0xb0, 0xb8, 0x60, 0x40, 0xb0, 0x38, + 0xe2, 0xac, 0x00, 0xac, 0xd0, 0x24, 0xc1, 0x23, + 0xb1, 0x12, 0xf2, 0xac, 0xd1, 0x24, 0x31, 0x23, + 0x00, 0xa8, 0xd0, 0x84, 0xf2, 0xac, 0xd1, 0x12, + 0x00, 0xa8, 0xd0, 0x84, 0xc0, 0x03, 0xf2, 0xac, + 0xe2, 0xec, 0xd8, 0x82, 0x48, 0x95, 0x18, 0x81, + 0xb1, 0x01, 0xe6, 0xd9, 0x20, 0xb1, 0x70, 0x42, + 0x30, 0xb1, 0x20, 0x22, 0x60, 0x40, 0x30, 0x22, + 0xb0, 0xbc, 0xb0, 0x3c, 0x30, 0xb1, 0x70, 0x42, + 0x20, 0xb1, 0x30, 0x22, 0x60, 0x40, 0x20, 0x22, + 0xb0, 0xbc, 0xb0, 0x3c, 0xe2, 0xc6, 0xc1, 0x11, + 0xc0, 0x85, 0x30, 0xb1, 0x20, 0xe2, 0xb1, 0x01, + 0xe6, 0xec, 0x70, 0x42, 0xb0, 0xb8, 0x20, 0x22, + 0x60, 0x40, 0x30, 0x22, 0xb0, 0x3c, 0x70, 0x43, + 0xb0, 0xf8, 0x30, 0x22, 0x60, 0x40, 0x20, 0x22, + 0xb0, 0x3c, 0xe2, 0xdd, 0xd0, 0x08, 0x5c, 0x00, + 0x3c, 0x32, 0xd0, 0x04, 0x40, 0x30, 0x3c, 0x00, + 0x15, 0x63, 0xfa, 0xf7, 0x1e, 0xe0, 0xea, 0xf7, + 0xbc, 0x3c, 0x00, 0xac, 0xd0, 0xa0, 0x00, 0xa8, + 0xd0, 0x00, 0x00, 0x20, 0xd1, 0x24, 0x70, 0x42, + 0xb0, 0xbc, 0x60, 0x40, 0xb0, 0x3c, 0xb1, 0x01, + 0xee, 0xfd, 0xd0, 0x30, 0x30, 0x30, 0xef, 0x03, + 0xd0, 0x04, 0x63, 0x00, 0x08, 0x20, 0xd0, 0x40, + 0x3f, 0x01, 0x02, 0xba, 0xde, 0x3c, 0xe0, 0x46, + 0x50, 0x00, 0x50, 0x00, 0x01, 0x46, 0xd0, 0x08, + 0x94, 0x89, 0xd0, 0x8c, 0x44, 0x82, 0x14, 0x9e, + 0x30, 0x12, 0xd0, 0x88, 0x10, 0x80, 0x00, 0xe8, + 0xd1, 0x80, 0x70, 0xc6, 0x00, 0x06, 0xa0, 0xbd, + 0xa0, 0xfc, 0x80, 0x3f, 0xb1, 0xbe, 0x60, 0xc6, + 0x00, 0x06, 0x80, 0xa9, 0x80, 0x3f, 0x80, 0x2a, + 0x80, 0x3f, 0x00, 0x21, 0xd0, 0x3c, 0x00, 0x0a, + 0xb1, 0x82, 0xd0, 0x6b, 0x70, 0x46, 0x00, 0x06, + 0x80, 0x07, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, + 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, + 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, + 0xd0, 0x00, 0xa0, 0x29, 0x80, 0x2b, 0x0c, 0x20, + 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0x90, 0x09, + 0xd0, 0x41, 0x40, 0x01, 0xd0, 0x44, 0x40, 0x70, + 0x20, 0x01, 0xa0, 0x27, 0x80, 0x3f, 0x00, 0xc6, + 0x15, 0x63, 0xe9, 0xae, 0x05, 0x5e, 0xe9, 0xbe, + 0x00, 0xe0, 0xd0, 0x40, 0x70, 0x81, 0x10, 0x9c, + 0xb0, 0x96, 0xf9, 0xb7, 0x00, 0x21, 0xd0, 0x40, + 0xe1, 0xbb, 0xb0, 0x96, 0xf9, 0xbe, 0x00, 0x22, + 0xd0, 0x40, 0x27, 0xc1, 0x27, 0x41, 0x27, 0x81, + 0x90, 0x83, 0x00, 0x64, 0xd0, 0x10, 0x60, 0x80, + 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0x00, 0x64, + 0xd0, 0x14, 0x67, 0x40, 0x80, 0x34, 0x80, 0x3f, + 0x00, 0xc6, 0x90, 0xae, 0x00, 0x64, 0xd0, 0x18, + 0x60, 0x80, 0x90, 0xa6, 0x00, 0x64, 0xd0, 0x1c, + 0x60, 0x80, 0x15, 0x63, 0xe9, 0xe3, 0x0c, 0x1f, + 0xe9, 0xe3, 0x05, 0x50, 0xf9, 0xe3, 0x15, 0xa3, + 0xf9, 0xe3, 0x90, 0x4d, 0x10, 0x60, 0xe5, 0xdb, + 0x00, 0x06, 0x05, 0x0d, 0x01, 0x7a, 0xde, 0x1a, + 0xe0, 0x46, 0x15, 0xa3, 0xf9, 0xfb, 0x00, 0x21, + 0xd0, 0x04, 0x70, 0x00, 0x10, 0x21, 0xe9, 0xfb, + 0xd0, 0x38, 0x70, 0x00, 0x15, 0x63, 0xe9, 0xef, + 0x10, 0x1f, 0x15, 0x21, 0xe5, 0xe0, 0xd0, 0x64, + 0x30, 0x54, 0xe5, 0xe0, 0xc0, 0x40, 0xb0, 0x7f, + 0x30, 0x54, 0xe9, 0xfb, 0x0c, 0x09, 0x05, 0x0d, + 0xe1, 0xef, 0xc0, 0x5f, 0x10, 0x58, 0x10, 0x48, + 0x00, 0xee, 0xd0, 0x8c, 0xd0, 0xc3, 0x70, 0x02, + 0x30, 0x01, 0xea, 0x10, 0xb0, 0xbc, 0xb0, 0xc1, + 0xee, 0x01, 0x00, 0x26, 0xd0, 0x20, 0x70, 0x40, + 0xb0, 0x7f, 0x60, 0x40, 0x15, 0xa3, 0xea, 0x0f, + 0xb0, 0x88, 0x77, 0xc2, 0x80, 0x07, 0x09, 0x49, + 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, + 0x00, 0x4d, 0xa0, 0x6c, 0xd3, 0x80, 0xd0, 0xa1, + 0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, + 0xfa, 0x1a, 0x0c, 0x49, 0x00, 0x8d, 0xc0, 0x42, + 0x10, 0x60, 0xea, 0x2a, 0xb0, 0x5e, 0xb0, 0x43, + 0xfe, 0x34, 0xd0, 0x61, 0x23, 0x81, 0xe2, 0x1f, + 0x0c, 0x09, 0x05, 0x0d, 0x15, 0x20, 0xfe, 0x31, + 0xd0, 0x65, 0x30, 0x54, 0xee, 0x10, 0x03, 0xb4, + 0xd6, 0x29, 0xe0, 0x46, 0xc6, 0xd4, 0xb6, 0xc1, + 0xe6, 0x31, 0xd0, 0x64, 0x30, 0x5b, 0xfe, 0x31, + 0xd7, 0x00, 0xb7, 0x01, 0xd3, 0x81, 0x00, 0x27, + 0xd0, 0x10, 0xd0, 0x81, 0x60, 0x80, 0x15, 0x63, + 0xfa, 0x54, 0x00, 0x22, 0xdc, 0xd8, 0x03, 0xf8, + 0xd0, 0x10, 0xf0, 0x4a, 0x15, 0xa3, 0xfa, 0x51, + 0x02, 0xf7, 0xdc, 0x26, 0x0c, 0x10, 0xf8, 0x46, + 0x02, 0xfc, 0xd8, 0x22, 0xe0, 0x46, 0x02, 0xf2, + 0xd6, 0x2b, 0xe0, 0x46, 0x00, 0x22, 0xdc, 0xd8, + 0x03, 0xfa, 0xd0, 0x10, 0xf0, 0x4a, 0x03, 0x35, + 0xda, 0x20, 0x15, 0xa3, 0xe8, 0x46, 0x03, 0x30, + 0xdc, 0x27, 0xe0, 0x46, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xe0, + 0xe1, 0xec, 0xe2, 0x12, 0xe2, 0x14, 0xe1, 0xc7, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50, + 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, + 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x64, + 0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31, + 0x10, 0x12, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10, + 0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44, + 0xe1, 0x79, 0x03, 0xde, 0xf9, 0xba, 0x03, 0xdf, + 0xe9, 0x99, 0xd3, 0x40, 0xca, 0x50, 0xd1, 0x42, + 0xe2, 0xea, 0xc0, 0x50, 0x10, 0x54, 0xc0, 0x90, + 0x10, 0x8c, 0x10, 0x92, 0x10, 0xe0, 0xe5, 0xa8, + 0xc0, 0x01, 0x10, 0x01, 0x20, 0x40, 0xc0, 0x02, + 0x10, 0x01, 0x20, 0x80, 0x10, 0x60, 0xfd, 0xab, + 0xb0, 0x7f, 0x10, 0xa0, 0xfd, 0xae, 0xb0, 0xbf, + 0x10, 0x5f, 0x10, 0x9f, 0x00, 0xef, 0xd0, 0x3e, + 0x20, 0x52, 0x20, 0x83, 0x20, 0x93, 0x10, 0x4c, + 0x10, 0x82, 0x40, 0x80, 0x50, 0x42, 0x0f, 0xc5, + 0xcb, 0xaa, 0xcb, 0xeb, 0xca, 0x50, 0xd0, 0xc0, + 0xb0, 0xc1, 0xf1, 0x9b, 0xcb, 0x01, 0xd0, 0xc1, + 0xf1, 0x9b, 0xcb, 0x41, 0xba, 0x7f, 0xbb, 0x3f, + 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, + 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, + 0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0xd5, + 0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, + 0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, + 0x01, 0xb5, 0xd4, 0x00, 0x2c, 0x80, 0xde, 0x84, + 0xde, 0xc4, 0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, + 0x13, 0xa0, 0xed, 0xe5, 0xf2, 0x32, 0xb3, 0x81, + 0xe9, 0xec, 0x80, 0x07, 0xd4, 0x00, 0xc4, 0x50, + 0xd3, 0x08, 0xe2, 0x95, 0xd0, 0x71, 0x20, 0x56, + 0x00, 0x48, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, + 0xe9, 0xfa, 0x06, 0x5e, 0xfa, 0x03, 0x08, 0x89, + 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xfa, 0xd3, 0xc4, + 0x06, 0x5e, 0xfa, 0x03, 0xd0, 0x43, 0x40, 0x4c, + 0xea, 0x03, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87, + 0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, + 0x03, 0x1c, 0xea, 0x0a, 0x09, 0x49, 0x00, 0x0d, + 0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19, + 0xea, 0x10, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b, + 0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50, + 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xd3, + 0xe1, 0xdc, 0xe2, 0x00, 0xe2, 0x02, 0xe1, 0xac, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x91, 0x06, 0x50, + 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, + 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x64, + 0x30, 0x5b, 0xfc, 0x11, 0xbc, 0x10, 0xd0, 0x10, + 0x0c, 0x1e, 0xf9, 0x8e, 0xbc, 0x10, 0xd0, 0x30, + 0xc0, 0x40, 0x30, 0x70, 0xed, 0x8e, 0x03, 0x10, + 0xe9, 0x97, 0x0f, 0x19, 0xf9, 0x93, 0xd1, 0x44, + 0xe1, 0x79, 0x03, 0xdf, 0xe9, 0xa1, 0xd3, 0x40, + 0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa8, + 0xca, 0x12, 0xca, 0x52, 0xe1, 0xa5, 0x03, 0x1d, + 0xf9, 0xa8, 0xca, 0x12, 0xca, 0x53, 0xca, 0xae, + 0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea, + 0xb1, 0x7e, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, + 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xd2, + 0x00, 0xa8, 0xd0, 0x00, 0xcc, 0x5b, 0x1c, 0x5f, + 0x1c, 0x43, 0x20, 0x31, 0x7c, 0x40, 0xb0, 0x3c, + 0x7e, 0x80, 0xcc, 0xb1, 0xce, 0xfa, 0x1c, 0x9f, + 0x1e, 0xdf, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, + 0xe9, 0xc4, 0x3c, 0x80, 0x0e, 0xd9, 0xe9, 0xc7, + 0x3e, 0xc0, 0x3e, 0xf2, 0x3e, 0xb1, 0xd0, 0x01, + 0x40, 0x1b, 0x10, 0x05, 0x20, 0x1f, 0x2c, 0x40, + 0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, + 0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0, + 0xed, 0xd8, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xdc, + 0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c, + 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xe8, 0x06, 0x5e, + 0xf9, 0xf1, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, + 0xf9, 0xe8, 0xd3, 0xc4, 0x06, 0x5e, 0xf9, 0xf1, + 0xd0, 0x43, 0x40, 0x4c, 0xe9, 0xf1, 0x08, 0x49, + 0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46, + 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xf8, + 0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02, + 0xb0, 0x20, 0x03, 0x19, 0xe9, 0xfe, 0xb0, 0x20, + 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80, + 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, + 0xe2, 0x8d, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xc1, + 0xe1, 0xca, 0xe1, 0xee, 0xe1, 0xf0, 0xe1, 0xa8, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50, + 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, + 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x64, + 0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31, + 0x10, 0x12, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10, + 0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44, + 0xe1, 0x79, 0x03, 0xdf, 0xe9, 0x9d, 0xd3, 0x40, + 0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa4, + 0xca, 0x12, 0xca, 0x52, 0xe1, 0xa1, 0x03, 0x1d, + 0xf9, 0xa4, 0xca, 0x12, 0xca, 0x53, 0xca, 0xae, + 0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea, + 0xb1, 0x7e, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, + 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, + 0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0, + 0xe9, 0xb6, 0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80, + 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40, + 0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, + 0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, 0xd3, 0xc2, + 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xc6, 0xf2, 0x32, + 0xb3, 0x81, 0xe9, 0xca, 0x80, 0x07, 0xe2, 0x95, + 0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, + 0xe9, 0xd6, 0x06, 0x5e, 0xf9, 0xdf, 0x08, 0x89, + 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xd6, 0xd3, 0xc4, + 0x06, 0x5e, 0xf9, 0xdf, 0xd0, 0x43, 0x40, 0x4c, + 0xe9, 0xdf, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87, + 0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, + 0x03, 0x1c, 0xe9, 0xe6, 0x09, 0x49, 0x00, 0x0d, + 0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19, + 0xe9, 0xec, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b, + 0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50, + 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xdb, + 0xe1, 0xe9, 0xe2, 0x00, 0xe2, 0x02, 0xe1, 0xc3, + 0xe1, 0x65, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50, + 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, + 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x52, + 0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31, + 0x10, 0x11, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10, + 0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44, + 0xe1, 0x79, 0x03, 0xd0, 0xf9, 0x98, 0xca, 0x50, + 0x03, 0xde, 0xf9, 0x9a, 0xd1, 0x42, 0xe2, 0xea, + 0xcb, 0xaa, 0xcb, 0xeb, 0xc0, 0x50, 0x10, 0x54, + 0xc0, 0x90, 0x10, 0x8c, 0x10, 0x92, 0xd0, 0xc1, + 0x05, 0x50, 0xe9, 0xa5, 0xb0, 0xc2, 0x10, 0x60, + 0xfd, 0xa8, 0xb0, 0x7f, 0x10, 0xa0, 0xfd, 0xab, + 0xb0, 0xbf, 0x10, 0x5f, 0x10, 0x9f, 0x00, 0xef, + 0xd0, 0x3e, 0x20, 0x52, 0x20, 0x83, 0x20, 0x93, + 0x10, 0x4c, 0x10, 0x82, 0x40, 0x80, 0x50, 0x42, + 0xd0, 0x81, 0x14, 0x1f, 0x14, 0x01, 0x05, 0x50, + 0xe9, 0xbd, 0x50, 0x42, 0xe1, 0xbe, 0x54, 0x02, + 0xca, 0x10, 0xca, 0x50, 0xcb, 0x01, 0xcb, 0x41, + 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, + 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x49, + 0xcc, 0xb1, 0x1c, 0x9f, 0xc0, 0x1c, 0x10, 0x08, + 0x20, 0x1f, 0x05, 0x50, 0xf9, 0xd2, 0xb0, 0x3c, + 0x2c, 0x40, 0x2c, 0x80, 0x01, 0xb5, 0xd4, 0x00, + 0x2c, 0x80, 0x02, 0xe4, 0xde, 0x80, 0xde, 0xc1, + 0xe3, 0x1e, 0xd3, 0xc0, 0xf2, 0xd3, 0x13, 0xa0, + 0xed, 0xe0, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xe9, + 0x80, 0x07, 0xd4, 0x02, 0x44, 0x15, 0x14, 0x1f, + 0xc4, 0x50, 0xd3, 0x08, 0xe2, 0x95, 0xd0, 0x71, + 0x20, 0x56, 0x00, 0x48, 0xd1, 0x8c, 0x03, 0x0d, + 0x41, 0x8c, 0xe9, 0xf7, 0x08, 0x89, 0x03, 0xcd, + 0x13, 0xe3, 0xf9, 0xf6, 0xd3, 0xc4, 0xe1, 0xf7, + 0xb3, 0xc1, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, + 0x03, 0x1c, 0xe9, 0xfe, 0x09, 0x49, 0x00, 0x0d, + 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x7f, + 0xd4, 0x02, 0x44, 0x15, 0x14, 0x1f, 0xc4, 0x50, + 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xc9, + 0xe1, 0xd2, 0xe1, 0xe7, 0xe1, 0xe9, 0xe1, 0xab, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x91, 0x06, 0x50, + 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, + 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x52, + 0x30, 0x5b, 0xfc, 0x11, 0xbc, 0x10, 0xd0, 0x10, + 0x0c, 0x1e, 0xf9, 0x8e, 0xbc, 0x10, 0xd0, 0x20, + 0xc0, 0x40, 0x30, 0x70, 0xed, 0x8e, 0x03, 0x10, + 0xe9, 0x97, 0x0f, 0x19, 0xf9, 0x93, 0xd1, 0x44, + 0xe1, 0x79, 0x03, 0xd0, 0xf9, 0xa0, 0xca, 0x50, + 0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa7, 0xca, 0x12, + 0xca, 0x52, 0xe1, 0xa4, 0x03, 0x1d, 0xf9, 0xa7, + 0xca, 0x12, 0xca, 0x53, 0xca, 0xae, 0xca, 0xef, + 0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, + 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, + 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xc8, 0x00, 0x2a, + 0xd0, 0x00, 0x20, 0x1b, 0x20, 0x1b, 0x05, 0x50, + 0xf9, 0xb8, 0xb0, 0x3f, 0x10, 0x02, 0x7c, 0x40, + 0xcc, 0xb1, 0x1c, 0x9f, 0x01, 0x69, 0xd0, 0x3c, + 0x0c, 0x99, 0xe9, 0xc1, 0x3c, 0x80, 0xde, 0xa0, + 0x2c, 0x5f, 0x2c, 0x9f, 0xd0, 0x30, 0x70, 0x00, + 0x2c, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 0xd3, 0xc0, + 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xce, 0xf2, 0x32, + 0xb3, 0x81, 0xe9, 0xd2, 0x80, 0x07, 0xe2, 0x95, + 0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, + 0xe9, 0xde, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, + 0xf9, 0xdd, 0xd3, 0xc4, 0xe1, 0xde, 0xb3, 0xc1, + 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, + 0xe9, 0xe5, 0x09, 0x49, 0x00, 0x0d, 0xa0, 0x2c, + 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x7f, 0xd4, 0x00, + 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, + 0x50, 0x00, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xa3, + 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8a, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x87, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x64, 0x30, 0x5b, 0xfd, 0xb4, + 0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20, + 0xe9, 0x82, 0xd1, 0x42, 0xd3, 0x40, 0xe2, 0xea, + 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, + 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1, + 0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0x98, 0x01, 0x69, + 0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08, + 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0x01, 0xb5, + 0xd4, 0x00, 0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4, + 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, + 0x30, 0x5a, 0xe5, 0xc8, 0x00, 0x26, 0xd0, 0x00, + 0x70, 0x00, 0x10, 0x20, 0xe9, 0xbf, 0x00, 0xe0, + 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5c, 0x30, 0x5b, + 0xb0, 0x41, 0xed, 0xc8, 0x0f, 0x17, 0xf9, 0xb4, + 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xb8, + 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb4, 0xd6, 0x29, + 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, + 0xe5, 0xc8, 0x0f, 0x17, 0xf9, 0xc3, 0x02, 0xf2, + 0xd6, 0x2b, 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, + 0xe2, 0x95, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xb5, + 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8e, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8b, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x64, 0x30, 0x5b, 0xfd, 0xc6, + 0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x88, + 0xbc, 0x10, 0xd0, 0x30, 0xc0, 0x40, 0x30, 0x70, + 0xed, 0x88, 0xd1, 0x42, 0xd3, 0x40, 0xe2, 0xea, + 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, + 0x17, 0x20, 0xf9, 0xb4, 0x00, 0xa8, 0xd0, 0x00, + 0xcc, 0x5b, 0x1c, 0x5f, 0x1c, 0x43, 0x20, 0x31, + 0x7c, 0x40, 0xb0, 0x3c, 0x7e, 0x80, 0xcc, 0xb1, + 0xce, 0xfa, 0x1c, 0x9f, 0x1e, 0xdf, 0x01, 0x69, + 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xa6, 0x3c, 0x80, + 0x0e, 0xd9, 0xe9, 0xa9, 0x3e, 0xc0, 0x3e, 0xf2, + 0x3e, 0xb1, 0xd0, 0x01, 0x40, 0x1b, 0x10, 0x05, + 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30, + 0x70, 0x00, 0x2c, 0x80, 0xe3, 0x1e, 0xf2, 0xd3, + 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xda, + 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, + 0xe9, 0xd1, 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, + 0x10, 0x5c, 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xda, + 0x0f, 0x17, 0xf9, 0xc6, 0x0f, 0x49, 0xf2, 0xd3, + 0x0f, 0x19, 0xf9, 0xca, 0xdf, 0x00, 0x00, 0x06, + 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, 0xc0, 0x5b, + 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xda, 0x0f, 0x17, + 0xf9, 0xd5, 0x02, 0xf7, 0xdc, 0x26, 0xe0, 0x46, + 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xa2, + 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8a, + 0xe1, 0x65, 0x30, 0x5a, 0xe5, 0x87, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x52, 0x30, 0x5b, 0xfd, 0xb3, + 0xc0, 0x39, 0x30, 0x31, 0x10, 0x11, 0x10, 0x20, + 0xe9, 0x82, 0xd1, 0x42, 0xd3, 0x41, 0xe2, 0xea, + 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, + 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x49, 0xcc, 0xb1, + 0x1c, 0x9f, 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, + 0x05, 0x50, 0xf9, 0x99, 0xb0, 0x3c, 0x2c, 0x40, + 0x2c, 0x80, 0x01, 0xb5, 0xd4, 0x00, 0x2c, 0x80, + 0x02, 0xe4, 0xde, 0x80, 0xde, 0xc1, 0xe3, 0x1e, + 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, + 0xe5, 0xc7, 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, + 0x10, 0x20, 0xe9, 0xbe, 0x00, 0xe0, 0xd0, 0x44, + 0x70, 0x41, 0x10, 0x5b, 0x30, 0x5b, 0xb0, 0x41, + 0xed, 0xc7, 0x0f, 0x17, 0xf9, 0xb3, 0x0f, 0x49, + 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xb7, 0xdf, 0x00, + 0x00, 0x06, 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, + 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xc7, + 0x0f, 0x17, 0xf9, 0xc2, 0x03, 0x30, 0xdc, 0x27, + 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, + 0x50, 0x00, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xac, + 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8e, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8b, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x52, 0x30, 0x5b, 0xfd, 0xbd, + 0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x88, + 0xbc, 0x10, 0xd0, 0x20, 0xc0, 0x40, 0x30, 0x70, + 0xed, 0x88, 0xd1, 0x42, 0xd3, 0x41, 0xe2, 0xea, + 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, + 0x17, 0x20, 0xf9, 0xab, 0x00, 0x2a, 0xd0, 0x00, + 0x20, 0x1b, 0x20, 0x1b, 0x05, 0x50, 0xf9, 0x9b, + 0xb0, 0x3f, 0x10, 0x02, 0x7c, 0x40, 0xcc, 0xb1, + 0x1c, 0x9f, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, + 0xe9, 0xa4, 0x3c, 0x80, 0xde, 0xa0, 0x2c, 0x5f, + 0x2c, 0x9f, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, + 0xde, 0xc1, 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, + 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xd1, 0x00, 0x26, + 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 0xe9, 0xc8, + 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5b, + 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xd1, 0x0f, 0x17, + 0xf9, 0xbd, 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, + 0xf9, 0xc1, 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb4, + 0xd6, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, + 0xb0, 0x7e, 0xe5, 0xd1, 0x0f, 0x17, 0xf9, 0xcc, + 0x03, 0x35, 0xda, 0x20, 0xe0, 0x46, 0xd3, 0x08, + 0xd3, 0xc0, 0xe2, 0x95, 0xd0, 0x61, 0x23, 0x81, + 0x0c, 0x49, 0xd0, 0x61, 0x00, 0x8d, 0x10, 0xa0, + 0xea, 0x3b, 0x30, 0x42, 0xe6, 0x30, 0x23, 0x82, + 0x0f, 0xc5, 0x0c, 0x09, 0x05, 0x0d, 0x15, 0x20, + 0xfe, 0x45, 0xd0, 0x65, 0x15, 0x63, 0xea, 0x43, + 0xd0, 0x53, 0x30, 0x54, 0xee, 0x4a, 0x0f, 0x17, + 0xfa, 0x45, 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, + 0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40, + 0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c, + 0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d, + 0x00, 0x50, 0xfa, 0x53, 0xf2, 0x32, 0xd3, 0x80, + 0xe1, 0x76, 0xd1, 0xc2, 0x41, 0xcf, 0x11, 0xdf, + 0xd0, 0x41, 0x01, 0xc1, 0x00, 0xef, 0xd0, 0xbe, + 0x03, 0x10, 0xf9, 0x77, 0x80, 0x07, 0x21, 0x96, + 0x11, 0xa2, 0xe9, 0x78, 0x03, 0x1d, 0xea, 0x73, + 0xc0, 0xd7, 0xc2, 0x90, 0xf2, 0xa4, 0xc4, 0x0a, + 0x03, 0xd0, 0xea, 0x72, 0xc2, 0x91, 0xf2, 0xa4, + 0xc4, 0x4a, 0x03, 0x1e, 0xea, 0x8d, 0xc0, 0xd8, + 0xc2, 0x92, 0xf2, 0xa4, 0xc4, 0x8a, 0x03, 0xd0, + 0xea, 0x7d, 0xc2, 0x93, 0xf2, 0xa4, 0xc4, 0xca, + 0xe2, 0x8d, 0xd3, 0xc0, 0xc0, 0xd7, 0xc2, 0x90, + 0xf2, 0xa4, 0xc4, 0x0a, 0x03, 0xd0, 0xea, 0x88, + 0xc2, 0x91, 0xf2, 0xa4, 0xc4, 0x4a, 0x08, 0x49, + 0x00, 0x4d, 0x10, 0x61, 0xf8, 0x11, 0x03, 0x1f, + 0xea, 0x93, 0x0d, 0xc9, 0x00, 0x4d, 0xd0, 0x1a, + 0xe2, 0x98, 0x03, 0x10, 0xfa, 0x97, 0xd0, 0x1d, + 0xe2, 0x98, 0xd0, 0x18, 0x0f, 0x16, 0xfa, 0x98, + 0xd0, 0x4c, 0x40, 0x4c, 0x10, 0x6c, 0xea, 0xa2, + 0x03, 0xde, 0xfa, 0xa2, 0x0f, 0x12, 0xfa, 0xa0, + 0x00, 0x08, 0xe2, 0xd9, 0xd2, 0x00, 0x13, 0xe1, + 0xee, 0xa9, 0x08, 0x49, 0x02, 0x0d, 0x00, 0xc8, + 0xc2, 0xca, 0x12, 0x94, 0xd0, 0x1f, 0x30, 0x07, + 0x12, 0xc0, 0xc2, 0x43, 0x12, 0x5a, 0x00, 0x0d, + 0x03, 0xde, 0xea, 0xb6, 0x0e, 0xc9, 0x04, 0x8d, + 0x02, 0x48, 0x22, 0x80, 0x12, 0x88, 0xd0, 0x0b, + 0x30, 0x03, 0x12, 0x80, 0xd0, 0x19, 0x20, 0x03, + 0x12, 0x80, 0x00, 0x0d, 0x22, 0xc0, 0x12, 0xc8, + 0xd0, 0x0b, 0x30, 0x09, 0x12, 0xc0, 0x12, 0xd8, + 0xd0, 0x16, 0x20, 0x09, 0x20, 0x07, 0x12, 0xc0, + 0x42, 0xc2, 0x22, 0x8b, 0x22, 0x88, 0x03, 0xde, + 0xea, 0xd2, 0x0e, 0xc9, 0xc4, 0x4a, 0x04, 0xcd, + 0x0f, 0xc5, 0x01, 0x46, 0x90, 0x4d, 0x00, 0xc6, + 0x10, 0x60, 0xe6, 0xd3, 0x0f, 0xc5, 0x01, 0xb5, + 0xd4, 0x00, 0xca, 0x9d, 0xcb, 0x9e, 0xca, 0xea, + 0xcb, 0xee, 0x2a, 0xc0, 0x2b, 0xc0, 0xca, 0x10, + 0xca, 0x51, 0xcb, 0x12, 0xcb, 0x53, 0xd1, 0x40, + 0xd3, 0x41, 0xb7, 0x3f, 0xc0, 0x5c, 0xe1, 0x7b, + 0xd0, 0xc0, 0xc1, 0x28, 0xc2, 0x2a, 0xc2, 0xab, + 0xf1, 0x7a, 0x0f, 0x17, 0xfa, 0xef, 0xcc, 0xe8, + 0xcd, 0x29, 0xcd, 0x6c, 0xcd, 0xad, 0xc8, 0x08, + 0xc8, 0x49, 0xca, 0x0a, 0xca, 0x4b, 0xf3, 0x31, + 0xd0, 0xc1, 0xc1, 0x34, 0xc2, 0x2a, 0xc2, 0xab, + 0xf1, 0x7a, 0x00, 0x28, 0xd9, 0xc0, 0xc8, 0x88, + 0xc8, 0xc9, 0xa9, 0xf8, 0xca, 0x8a, 0xca, 0xcb, + 0x11, 0x62, 0xe9, 0x79, 0xd0, 0xc0, 0xc1, 0x35, + 0xc2, 0x2e, 0xc2, 0xaf, 0xf1, 0x7a, 0xc9, 0x08, + 0xc9, 0x49, 0xa9, 0xf8, 0xcb, 0x0a, 0xcb, 0x4b, + 0xd0, 0xc1, 0xc1, 0x36, 0xc2, 0x2e, 0xc2, 0xaf, + 0xf1, 0x7a, 0xc0, 0x27, 0xc9, 0x88, 0xc9, 0xc9, + 0xa0, 0x38, 0xcb, 0x8a, 0xcb, 0xcb, 0xe1, 0x79, + 0x5f, 0x0d, 0x07, 0x7d, 0xde, 0x07, 0x11, 0x5e, + 0x30, 0x05, 0xcd, 0xc0, 0x00, 0x28, 0xd0, 0x00, + 0xa0, 0x38, 0x11, 0x61, 0xf9, 0x75, 0x00, 0xe2, + 0xd0, 0x00, 0x0f, 0x1d, 0xeb, 0x29, 0x00, 0x2d, + 0xdf, 0x4b, 0xf3, 0x3f, 0xe1, 0x75, 0x04, 0xeb, + 0xd0, 0x00, 0x11, 0x62, 0xeb, 0x36, 0xb0, 0x20, + 0x0f, 0x19, 0xfb, 0x36, 0xac, 0xe0, 0x01, 0xa4, + 0xde, 0x00, 0x5e, 0x0d, 0x00, 0x2d, 0xdf, 0x7a, + 0xdd, 0xc0, 0xd8, 0x80, 0xd9, 0x00, 0xd9, 0x80, + 0x5f, 0x00, 0x01, 0x46, 0x00, 0x28, 0xd0, 0x01, + 0x00, 0x06, 0xa0, 0x37, 0x80, 0x3f, 0x00, 0xc6, + 0x0f, 0xc5, 0xad, 0xda, 0xc6, 0xb1, 0xd0, 0x01, + 0x01, 0xa3, 0xde, 0x1d, 0x40, 0x30, 0x3e, 0x00, + 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 0xc8, 0x28, + 0xc8, 0x69, 0xc8, 0xaa, 0xc8, 0xeb, 0x0c, 0x1e, + 0xfb, 0x68, 0x26, 0xba, 0x07, 0x7d, 0xdc, 0x00, + 0x1d, 0xcf, 0x1d, 0xd1, 0x5d, 0xc0, 0x00, 0x2d, + 0xdf, 0x64, 0x0f, 0x87, 0xad, 0xda, 0x80, 0x3f, + 0x0e, 0x0a, 0x66, 0xda, 0xc9, 0x2c, 0xc9, 0x6d, + 0xc9, 0xae, 0xc9, 0xef, 0x0f, 0x2f, 0xd0, 0x37, + 0x4f, 0x00, 0x0f, 0x1a, 0xeb, 0xbe, 0x01, 0xa4, + 0xde, 0x20, 0xd0, 0x01, 0x40, 0x3c, 0x2e, 0x00, + 0x00, 0x2d, 0xdf, 0x7a, 0xac, 0xe0, 0x0f, 0x87, + 0x0e, 0x0a, 0x76, 0xe0, 0xbf, 0x79, 0xbe, 0x3c, + 0x0f, 0x1b, 0xeb, 0x9e, 0x0f, 0x87, 0x0e, 0x0a, + 0x76, 0xe1, 0xbf, 0x79, 0xbe, 0x34, 0x18, 0xa0, + 0xeb, 0xb9, 0x0f, 0x87, 0xad, 0x20, 0x80, 0x3f, + 0x0e, 0x0a, 0x76, 0xe2, 0xbf, 0x79, 0xbe, 0x3c, + 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe3, 0x0f, 0x1b, + 0xeb, 0xb3, 0xbf, 0x77, 0xbe, 0x0c, 0x19, 0x20, + 0xeb, 0xb9, 0x0f, 0x87, 0xad, 0x60, 0x80, 0x3f, + 0x0e, 0x0a, 0x76, 0xe4, 0xbe, 0x3c, 0xbf, 0x75, + 0x0f, 0x15, 0xf8, 0x1c, 0x1f, 0x0a, 0x1f, 0x16, + 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe5, 0xbf, 0x79, + 0xbe, 0x34, 0x19, 0xa0, 0xeb, 0xb9, 0x0f, 0x87, + 0xad, 0xa0, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe6, + 0xbe, 0x3c, 0xbf, 0x79, 0x0f, 0x87, 0x0e, 0x0a, + 0x76, 0xe7, 0x0f, 0x15, 0xeb, 0xbe, 0x00, 0x2f, + 0xdf, 0x72, 0x1d, 0xe0, 0xf8, 0x1c, 0x00, 0x28, + 0xd0, 0x01, 0xa0, 0x38, 0x80, 0x3f, 0x0f, 0x87, + 0xd0, 0x01, 0x4d, 0xc0, 0x1f, 0x0f, 0x1f, 0x11, + 0x00, 0x2f, 0xdf, 0x76, 0xc6, 0xb2, 0x03, 0x7d, + 0xde, 0x0e, 0x01, 0xa3, 0xde, 0x2d, 0x5d, 0xc0, + 0x0f, 0x87, 0x1e, 0xe1, 0xeb, 0xdb, 0xad, 0xda, + 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 0x0c, 0x1e, + 0xfb, 0xe4, 0x26, 0xbb, 0x03, 0xff, 0xdd, 0xff, + 0x4d, 0xc0, 0x00, 0xa3, 0xde, 0x2d, 0xbf, 0x56, + 0x0f, 0x87, 0x07, 0x7d, 0xde, 0x0e, 0x5d, 0xc0, + 0x00, 0xa3, 0xde, 0x1d, 0xad, 0xda, 0x80, 0x3f, + 0x0e, 0x0a, 0x66, 0xda, 0xdf, 0x5c, 0xd0, 0x0e, + 0x4f, 0x00, 0x0f, 0x87, 0xd0, 0x06, 0x40, 0x3c, + 0xeb, 0xf0, 0xbf, 0x3e, 0xb0, 0x04, 0xe7, 0xf2, + 0xeb, 0xf6, 0xbf, 0x0c, 0xbf, 0x3a, 0x0f, 0x87, + 0x0f, 0x1d, 0xfb, 0x4b, 0xbf, 0x38, 0x0f, 0x87, + 0x0f, 0x1c, 0xfb, 0xcb, 0xbf, 0x30, 0x0f, 0x87, + 0x50, 0x00, 0x50, 0x00, 0x0f, 0x17, 0xf9, 0x70, + 0x90, 0x4d, 0x10, 0x60, 0xe5, 0x72, 0x0f, 0x49, + 0x90, 0x4d, 0x10, 0x60, 0xe5, 0x76, 0x0f, 0x19, + 0xf9, 0x79, 0x01, 0x46, 0xd0, 0x11, 0xa0, 0x38, + 0x80, 0x3f, 0x00, 0xc6, 0xdf, 0x00, 0x00, 0x06, + 0x08, 0x20, 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x0a, + 0xa0, 0x1b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08, + 0xa0, 0x27, 0x90, 0x4d, 0x0f, 0xff, 0xd8, 0x1f, + 0x40, 0x40, 0xa0, 0x4d, 0x80, 0x0a, 0xd0, 0x00, + 0x06, 0x50, 0xf9, 0x95, 0xd0, 0x01, 0xa0, 0x09, + 0x80, 0x1b, 0xa0, 0x27, 0x01, 0x20, 0xd0, 0x67, + 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, + 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, + 0x01, 0x20, 0xd0, 0x40, 0xa0, 0x69, 0x80, 0x2b, + 0x80, 0x07, 0x08, 0x20, 0xdf, 0x00, 0x02, 0x30, + 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb0, + 0xd0, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30, + 0xd0, 0x01, 0xa0, 0x38, 0xd0, 0x10, 0xa0, 0x38, + 0x15, 0x63, 0xe9, 0xba, 0x05, 0x5e, 0xf9, 0xfa, + 0xc0, 0xdf, 0x00, 0xe0, 0xd1, 0x80, 0x70, 0x06, + 0x10, 0x1c, 0xc1, 0x40, 0x11, 0x48, 0xd3, 0x10, + 0x00, 0x21, 0xd0, 0x80, 0xb0, 0x16, 0xe9, 0xca, + 0xd3, 0x20, 0x10, 0x81, 0xb0, 0x16, 0xf9, 0xfa, + 0x30, 0xc2, 0xd2, 0x64, 0xd0, 0x92, 0x00, 0xee, + 0xd0, 0x54, 0x70, 0x41, 0x30, 0x43, 0xed, 0xd7, + 0xd2, 0x6c, 0x72, 0x49, 0xc0, 0x89, 0xb0, 0xbf, + 0x10, 0x9f, 0x22, 0x42, 0x04, 0x31, 0xd0, 0x10, + 0xc0, 0x42, 0x30, 0x49, 0xe5, 0xde, 0x10, 0x03, + 0xc1, 0x0c, 0xc1, 0x83, 0xb1, 0xbe, 0x01, 0x46, + 0x00, 0x06, 0xa0, 0x3d, 0xa0, 0x3c, 0x60, 0x06, + 0x00, 0xc6, 0xb1, 0xbc, 0xb1, 0x01, 0xed, 0xe1, + 0xc1, 0x0c, 0x21, 0x85, 0x01, 0x46, 0x00, 0x06, + 0xa0, 0x3d, 0xa0, 0x3c, 0x60, 0x06, 0x00, 0xc6, + 0xb1, 0xbc, 0xb1, 0x01, 0xed, 0xec, 0x02, 0xe4, + 0xd0, 0x00, 0x20, 0xc0, 0xb2, 0x41, 0xed, 0xd8, + 0x15, 0xa3, 0xfa, 0x00, 0xbc, 0x10, 0x0c, 0x1e, + 0xfa, 0x00, 0xbc, 0x10, 0xd0, 0x04, 0x70, 0x00, + 0x10, 0x20, 0xfa, 0x00, 0x00, 0x27, 0xd0, 0x10, + 0xd0, 0x40, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x14, + 0x60, 0x40, 0xb0, 0x28, 0x70, 0x40, 0xb0, 0x7f, + 0x60, 0x40, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, + 0x50, 0x00, 0x50, 0x00, 0x00, 0x28, 0xd1, 0xb0, + 0x70, 0x06, 0xd0, 0x81, 0x60, 0x86, 0x10, 0x20, + 0xe9, 0xab, 0xb0, 0x3f, 0x60, 0x06, 0x00, 0xec, + 0xd1, 0x84, 0x70, 0x46, 0xb1, 0x84, 0x70, 0x86, + 0x30, 0x42, 0xe9, 0xab, 0x70, 0x42, 0xd0, 0x35, + 0x30, 0x40, 0xf9, 0xab, 0x00, 0x63, 0xd0, 0x3f, + 0xb0, 0xbc, 0x40, 0x80, 0x70, 0xc2, 0x10, 0xe3, + 0xe5, 0xab, 0xb0, 0xbc, 0x40, 0x80, 0x60, 0x86, + 0x00, 0x28, 0xd0, 0x24, 0x70, 0x40, 0x00, 0x22, + 0xd0, 0x80, 0x50, 0x42, 0x60, 0x40, 0x00, 0x64, + 0xd0, 0x60, 0xd0, 0x90, 0x60, 0x81, 0x00, 0xed, + 0xd1, 0x88, 0x70, 0x46, 0x10, 0xe4, 0xe9, 0xa8, + 0x00, 0x21, 0xd0, 0xe8, 0xd0, 0x00, 0x60, 0x03, + 0xd0, 0x81, 0x40, 0x42, 0x60, 0x46, 0x02, 0x3c, + 0xdc, 0x89, 0xe0, 0x46, 0xd0, 0x82, 0x50, 0x42, + 0x60, 0x46, 0x00, 0x23, 0xd5, 0x3e, 0x01, 0x7a, + 0xde, 0x1a, 0xe0, 0x46, 0x01, 0x46, 0xdf, 0x5c, + 0x08, 0x20, 0xd1, 0x00, 0xcf, 0x04, 0x11, 0x08, + 0xa1, 0x0a, 0xa1, 0x1b, 0x11, 0x1f, 0xa1, 0x27, + 0xd2, 0x80, 0xb2, 0x81, 0x90, 0x4d, 0xc0, 0x01, + 0x10, 0x14, 0x00, 0x16, 0xe9, 0x8d, 0x80, 0x33, + 0x80, 0x3f, 0x92, 0x8b, 0x00, 0x23, 0xd0, 0x3f, + 0x42, 0x80, 0xe9, 0x8d, 0x0f, 0xff, 0xdf, 0xff, + 0x40, 0x01, 0xa0, 0x0d, 0xe1, 0x94, 0xa1, 0x0a, + 0x00, 0xea, 0xd0, 0x00, 0xd0, 0x8e, 0x00, 0x06, + 0x0f, 0x0b, 0x70, 0x80, 0x80, 0x73, 0x80, 0x0a, + 0xd0, 0x00, 0x06, 0x50, 0xf9, 0x9a, 0xd0, 0x01, + 0xd0, 0x44, 0x40, 0x70, 0x20, 0x01, 0x15, 0x63, + 0xf9, 0xa1, 0x80, 0x1b, 0xe1, 0xa2, 0x80, 0x5b, + 0xa0, 0x27, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, + 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, + 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, + 0xd0, 0x40, 0xa0, 0x69, 0x80, 0x2b, 0x80, 0x07, + 0x08, 0x20, 0xd0, 0x00, 0xcf, 0x00, 0x02, 0x30, + 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb2, + 0xd2, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30, + 0xd0, 0x01, 0xa0, 0x38, 0x00, 0x30, 0xd0, 0x10, + 0xa0, 0x38, 0x80, 0x3f, 0x00, 0xc6, 0x00, 0x28, + 0xd1, 0x24, 0x70, 0x04, 0xd0, 0x41, 0x50, 0x01, + 0x60, 0x04, 0x00, 0x27, 0xd0, 0x18, 0x70, 0x40, + 0xb0, 0x7f, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x20, + 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x08, 0x20, + 0xdf, 0x00, 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, + 0xd4, 0xc0, 0xd3, 0x81, 0x12, 0xa0, 0xed, 0xe3, + 0xd0, 0x08, 0x0a, 0x09, 0x00, 0x4d, 0xb0, 0x01, + 0xed, 0xdf, 0x03, 0xbf, 0xd4, 0x27, 0xe0, 0x46, + 0x50, 0x00, 0x50, 0x00, 0x02, 0x24, 0xd0, 0x00, + 0xa0, 0x37, 0x00, 0x27, 0xd3, 0xd0, 0x00, 0x26, + 0xd0, 0x04, 0x73, 0xcf, 0x13, 0xe1, 0xe9, 0x7b, + 0xb0, 0x3c, 0xf2, 0x00, 0x00, 0x26, 0xd0, 0x40, + 0xd0, 0x00, 0x60, 0x01, 0x00, 0x26, 0xd0, 0x14, + 0xf2, 0x00, 0x00, 0x26, 0xd0, 0x18, 0xf2, 0x00, + 0x00, 0xee, 0xd0, 0x1c, 0x71, 0x40, 0xd1, 0x24, + 0x15, 0x63, 0xe9, 0x8d, 0x11, 0x1f, 0xc7, 0x1a, + 0xb7, 0x01, 0xd3, 0x81, 0xc4, 0xd4, 0xf2, 0x04, + 0x00, 0x26, 0xd0, 0x18, 0x70, 0x40, 0xb0, 0x54, + 0xfd, 0x9b, 0x00, 0xed, 0xd0, 0x24, 0xd0, 0x44, + 0x60, 0x40, 0x13, 0xe1, 0xf9, 0xbc, 0x15, 0xa3, + 0xf9, 0xa1, 0x0c, 0x10, 0xe9, 0xb9, 0x11, 0x61, + 0xe5, 0xb3, 0xed, 0xb9, 0x15, 0xa3, 0xf9, 0xab, + 0x00, 0x26, 0xd0, 0x14, 0x70, 0x40, 0x10, 0x62, + 0xf5, 0xb3, 0x15, 0x22, 0xe5, 0xb3, 0xc0, 0x44, + 0x30, 0x54, 0xe5, 0xb3, 0x34, 0xd4, 0xf5, 0xb3, + 0xe1, 0xbf, 0x03, 0xb4, 0xd6, 0x29, 0x00, 0x26, + 0xd0, 0x40, 0x60, 0x01, 0xe1, 0xdb, 0x03, 0xb4, + 0xd6, 0x29, 0xe0, 0x46, 0x01, 0x7a, 0xde, 0x1a, + 0xe0, 0x46, 0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, + 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, + 0xa0, 0x6c, 0xd3, 0x80, 0xd0, 0xa1, 0x00, 0x88, + 0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, 0xf9, 0xc9, + 0x0c, 0x49, 0xd0, 0x61, 0x00, 0x8d, 0x10, 0xa0, + 0xe9, 0x90, 0x30, 0x42, 0xf5, 0xd8, 0xd0, 0x61, + 0x23, 0x81, 0xe1, 0xce, 0x23, 0x82, 0x13, 0xa1, + 0xf9, 0x90, 0xd0, 0x42, 0x15, 0xa1, 0xf9, 0xdf, + 0xb0, 0x7f, 0x00, 0x26, 0xd0, 0x14, 0x70, 0x00, + 0x30, 0x01, 0xf5, 0xe8, 0x16, 0xe0, 0xe5, 0xe8, + 0xb6, 0xc1, 0xbc, 0x20, 0xc0, 0x44, 0x30, 0x5b, + 0xfd, 0xb9, 0xc0, 0x44, 0x30, 0x54, 0xe5, 0xb9, + 0x15, 0x63, 0xf9, 0xf8, 0x15, 0xa3, 0xf9, 0xf5, + 0x03, 0x3c, 0xd8, 0x1c, 0xe0, 0x46, 0x03, 0x39, + 0xda, 0x17, 0xe0, 0x46, 0x15, 0xa3, 0xf9, 0xfd, + 0x03, 0x72, 0xde, 0x19, 0xe0, 0x46, 0x03, 0x70, + 0xd0, 0x17, 0xe0, 0x46, 0x70, 0x40, 0xb0, 0x7f, + 0x60, 0x40, 0x0f, 0xc5, 0xdf, 0x00, 0x0c, 0x09, + 0x05, 0x0d, 0x08, 0x20, 0xdf, 0x00, 0x0f, 0xc5, + 0x50, 0x00, 0x50, 0x00, 0x00, 0xef, 0xd0, 0x14, + 0x70, 0x40, 0x10, 0x60, 0xe9, 0x45, 0xb0, 0x04, + 0x70, 0x40, 0xb0, 0x41, 0xed, 0x44, 0x00, 0xed, + 0xd0, 0x24, 0xd0, 0x44, 0x60, 0x40, 0x00, 0x64, + 0xd0, 0x20, 0x70, 0x00, 0x10, 0x30, 0xe9, 0x45, + 0x00, 0x21, 0xd0, 0x28, 0x60, 0x40, 0x00, 0x64, + 0xd2, 0xc0, 0x70, 0x0b, 0x00, 0x11, 0xe9, 0x6a, + 0x08, 0x20, 0xd0, 0x4f, 0x30, 0x40, 0xe9, 0x55, + 0xb0, 0x4f, 0xf9, 0x6a, 0x03, 0xef, 0xdf, 0xbf, + 0xaf, 0xb8, 0xdf, 0x80, 0x0f, 0x87, 0xd0, 0x18, + 0x70, 0x00, 0x10, 0x20, 0xed, 0x6c, 0xdf, 0x84, + 0xd0, 0x40, 0x60, 0x7e, 0x00, 0x27, 0xd0, 0x54, + 0x70, 0x41, 0x10, 0x60, 0x01, 0xa0, 0xd0, 0x40, + 0xa0, 0x78, 0x80, 0x34, 0x80, 0x3f, 0x01, 0x3c, + 0xd2, 0x39, 0x00, 0x21, 0xdf, 0x86, 0x0f, 0x87, + 0xd0, 0x40, 0x60, 0x4b, 0x03, 0xe6, 0xd0, 0x08, + 0xe0, 0x36, 0x50, 0x00, 0x00, 0x28, 0xd0, 0x24, + 0x72, 0xc0, 0xd0, 0x40, 0x60, 0x40, 0xd0, 0x0c, + 0x52, 0xc0, 0xc0, 0x1c, 0x30, 0x1d, 0xf5, 0x3c, + 0x20, 0x1f, 0x30, 0x1e, 0x90, 0x6d, 0x20, 0x01, + 0x00, 0x22, 0xd0, 0x58, 0x60, 0x01, 0x00, 0xe3, + 0xd0, 0x48, 0x70, 0x41, 0x30, 0x40, 0xf5, 0x47, + 0xb2, 0xc8, 0x00, 0xe3, 0xd0, 0x4c, 0x70, 0x41, + 0x30, 0x40, 0xfd, 0x4d, 0xb2, 0xc4, 0x00, 0x28, + 0xd0, 0x20, 0x70, 0x00, 0x42, 0xc0, 0xa2, 0xc5, + 0x12, 0xe0, 0xe9, 0x55, 0x80, 0x40, 0x80, 0x34, + 0x80, 0x3f, 0xcf, 0x95, 0x82, 0x34, 0x80, 0x3f, + 0x03, 0xe8, 0xd0, 0x00, 0x1f, 0xa3, 0xe9, 0x60, + 0x03, 0xea, 0xd0, 0x00, 0x00, 0x27, 0xd0, 0x4c, + 0x7f, 0x81, 0x00, 0x27, 0xd0, 0x54, 0x70, 0x41, + 0x10, 0x60, 0x03, 0xa0, 0xd0, 0x40, 0xa0, 0x78, + 0xe0, 0x3c, 0x50, 0x00, 0xc0, 0x84, 0x10, 0x8c, + 0x10, 0x92, 0xd0, 0x41, 0x30, 0x4d, 0x40, 0x43, + 0x10, 0x43, 0x20, 0x81, 0xd1, 0x8f, 0x41, 0x82, + 0x10, 0x9c, 0x20, 0x9b, 0xc1, 0xc2, 0x10, 0x82, + 0x20, 0x87, 0xc0, 0x42, 0x10, 0x43, 0x20, 0x81, + 0x10, 0x88, 0x22, 0x02, 0x10, 0x97, 0x01, 0xd0, + 0xe9, 0x48, 0xb0, 0x96, 0x10, 0x88, 0x22, 0x82, + 0xc0, 0x5c, 0x10, 0x48, 0xc0, 0x84, 0x10, 0x91, + 0x10, 0x86, 0x20, 0x42, 0x41, 0x0d, 0x11, 0x02, + 0x20, 0x44, 0x22, 0x01, 0x22, 0x81, 0x02, 0xe4, + 0xd2, 0x40, 0xc2, 0xca, 0xb2, 0xe0, 0x01, 0xd0, + 0xe9, 0x5e, 0xc2, 0xca, 0x22, 0xc9, 0xb2, 0xa0, + 0x22, 0x48, 0xd0, 0x78, 0x03, 0x50, 0xf9, 0x69, + 0xd0, 0x7c, 0x01, 0x9d, 0xf9, 0x69, 0xc2, 0x48, + 0xb2, 0x60, 0xc2, 0xca, 0xb2, 0xf0, 0x11, 0x82, + 0x41, 0x81, 0x22, 0x06, 0x11, 0x9f, 0x41, 0x81, + 0x22, 0x86, 0x0f, 0xc5, 0xc0, 0x84, 0x10, 0x8c, + 0x10, 0x92, 0xd1, 0x8f, 0x41, 0x82, 0x10, 0x9c, + 0xc1, 0xdb, 0x11, 0xc1, 0x21, 0xc3, 0x20, 0x87, + 0xc1, 0xc2, 0x10, 0x82, 0x20, 0x87, 0xc0, 0x42, + 0x10, 0x43, 0x20, 0x81, 0x10, 0x88, 0x22, 0x02, + 0x10, 0x97, 0x01, 0xd0, 0xe9, 0x46, 0xb0, 0x96, + 0x10, 0x88, 0x22, 0x82, 0xc0, 0x5c, 0x10, 0x48, + 0xc0, 0x84, 0x10, 0x91, 0x10, 0x86, 0x20, 0x42, + 0xd0, 0x81, 0x41, 0x02, 0x11, 0x02, 0x20, 0x44, + 0x22, 0x01, 0x22, 0x81, 0x02, 0xe4, 0xd2, 0x40, + 0xc2, 0xca, 0xb2, 0xe0, 0x01, 0xd0, 0xe9, 0x5d, + 0xc2, 0xca, 0x22, 0xc9, 0xb2, 0xa0, 0x22, 0x48, + 0x11, 0x9f, 0x11, 0x83, 0x22, 0x06, 0x11, 0x9c, + 0x11, 0x83, 0x22, 0x86, 0x0f, 0xc5, 0xd0, 0x41, + 0x40, 0x44, 0x20, 0x55, 0x10, 0x62, 0xf9, 0x6f, + 0x01, 0xb5, 0xd4, 0x00, 0xc2, 0x9f, 0xc2, 0x1f, + 0x22, 0x80, 0xe1, 0x30, 0x0f, 0x11, 0xf9, 0x51, + 0x90, 0x38, 0x80, 0x3f, 0x00, 0x1b, 0xf9, 0x51, + 0x00, 0x27, 0xd0, 0x04, 0x70, 0x40, 0x30, 0x71, + 0xf9, 0x51, 0xb0, 0x3c, 0x70, 0x40, 0x30, 0x5d, + 0xf9, 0x51, 0xb0, 0x08, 0x70, 0x40, 0xb0, 0x7f, + 0x60, 0x40, 0x10, 0x63, 0xe5, 0x5d, 0x02, 0x20, + 0xd0, 0x01, 0xa0, 0x37, 0x00, 0x26, 0xd0, 0x24, + 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x08, + 0x70, 0x40, 0xb0, 0x41, 0x60, 0x40, 0x00, 0x26, + 0xd0, 0x30, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, + 0xb0, 0x30, 0xd0, 0x40, 0x60, 0x40, 0xb0, 0x3c, + 0x6c, 0x40, 0xb0, 0x3c, 0x67, 0x40, 0x00, 0x33, + 0xdf, 0xb0, 0xe0, 0x36, 0x00, 0x26, 0xd0, 0x1c, + 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x3c, + 0x70, 0x40, 0xb0, 0x41, 0x60, 0x40, 0x08, 0x20, + 0xdf, 0x00, 0x80, 0x35, 0xc0, 0x3c, 0x10, 0x08, + 0xa0, 0x0a, 0xa0, 0x27, 0xa0, 0x1b, 0xdf, 0x5c, + 0x01, 0xa0, 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, + 0x80, 0x34, 0x80, 0x3f, 0x03, 0xbb, 0xd8, 0x1e, + 0xcf, 0x95, 0x82, 0x34, 0x80, 0x3f, 0x03, 0xe8, + 0xd0, 0x00, 0x1f, 0xa3, 0xe9, 0x55, 0x1f, 0xa0, + 0xe9, 0x55, 0x03, 0xea, 0xd0, 0x00, 0x00, 0x21, + 0xdf, 0x86, 0xe0, 0x3c, 0x89, 0x78, 0x89, 0x37, + 0x00, 0xee, 0xd0, 0x14, 0x76, 0x00, 0xd0, 0x30, + 0x76, 0x40, 0x26, 0x58, 0xd6, 0xd9, 0x00, 0xee, + 0xd0, 0x20, 0x75, 0x40, 0xd0, 0x1c, 0x71, 0x40, + 0xd0, 0x20, 0x71, 0x00, 0xd0, 0x24, 0x70, 0x80, + 0xc4, 0x02, 0xd0, 0x28, 0x70, 0xc0, 0x00, 0x21, + 0xd0, 0x10, 0x72, 0x00, 0x93, 0x90, 0xd4, 0x81, + 0x13, 0x96, 0x43, 0x92, 0x34, 0x8e, 0x00, 0x22, + 0xd1, 0xa4, 0x71, 0x86, 0xde, 0x40, 0x7e, 0x79, + 0xd0, 0x18, 0x70, 0x40, 0xb0, 0x41, 0xf5, 0x58, + 0xd3, 0x42, 0x50, 0x4d, 0x60, 0x40, 0x10, 0x60, + 0xe5, 0x62, 0xd0, 0x54, 0x70, 0x01, 0xb0, 0x3c, + 0x60, 0x01, 0x04, 0x2d, 0xd0, 0x30, 0xe0, 0x36, + 0x00, 0x22, 0xd0, 0x60, 0x71, 0xc1, 0xd0, 0x4f, + 0x41, 0xc1, 0x04, 0x20, 0xd0, 0x28, 0xe0, 0x36, + 0x50, 0x00, 0x50, 0x00, 0x04, 0x22, 0xd0, 0x18, + 0xd3, 0x44, 0x72, 0x8d, 0x12, 0xa0, 0xe8, 0x36, + 0xc0, 0x47, 0x10, 0x5d, 0x30, 0x4e, 0xf8, 0x36, + 0xb2, 0x3e, 0x60, 0x4d, 0x00, 0xed, 0xd0, 0x48, + 0x70, 0x01, 0xde, 0x45, 0x50, 0x39, 0x00, 0x1b, + 0xf9, 0x44, 0xb0, 0x01, 0x00, 0x1c, 0xf9, 0x47, + 0xb0, 0x04, 0x60, 0x01, 0xd0, 0x40, 0x62, 0x81, + 0xce, 0x4a, 0xd0, 0x43, 0x41, 0xc1, 0xd0, 0x58, + 0x61, 0xc1, 0x90, 0x43, 0x00, 0xe0, 0xd0, 0x28, + 0x70, 0x00, 0x10, 0x1f, 0x20, 0x40, 0xb1, 0xc1, + 0xf5, 0x54, 0x00, 0x21, 0xd0, 0x08, 0x60, 0x40, + 0x00, 0xe6, 0xd0, 0x40, 0x70, 0x41, 0xd2, 0x94, + 0x60, 0x4a, 0x04, 0x2c, 0xd0, 0x08, 0x01, 0x90, + 0xf8, 0x36, 0x04, 0x2d, 0xd0, 0x30, 0xe0, 0x36, + 0x50, 0x00, 0x50, 0x00, 0xc0, 0x47, 0x10, 0x5d, + 0x30, 0x4e, 0xf9, 0x41, 0x90, 0x43, 0x00, 0xe0, + 0xd0, 0x28, 0x70, 0x00, 0x20, 0x40, 0x00, 0x21, + 0xd0, 0x08, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x74, + 0x70, 0x01, 0xb0, 0x3f, 0x60, 0x01, 0x00, 0xed, + 0xd0, 0x48, 0x70, 0x41, 0x00, 0x5e, 0xf9, 0x4b, + 0x00, 0x21, 0xd0, 0x00, 0x73, 0x80, 0xd4, 0x81, + 0x34, 0x8e, 0x00, 0x34, 0xd3, 0x70, 0xe0, 0x36, + 0x50, 0x00, 0x50, 0x00, 0xd1, 0x88, 0xd1, 0xc8, + 0x01, 0x1b, 0xe9, 0x39, 0x11, 0x9f, 0x11, 0xdf, + 0xd4, 0x80, 0xd3, 0x81, 0xe1, 0x43, 0x00, 0xed, + 0xd0, 0x08, 0x70, 0x00, 0x00, 0x10, 0xf9, 0x37, + 0x0c, 0x1f, 0xf9, 0x36, 0x13, 0xa1, 0xe9, 0x43, + 0xbe, 0x7c, 0x00, 0x69, 0xd2, 0x54, 0x12, 0x48, + 0xc0, 0x39, 0x30, 0x18, 0xe5, 0x4b, 0xd2, 0x70, + 0x72, 0x49, 0x22, 0x79, 0x00, 0x21, 0xd0, 0x00, + 0x63, 0x80, 0x04, 0x24, 0xd0, 0x38, 0x02, 0x10, + 0xe9, 0x56, 0xd0, 0x41, 0x51, 0x41, 0xe0, 0x36, + 0x15, 0x61, 0xe8, 0x36, 0xd5, 0x80, 0xd3, 0x00, + 0xd3, 0x40, 0x04, 0x28, 0xd0, 0x18, 0xe0, 0x36, + 0x50, 0x00, 0x50, 0x00, 0x00, 0x21, 0xd0, 0x18, + 0x73, 0x00, 0xb0, 0x04, 0x73, 0x80, 0xd2, 0x80, + 0xb0, 0x38, 0x72, 0xc0, 0x31, 0x0d, 0xc0, 0x0e, + 0x10, 0x0b, 0x10, 0x20, 0xe9, 0x42, 0xf5, 0x3f, + 0x22, 0x8d, 0x10, 0x01, 0x13, 0x5f, 0xe1, 0x3b, + 0x33, 0x8b, 0x15, 0x61, 0xf9, 0x49, 0x00, 0x21, + 0xd0, 0x64, 0x70, 0x41, 0x33, 0x81, 0x03, 0xd0, + 0xe9, 0x4c, 0x20, 0x0b, 0x13, 0xdf, 0x12, 0xc1, + 0x13, 0xe0, 0xf9, 0x49, 0x10, 0x03, 0xc0, 0x50, + 0x10, 0x4b, 0x13, 0x0b, 0x23, 0x00, 0x13, 0x20, + 0xe9, 0x5c, 0xf5, 0x59, 0x22, 0x81, 0x13, 0x01, + 0x10, 0x5f, 0xe1, 0x55, 0x12, 0x99, 0x12, 0x87, + 0x21, 0x0a, 0x00, 0xa0, 0xd2, 0x80, 0xc3, 0x0a, + 0x03, 0x90, 0xe9, 0x66, 0x22, 0x82, 0x23, 0x03, + 0x10, 0x81, 0x10, 0xc1, 0x13, 0x9f, 0x13, 0xa0, + 0xed, 0x62, 0xc0, 0x8a, 0xc0, 0xcc, 0x04, 0x26, + 0xd0, 0x38, 0xe0, 0x36, 0x15, 0x61, 0xf9, 0x3d, + 0x07, 0x32, 0xd0, 0x00, 0x30, 0x03, 0xed, 0x3d, + 0xc0, 0x03, 0x10, 0x1d, 0x30, 0xc0, 0xc0, 0x02, + 0x10, 0x1d, 0x30, 0x80, 0xe1, 0x32, 0x10, 0x94, + 0x10, 0xd4, 0x00, 0x21, 0xd0, 0x20, 0x73, 0x00, + 0xc5, 0x8c, 0xd3, 0x4e, 0x01, 0x1b, 0xe9, 0x48, + 0x13, 0x1f, 0xd3, 0x4f, 0x43, 0x4c, 0x13, 0x1c, + 0xc0, 0x0c, 0x10, 0x03, 0x20, 0x0c, 0xc0, 0x40, + 0x10, 0x42, 0x20, 0x40, 0x10, 0x46, 0x20, 0x4d, + 0x10, 0x42, 0x2e, 0x41, 0x10, 0x5c, 0x10, 0x43, + 0x00, 0x59, 0xe9, 0x5b, 0x01, 0x69, 0xd0, 0x20, + 0x30, 0x40, 0x22, 0x41, 0x04, 0x28, 0xd0, 0x18, + 0xe0, 0x36, 0x50, 0x00, 0x2c, 0x14, 0xd0, 0x34, + 0x63, 0x00, 0xd0, 0x38, 0x72, 0xc0, 0xc0, 0x51, + 0x10, 0x5c, 0x30, 0x4b, 0x10, 0x44, 0xd4, 0xc0, + 0xd5, 0x00, 0xc0, 0x18, 0x30, 0x39, 0xed, 0x5f, + 0xd4, 0xd0, 0xc5, 0x01, 0xd0, 0x18, 0x70, 0x00, + 0x0c, 0x1f, 0xe9, 0x48, 0x10, 0x20, 0xfd, 0x48, + 0xd4, 0xc0, 0xd5, 0x00, 0x10, 0x22, 0xe5, 0x4e, + 0xd4, 0xc0, 0xbc, 0x30, 0xd5, 0x00, 0xb5, 0x10, + 0xb0, 0x3f, 0xf9, 0x52, 0x3c, 0x01, 0x3c, 0x01, + 0x02, 0x1f, 0xe9, 0x5f, 0x00, 0xa8, 0xd3, 0xc0, + 0xd3, 0xa4, 0x00, 0xaa, 0xd0, 0x10, 0x70, 0x4f, + 0xb3, 0xfc, 0x60, 0x40, 0xb0, 0x3c, 0xb3, 0x81, + 0xed, 0x59, 0x00, 0x21, 0xd0, 0x28, 0x70, 0x00, + 0x10, 0x20, 0xf9, 0x69, 0x02, 0x1f, 0xf9, 0x6a, + 0x90, 0x10, 0x00, 0x1e, 0xe9, 0x6a, 0xb1, 0x7c, + 0x04, 0x2a, 0xd0, 0x18, 0xe0, 0x36, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x01, 0x5e, 0xf9, 0x35, + 0x01, 0x50, 0xe9, 0x35, 0xb1, 0x78, 0xd2, 0x00, + 0x01, 0x5c, 0xf9, 0x5f, 0xc0, 0x18, 0x30, 0x39, + 0xed, 0x5f, 0x11, 0x9f, 0xce, 0x58, 0xc2, 0x59, + 0x00, 0xaa, 0xd2, 0x10, 0x14, 0x82, 0x22, 0x12, + 0xc0, 0x0c, 0x10, 0x1f, 0x10, 0x03, 0x22, 0x00, + 0x70, 0x48, 0x03, 0x10, 0xe9, 0x4c, 0xb2, 0x38, + 0xbe, 0x60, 0xb2, 0x60, 0x2e, 0x41, 0x10, 0x5f, + 0x00, 0x59, 0xe9, 0x53, 0x01, 0x69, 0xd0, 0x3c, + 0x30, 0x40, 0x22, 0x41, 0x13, 0x41, 0x2e, 0x4d, + 0x13, 0x5d, 0x13, 0x43, 0x22, 0x4d, 0x14, 0xe0, + 0xe9, 0x5f, 0x33, 0x0b, 0x13, 0x04, 0x2c, 0x0c, + 0x35, 0x0c, 0xc3, 0x46, 0xc3, 0x87, 0x04, 0x62, + 0xd0, 0x10, 0x15, 0x62, 0xfc, 0x36, 0x04, 0x60, + 0xd0, 0x10, 0xe0, 0x36, 0x00, 0x22, 0xd0, 0x74, + 0x74, 0x01, 0xb0, 0x7c, 0x74, 0x41, 0xb0, 0x7c, + 0x71, 0x41, 0xd1, 0x18, 0xc0, 0x10, 0x10, 0x1c, + 0xb0, 0x16, 0xf9, 0x45, 0x00, 0x24, 0xd0, 0x20, + 0x30, 0x11, 0xf9, 0x45, 0xb1, 0x70, 0x01, 0x50, + 0xf9, 0x45, 0xb1, 0x20, 0x14, 0x41, 0xc0, 0x90, + 0x00, 0x2b, 0xd0, 0xd0, 0x01, 0x50, 0xe9, 0x4b, + 0xc0, 0xd0, 0x00, 0x35, 0xdc, 0x00, 0x20, 0x11, + 0x10, 0x1f, 0xa0, 0x1c, 0x00, 0x21, 0xd0, 0x2c, + 0x70, 0x00, 0x10, 0x05, 0x51, 0x40, 0xd0, 0x1c, + 0x61, 0x40, 0xd0, 0x20, 0x61, 0x00, 0xd0, 0x24, + 0x60, 0x80, 0xd0, 0x28, 0x60, 0xc0, 0x04, 0x2d, + 0xd0, 0x30, 0x00, 0x22, 0xd0, 0x64, 0xb1, 0x81, + 0x61, 0x81, 0xe0, 0x36, 0x90, 0x50, 0xd0, 0x3c, + 0x10, 0x41, 0x60, 0x40, 0x15, 0x62, 0xfd, 0x3d, + 0xc0, 0x10, 0x10, 0x1e, 0x10, 0x07, 0x21, 0x00, + 0x10, 0x16, 0x34, 0x00, 0xc0, 0x90, 0xd3, 0x40, + 0x00, 0x24, 0xd3, 0xc0, 0x04, 0x23, 0xd0, 0x18, + 0x01, 0x9f, 0xe8, 0x36, 0xd0, 0x54, 0x70, 0x41, + 0x73, 0x41, 0x04, 0x2e, 0xd0, 0x28, 0xe0, 0x36, + 0x50, 0x00, 0x50, 0x00, 0x00, 0xef, 0xd3, 0x30, + 0x73, 0x0c, 0xd0, 0x0c, 0x70, 0x00, 0xc0, 0x40, + 0x13, 0x24, 0xf5, 0x42, 0x13, 0x22, 0xe9, 0x41, + 0xe5, 0x43, 0xd3, 0x00, 0x10, 0x22, 0xf9, 0x41, + 0xd0, 0x01, 0xd0, 0x43, 0xd3, 0x01, 0x21, 0x00, + 0xd3, 0x40, 0x03, 0x10, 0xf9, 0x47, 0xd3, 0x40, + 0xe1, 0x61, 0x00, 0x23, 0xd0, 0x00, 0x10, 0x61, + 0xe9, 0x50, 0xb0, 0x33, 0x10, 0x63, 0xe9, 0x50, + 0x00, 0x22, 0xd0, 0x1a, 0xc3, 0xc0, 0xd2, 0xc0, + 0x00, 0x10, 0xe9, 0x55, 0x22, 0xd0, 0x10, 0x1f, + 0x14, 0x01, 0x10, 0x20, 0xed, 0x52, 0x14, 0x18, + 0x12, 0xd8, 0xc0, 0x8b, 0x32, 0xd0, 0x12, 0xc3, + 0x33, 0x4b, 0x13, 0x47, 0x21, 0x0d, 0x04, 0x23, + 0xd0, 0x18, 0xe0, 0x36, 0x00, 0x24, 0xd0, 0x30, + 0xd0, 0x40, 0x60, 0x40, 0xd3, 0xc7, 0x43, 0xc4, + 0x31, 0x0f, 0xd5, 0xd4, 0x25, 0xcf, 0x15, 0xc4, + 0x10, 0xdf, 0xc2, 0xc6, 0xc3, 0x07, 0x11, 0x81, + 0xb1, 0x3b, 0x15, 0x64, 0xe9, 0x47, 0x10, 0xdf, + 0x12, 0xc1, 0x11, 0x81, 0x11, 0xc1, 0xb1, 0x3f, + 0xb5, 0xf8, 0x90, 0x10, 0x00, 0x16, 0xf9, 0x5e, + 0xb5, 0xfc, 0xd0, 0x20, 0x40, 0x39, 0x2e, 0x4b, + 0x22, 0x4c, 0x12, 0x20, 0xe9, 0x59, 0x20, 0x39, + 0x00, 0x1b, 0xe9, 0x59, 0x2c, 0x13, 0x35, 0x13, + 0x0e, 0x5a, 0xf9, 0x59, 0xb2, 0x38, 0x02, 0xe3, + 0xd0, 0x00, 0x0e, 0x5a, 0xe9, 0x5e, 0x2e, 0x40, + 0x01, 0xee, 0xd2, 0x80, 0x42, 0x84, 0xc0, 0x03, + 0x30, 0x02, 0xf5, 0x6b, 0x31, 0x0a, 0x12, 0x98, + 0x20, 0x03, 0xf5, 0x69, 0x12, 0x9f, 0x12, 0x87, + 0x51, 0x0a, 0x00, 0x34, 0xd4, 0xf0, 0xe0, 0x36, + 0x50, 0x00, 0x50, 0x00, 0xd3, 0xc7, 0x43, 0xc4, + 0x15, 0x61, 0xf9, 0x48, 0x10, 0xc1, 0xd5, 0xe0, + 0xd1, 0x80, 0xd1, 0xc0, 0x31, 0x0f, 0x13, 0xe1, + 0xe9, 0x3c, 0xd3, 0xc0, 0x00, 0x24, 0xd0, 0x30, + 0x63, 0xc0, 0x25, 0xcf, 0x15, 0xc2, 0xd0, 0x03, + 0x40, 0x16, 0x25, 0xc0, 0x15, 0xc2, 0x15, 0x81, + 0x35, 0x91, 0xe1, 0x5c, 0x00, 0x24, 0xd0, 0x30, + 0x63, 0xc0, 0x01, 0x50, 0xe9, 0x54, 0x15, 0xa0, + 0xf9, 0x55, 0x00, 0x24, 0xd0, 0x34, 0x70, 0x00, + 0x10, 0x20, 0xe9, 0x55, 0xd3, 0xc0, 0x31, 0x0f, + 0xd5, 0xfc, 0x25, 0xcf, 0x15, 0xc3, 0x14, 0xa0, + 0xe9, 0x5c, 0xb5, 0xfc, 0x00, 0x34, 0xd4, 0xf0, + 0xe0, 0x36, 0x50, 0x00, 0xc4, 0x91, 0x34, 0x96, + 0xed, 0x34, 0xd4, 0x80, 0x14, 0x84, 0xb3, 0xc1, + 0xe5, 0x41, 0xc0, 0x52, 0x10, 0x5e, 0x34, 0x81, + 0xb3, 0xc1, 0xe5, 0x41, 0xc0, 0x52, 0x10, 0x5c, + 0x24, 0x81, 0xb3, 0xc1, 0xe5, 0x37, 0x02, 0xe8, + 0xd0, 0x00, 0xb4, 0xb0, 0x14, 0x9b, 0x00, 0x24, + 0xd0, 0x60, 0x30, 0x52, 0xed, 0x4a, 0x24, 0x81, + 0x20, 0x12, 0xa0, 0x1c, 0x10, 0x8a, 0x50, 0x83, + 0xa0, 0x96, 0xa1, 0x50, 0xa1, 0x11, 0xc0, 0x52, + 0xd4, 0x84, 0x10, 0x6c, 0xed, 0x56, 0xd4, 0x81, + 0xd1, 0x00, 0xb1, 0x17, 0x00, 0x23, 0xd1, 0x40, + 0xc2, 0xb9, 0x22, 0x86, 0x12, 0x20, 0xf9, 0x66, + 0x02, 0xe3, 0xd0, 0x40, 0x02, 0x9a, 0xe9, 0x63, + 0x22, 0x81, 0x02, 0x5a, 0xe9, 0x66, 0x22, 0x41, + 0x75, 0xd7, 0xc3, 0xd7, 0xd0, 0xd7, 0x00, 0x21, + 0xd0, 0xb6, 0x8b, 0x38, 0x00, 0x33, 0xdd, 0x08, + 0xe0, 0x36, 0x50, 0x00, 0xd0, 0x7c, 0x60, 0x01, + 0xae, 0x52, 0xd0, 0x60, 0x40, 0x79, 0x00, 0x13, + 0xe8, 0xc9, 0xa2, 0x94, 0x22, 0x86, 0x13, 0xe0, + 0xe4, 0xd0, 0x13, 0xc1, 0x15, 0x62, 0xfc, 0xd1, + 0x13, 0xc1, 0xe0, 0xd1, 0xc3, 0xd7, 0x03, 0xd9, + 0xe8, 0xd4, 0x22, 0x8d, 0x15, 0x62, 0xfc, 0xda, + 0x03, 0xda, 0xe8, 0xda, 0x22, 0x8d, 0x22, 0x8d, + 0xce, 0x4a, 0x22, 0x86, 0x00, 0x14, 0xe8, 0xe0, + 0xa2, 0x53, 0x22, 0x47, 0x03, 0xd1, 0xe8, 0xe8, + 0x22, 0x4e, 0x15, 0x62, 0xfc, 0xe8, 0x03, 0xd2, + 0xe8, 0xe8, 0x22, 0x4e, 0x12, 0x20, 0xe9, 0x09, + 0x20, 0x79, 0x00, 0x5b, 0xe8, 0xf4, 0x15, 0x20, + 0xfc, 0xf1, 0x2c, 0x13, 0x35, 0x13, 0x0e, 0x5b, + 0xe8, 0xf4, 0xb2, 0x38, 0x02, 0x9a, 0xe8, 0xfb, + 0x70, 0x08, 0xd0, 0x7c, 0x42, 0x81, 0x22, 0x98, + 0x22, 0x80, 0x02, 0x5a, 0xe9, 0x11, 0x70, 0x08, + 0xd0, 0x78, 0x42, 0x41, 0x22, 0x59, 0x10, 0x1f, + 0x22, 0x40, 0x00, 0x19, 0xe9, 0x11, 0x01, 0x69, + 0xd0, 0x7c, 0x32, 0x41, 0xe1, 0x11, 0x02, 0xe3, + 0xd0, 0x40, 0x02, 0x9a, 0xe9, 0x0e, 0x22, 0x81, + 0x02, 0x5a, 0xe9, 0x11, 0x22, 0x41, 0x0e, 0x5a, + 0xe9, 0x15, 0xce, 0x4a, 0x3e, 0x46, 0x0f, 0x87, + 0xdd, 0x48, 0xe1, 0x19, 0xdd, 0x40, 0xdc, 0xc8, + 0xdd, 0x3c, 0x7d, 0x34, 0x1d, 0x19, 0x3d, 0x35, + 0x4d, 0x33, 0x4c, 0xec, 0x3d, 0x33, 0xf9, 0x17, + 0x0f, 0xc5, 0x50, 0x00, 0xd0, 0x39, 0xd0, 0x35, + 0xd0, 0x1d, 0xd0, 0x2d, 0xd0, 0x3f, 0xd0, 0x2e, + 0xd0, 0x3c, 0xd0, 0x37, 0xd0, 0x33, 0xd0, 0x19, + 0xd0, 0x33, 0xd0, 0x2e, 0xd0, 0x3d, 0xd0, 0x3e, + 0xd0, 0x27, 0xd0, 0x3e, 0xd0, 0x3a, 0xd0, 0x2f, + 0xd0, 0x32, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x80, + 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0xd0, + 0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x05, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x90, 0x85, 0x00, 0x00, 0xa6, 0xee, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xd0, + 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x08, 0xa0, 0x00, 0x08, 0x08, 0x28, + 0x00, 0x08, 0x88, 0x68, 0x00, 0x08, 0xa0, 0x98, + 0x00, 0x08, 0x88, 0x68, 0x00, 0x08, 0x28, 0x98, + 0x00, 0x08, 0xac, 0xf4, 0x00, 0x08, 0xb8, 0x7c, + 0x00, 0x02, 0x02, 0x88, 0x00, 0x02, 0x08, 0x22, + 0x00, 0x02, 0x88, 0xaa, 0x00, 0x02, 0x22, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x04, 0x24, 0x00, 0x04, 0x04, 0x24, + 0x00, 0x04, 0x28, 0x6c, 0x00, 0x04, 0x28, 0x6c, + 0x00, 0x01, 0x10, 0x44, 0x00, 0x01, 0x20, 0x44, + 0x00, 0x01, 0x11, 0xaa, 0x00, 0x01, 0x88, 0x55, + 0x00, 0x01, 0x44, 0xaa, 0x00, 0x01, 0x44, 0x55, + 0x00, 0x20, 0x80, 0xa0, 0x00, 0x20, 0x80, 0xc0, + 0x00, 0x20, 0x20, 0xa0, 0x00, 0x20, 0x40, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x10, 0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x10, 0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22, + 0x10, 0x10, 0x16, 0x18, 0x1b, 0x1d, 0x22, 0x25, + 0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 0x22, 0x26, + 0x16, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 0x25, 0x28, + 0x16, 0x1a, 0x1b, 0x1d, 0x20, 0x23, 0x28, 0x30, + 0x1a, 0x1b, 0x1d, 0x20, 0x23, 0x28, 0x30, 0x3a, + 0x1a, 0x1b, 0x1d, 0x22, 0x26, 0x2e, 0x38, 0x45, + 0x1b, 0x1d, 0x23, 0x26, 0x2e, 0x38, 0x45, 0x53, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0xd6, 0x00, 0x00, 0x1b, 0x08, 0x00, + 0x00, 0x1f, 0xde, 0x00, 0x00, 0x00, 0x50, 0x00, + 0x00, 0x08, 0x39, 0x00, 0x00, 0x10, 0x22, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x05, 0x28, 0x20, 0x01, + 0x00, 0x00, 0x01, 0xe0, 0x71, 0x01, 0x00, 0x68, + 0xe0, 0x7f, 0xb0, 0x7f, 0x60, 0x40, 0xe0, 0x1d, + 0x90, 0x10, 0xb4, 0x81, 0xe8, 0xc0, 0xe0, 0xc2, + 0x90, 0x18, 0x00, 0x8a, 0x70, 0xc0, 0x0f, 0x87, + 0xe3, 0xe8, 0xc0, 0x00, 0x70, 0x40, 0xe0, 0x01, + 0xe0, 0x86, 0x00, 0x26, 0xd0, 0x28, 0xe0, 0x0e, + 0xd0, 0x0e, 0x0f, 0x0b, 0x70, 0x1d, 0xe0, 0x67, + 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, + 0x0f, 0x87, 0x02, 0x20, 0xd0, 0x01, 0xe0, 0x25, + 0x0f, 0x45, 0x6f, 0x81, 0xdf, 0xa6, 0xe0, 0x36, + 0xe1, 0x30, 0xa0, 0x37, 0xc0, 0x00, 0xe0, 0x26, + 0x00, 0x33, 0xde, 0xc8, 0xe0, 0x32, 0x0f, 0xc5, + 0x0f, 0x87, 0x00, 0x27, 0xd0, 0x4c, 0xe0, 0x21, + 0x00, 0x33, 0xdf, 0x28, 0x00, 0x27, 0xd0, 0x56, + 0x60, 0x01, 0xe0, 0x2d, 0x03, 0xa0, 0xd0, 0x41, + 0xa0, 0x78, 0x00, 0x60, 0xd0, 0x41, 0xa0, 0x77, + 0x00, 0x22, 0xd0, 0x58, 0xa0, 0x76, 0x00, 0x21, + 0xd0, 0x7c, 0x00, 0x4a, 0xd0, 0x72, 0x70, 0x40, + 0x00, 0x06, 0x0f, 0x87, 0x00, 0x22, 0xdc, 0xf8, + 0xf0, 0x4a, 0xe1, 0x70, 0x07, 0xef, 0xdd, 0xbf, + 0x4f, 0x36, 0x1d, 0x99, 0x4d, 0x80, 0x10, 0x18, + 0xdd, 0x50, 0x60, 0x35, 0xdd, 0x72, 0xdd, 0x10, + 0x3d, 0xb4, 0xec, 0x57, 0x2d, 0x36, 0x1d, 0x03, + 0xbd, 0x04, 0xe4, 0x2b, 0x01, 0x46, 0x00, 0x06, + 0xac, 0xf6, 0x80, 0x3f, 0x0d, 0x0a, 0x10, 0x02, + 0x7d, 0x40, 0x10, 0x1e, 0xb0, 0x20, 0xbc, 0xe0, + 0x00, 0x06, 0x00, 0xc6, 0xe0, 0x52, 0xb7, 0x60, + 0xb7, 0x60, 0xc0, 0x5d, 0x30, 0x5f, 0xe4, 0x72, + 0xc7, 0x5e, 0x00, 0xed, 0xd0, 0x28, 0x70, 0x40, + 0xb0, 0x7f, 0x60, 0x40, 0xc0, 0x1d, 0x30, 0x1c, + 0xf8, 0x7e, 0x00, 0x21, 0xd0, 0x01, 0x00, 0x26, + 0xd0, 0x78, 0xa0, 0x38, 0x80, 0x3f, 0x70, 0x01, + 0xb0, 0x3f, 0x60, 0x01, 0x0f, 0x87, 0x80, 0x34, + 0x03, 0xef, 0xd8, 0x3f, 0xa8, 0x38, 0x01, 0x35, + 0xdc, 0x33, 0xe0, 0x46, 0xc0, 0x1c, 0xe4, 0xa5, + 0x97, 0x2e, 0x30, 0x1c, 0xe8, 0x8e, 0x00, 0x21, + 0xd0, 0x00, 0xa0, 0x38, 0xc0, 0x5d, 0x00, 0x23, + 0xd0, 0x00, 0x30, 0x40, 0x30, 0x5e, 0xe4, 0x99, + 0x20, 0x5e, 0xc0, 0x01, 0x30, 0x1c, 0xec, 0xa4, + 0xe0, 0x9d, 0x20, 0x5f, 0xc0, 0x1c, 0x30, 0x01, + 0xf4, 0xa5, 0xc0, 0x1c, 0x30, 0x1d, 0xec, 0xa4, + 0xe4, 0xa5, 0x90, 0x38, 0x00, 0x1b, 0xe8, 0xa5, + 0xa0, 0x66, 0xb1, 0x3f, 0xe4, 0xb3, 0xe8, 0xb1, + 0xc0, 0x4b, 0x30, 0x44, 0xf8, 0xb3, 0x60, 0x45, + 0xb1, 0x7c, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x05, + 0x80, 0x40, 0x72, 0xc5, 0x00, 0x06, 0x90, 0x55, + 0xd0, 0x01, 0x00, 0x40, 0xa0, 0x55, 0x0f, 0x87, + 0x01, 0x46, 0x00, 0x06, 0x03, 0xef, 0xd0, 0x3f, + 0xa0, 0x38, 0xb0, 0x01, 0xa0, 0x37, 0x80, 0x3f, + 0x82, 0x34, 0x80, 0x3f, 0xf2, 0x1a, 0x80, 0x34, + 0x80, 0x3f, 0xf2, 0x1a, 0xd8, 0x00, 0xd8, 0x40, + 0xd8, 0x80, 0xd8, 0xc0, 0xd9, 0x00, 0xd9, 0x40, + 0xd9, 0x80, 0xd9, 0xc0, 0xda, 0x00, 0xda, 0x40, + 0xda, 0x80, 0xda, 0xc0, 0xdb, 0x00, 0xdb, 0x40, + 0xdb, 0x80, 0xdb, 0xc0, 0xdc, 0x00, 0xdc, 0x40, + 0xdc, 0x80, 0xdc, 0xc0, 0xdd, 0x00, 0xdd, 0x40, + 0xdd, 0x80, 0xdd, 0xc0, 0xde, 0x00, 0xde, 0x40, + 0xde, 0x80, 0xde, 0xc0, 0xdf, 0x00, 0xdf, 0x40, + 0xdf, 0x80, 0xdf, 0xc0, 0xde, 0x80, 0xde, 0xc1, + 0x00, 0x28, 0xd0, 0x60, 0x6e, 0x81, 0x80, 0x00, + 0x80, 0x05, 0x00, 0xe3, 0xd1, 0x88, 0x00, 0x73, + 0xd5, 0x80, 0x60, 0x06, 0xb1, 0xbc, 0x00, 0xfa, + 0xd0, 0x80, 0x60, 0x06, 0x00, 0x26, 0xd0, 0x6c, + 0x6e, 0x81, 0x04, 0x32, 0xd2, 0x00, 0x00, 0xee, + 0xd1, 0x94, 0x60, 0x06, 0x00, 0xed, 0xd0, 0x50, + 0x6e, 0x81, 0x00, 0x22, 0xd0, 0x70, 0x6e, 0x81, + 0x00, 0xee, 0xd0, 0x74, 0x6e, 0x81, 0xd0, 0x4c, + 0x6e, 0x81, 0xd0, 0x02, 0x00, 0xef, 0xd0, 0x6c, + 0x60, 0x01, 0xd0, 0x03, 0x00, 0xef, 0xd0, 0x70, + 0x60, 0x01, 0x00, 0xe0, 0xd0, 0x48, 0xd0, 0x02, + 0x60, 0x01, 0x00, 0x32, 0xd6, 0xf0, 0xa0, 0x1c, + 0x00, 0x21, 0xd0, 0x60, 0xa0, 0x76, 0x00, 0x34, + 0xd5, 0x48, 0x80, 0x3f, 0x00, 0x23, 0xd0, 0x5c, + 0x00, 0x4a, 0xd0, 0x72, 0x70, 0x40, 0x00, 0x06, + 0x00, 0x22, 0xd1, 0xa4, 0x6e, 0xc6, 0xd0, 0x58, + 0x6e, 0xc1, 0xd0, 0xc9, 0x00, 0xed, 0xd0, 0x54, + 0x60, 0xc1, 0x00, 0x22, 0xd0, 0x40, 0x60, 0xc1, + 0x00, 0x22, 0xd0, 0x60, 0x60, 0xc1, 0x82, 0x34, + 0x80, 0x3f, 0xd6, 0xd9, 0x01, 0x20, 0xd6, 0x22, + 0x16, 0x08, 0xd0, 0x5e, 0xd0, 0x2c, 0x60, 0x40, + 0xd0, 0x70, 0x01, 0x74, 0xd6, 0x00, 0x60, 0x01, + 0x00, 0x2b, 0xd4, 0x10, 0x00, 0x27, 0xd4, 0x60, + 0x00, 0x2b, 0xd0, 0x90, 0xc0, 0xc2, 0xd1, 0x08, + 0xd1, 0x44, 0xa1, 0x50, 0x00, 0x21, 0xd0, 0xb6, + 0xd0, 0xd7, 0x00, 0x29, 0xd0, 0x04, 0x64, 0x00, + 0xb0, 0x3c, 0x64, 0x40, 0x80, 0x34, 0x80, 0x3f, + 0xd0, 0x40, 0x00, 0x35, 0xd0, 0x00, 0x60, 0x01, + 0xd0, 0x48, 0x6e, 0x81, 0xd0, 0x44, 0x6e, 0x81, + 0x00, 0x64, 0xd1, 0x80, 0x6e, 0x86, 0x01, 0x3c, + 0xd2, 0x39, 0xe0, 0x46, 0xd0, 0x00, 0xd0, 0x40, + 0xd0, 0x80, 0xd0, 0xc0, 0xd1, 0x00, 0xd1, 0x40, + 0xd1, 0x80, 0xd1, 0xc0, 0xd2, 0x00, 0xd2, 0x40, + 0xd2, 0x80, 0xd2, 0xc0, 0xd3, 0x00, 0xd3, 0x40, + 0xd3, 0x80, 0xd3, 0xc0, 0xd4, 0x00, 0xd4, 0x40, + 0xd4, 0x80, 0xd4, 0xc0, 0xd5, 0x00, 0xd5, 0x40, + 0xd5, 0x80, 0xd5, 0xc0, 0xd6, 0x00, 0xd6, 0x40, + 0xd6, 0x80, 0xd6, 0xc0, 0xd7, 0x00, 0xd7, 0x40, + 0xd7, 0x80, 0xd7, 0xc0, 0x0f, 0xc5, 0x50, 0x00, + 0x01, 0x46, 0x00, 0x06, 0xde, 0x80, 0xde, 0xc1, + 0x03, 0x2f, 0xd0, 0x33, 0xa0, 0x38, 0xb0, 0x01, + 0xa0, 0x37, 0x80, 0x3f, 0x08, 0x20, 0xdf, 0x00, + 0x82, 0x34, 0x80, 0x3f, 0x00, 0xee, 0xd0, 0x08, + 0x77, 0xc0, 0xb0, 0x04, 0x77, 0x80, 0xb0, 0x04, + 0xc0, 0x5f, 0x30, 0x5e, 0x60, 0x40, 0xd7, 0x00, + 0xb7, 0x01, 0x80, 0x34, 0x80, 0x3f, 0x00, 0x60, + 0xd0, 0x80, 0x00, 0xec, 0xd0, 0x40, 0x60, 0x81, + 0xb0, 0x7c, 0x60, 0x81, 0x00, 0xa0, 0xd0, 0x80, + 0xb0, 0x74, 0x60, 0x81, 0xb0, 0x7c, 0x60, 0x81, + 0x00, 0x68, 0xd0, 0x80, 0x6e, 0x82, 0x00, 0xef, + 0xd0, 0x8c, 0x6e, 0x82, 0x00, 0x06, 0xd0, 0x11, + 0xa0, 0x38, 0x80, 0x3f, 0x08, 0x20, 0xd0, 0x40, + 0x10, 0x48, 0xa0, 0x4a, 0xa0, 0x5b, 0x0c, 0x20, + 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0xa0, 0x0a, + 0x90, 0x4d, 0x0f, 0xff, 0xd8, 0x1f, 0x40, 0x40, + 0xa0, 0x4d, 0x80, 0x0a, 0x80, 0x07, 0x80, 0x1b, + 0x80, 0x27, 0x00, 0x60, 0xd0, 0x00, 0xa0, 0x09, + 0x80, 0x28, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, + 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, + 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, + 0xd0, 0x00, 0xa0, 0x29, 0x80, 0x2b, 0x02, 0x30, + 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb0, + 0xd0, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30, + 0xd0, 0x01, 0xa0, 0x38, 0x00, 0xea, 0xd0, 0x00, + 0xd0, 0x4e, 0x0f, 0x0b, 0x70, 0x40, 0x00, 0x06, + 0x00, 0x21, 0xd0, 0x88, 0x00, 0xe1, 0xd0, 0x60, + 0x60, 0x81, 0x00, 0x2b, 0xd0, 0x80, 0x00, 0xe0, + 0xd0, 0x6c, 0x60, 0x81, 0xb0, 0x7c, 0x00, 0x27, + 0xd0, 0xa0, 0x60, 0x81, 0xb0, 0x7c, 0xd0, 0x82, + 0x60, 0x81, 0xb0, 0x7c, 0xd0, 0x85, 0x60, 0x81, + 0xb0, 0x7c, 0x03, 0xaa, 0xd0, 0x98, 0x60, 0x81, + 0xb0, 0x7c, 0x6e, 0x81, 0x00, 0x27, 0xd0, 0x40, + 0x6e, 0x81, 0xb0, 0x7c, 0x6e, 0x81, 0xb0, 0x7c, + 0x6e, 0x81, 0x00, 0x27, 0xd1, 0x90, 0x6e, 0x86, + 0x00, 0x21, 0xd1, 0xb8, 0x6e, 0x86, 0x00, 0x66, + 0xd1, 0xa0, 0xd0, 0x00, 0x01, 0x26, 0xd0, 0x58, + 0x30, 0x01, 0x60, 0x06, 0x00, 0xed, 0xd1, 0xbc, + 0x6e, 0x86, 0x00, 0xec, 0xd1, 0xb8, 0x6e, 0x86, + 0xb1, 0x84, 0x6e, 0x86, 0x00, 0xee, 0xd1, 0x84, + 0x70, 0x46, 0x00, 0x65, 0xd1, 0x94, 0x60, 0x46, + 0x00, 0x64, 0xd1, 0xbc, 0x6e, 0x86, 0x00, 0x65, + 0xd1, 0x80, 0x6e, 0x86, 0xb1, 0xbc, 0x6e, 0x86, + 0xb1, 0xbc, 0x6e, 0x86, 0x00, 0xed, 0xd1, 0xa8, + 0x6e, 0x86, 0xd0, 0x0e, 0xb1, 0xbc, 0x60, 0x06, + 0xb1, 0xbc, 0x60, 0x06, 0x00, 0x65, 0xd1, 0xa4, + 0x60, 0x06, 0x00, 0x28, 0xd1, 0xa4, 0x6e, 0x86, + 0x00, 0x27, 0xd1, 0x98, 0x6e, 0x86, 0x00, 0x64, + 0xd1, 0xa4, 0x6e, 0x86, 0xd2, 0x01, 0x00, 0x64, + 0xd0, 0x60, 0x62, 0x01, 0x00, 0x64, 0xd1, 0x80, + 0x70, 0x46, 0x6e, 0x86, 0x00, 0xef, 0xd1, 0x98, + 0x70, 0x86, 0x08, 0x20, 0xd0, 0xcf, 0x30, 0xc1, + 0xea, 0x42, 0xd0, 0x81, 0x00, 0x21, 0xd1, 0xa8, + 0x60, 0x86, 0x00, 0xed, 0xd1, 0xa0, 0x6e, 0xc6, + 0x00, 0x65, 0xd1, 0x98, 0x6e, 0xc6, 0x00, 0x22, + 0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 0x00, 0xc6, + 0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, 0x50, 0x00, + 0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, 0x00, 0x64, + 0xd0, 0x60, 0x70, 0xc1, 0x00, 0xec, 0xd0, 0x40, + 0x71, 0x81, 0xb0, 0x7c, 0x71, 0xc1, 0xc0, 0x87, + 0x30, 0x86, 0xf9, 0x83, 0x10, 0xee, 0xe9, 0x76, + 0x10, 0xe1, 0xe9, 0x76, 0xe2, 0x57, 0x00, 0x63, + 0xd0, 0xbf, 0x72, 0x06, 0xb1, 0xbc, 0x41, 0x82, + 0x02, 0x1b, 0xe9, 0x8d, 0x72, 0x86, 0xb1, 0xbc, + 0x41, 0x82, 0xd0, 0x75, 0x30, 0x48, 0xe9, 0xfe, + 0xb0, 0x7f, 0xea, 0x00, 0x02, 0x1c, 0xe9, 0x96, + 0x15, 0xa3, 0xea, 0x57, 0x10, 0xf0, 0xe9, 0x9a, + 0x10, 0xfa, 0xf9, 0xa1, 0x15, 0xa3, 0xea, 0x57, + 0x00, 0x21, 0xd0, 0x4c, 0x70, 0x41, 0x10, 0x61, + 0xfa, 0x57, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x40, + 0xd0, 0x85, 0x40, 0x42, 0x60, 0x40, 0x00, 0x64, + 0xd0, 0x64, 0x62, 0x01, 0x12, 0x2b, 0xe9, 0xeb, + 0x12, 0x3b, 0xe9, 0xd5, 0x00, 0xec, 0xd0, 0x40, + 0x61, 0x81, 0x12, 0x2d, 0xe9, 0xbf, 0x12, 0x30, + 0xe9, 0xd4, 0x12, 0x36, 0xe9, 0xd4, 0x12, 0x3a, + 0xe9, 0xd4, 0xd0, 0x62, 0x30, 0x48, 0xe9, 0xf2, + 0x12, 0x2e, 0xe9, 0xf9, 0xe1, 0x76, 0x00, 0xed, + 0xd0, 0x08, 0x70, 0x40, 0xd0, 0x85, 0x40, 0x42, + 0x60, 0x40, 0xb0, 0x08, 0x00, 0x21, 0xd0, 0x41, + 0x60, 0x40, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, + 0xf2, 0x5a, 0x00, 0xed, 0xd0, 0x20, 0xd0, 0x41, + 0x60, 0x40, 0x10, 0xe1, 0xea, 0x3a, 0xe2, 0x57, + 0xe2, 0x53, 0x10, 0xee, 0xf9, 0xe9, 0x01, 0x46, + 0x82, 0x34, 0x80, 0x3f, 0x97, 0x2e, 0xc7, 0x5c, + 0xa7, 0x66, 0x81, 0x34, 0x80, 0x3f, 0x00, 0x21, + 0xd0, 0x01, 0xa0, 0x38, 0x00, 0xc6, 0x00, 0x21, + 0xd0, 0x15, 0x0b, 0x09, 0x00, 0x4d, 0xb0, 0x01, + 0xed, 0xe5, 0xd2, 0x1a, 0xe1, 0xec, 0xf1, 0x18, + 0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0xd0, 0x4e, + 0x60, 0x46, 0xe2, 0x54, 0xc0, 0x0a, 0x10, 0x06, + 0x52, 0x80, 0x00, 0xed, 0xd0, 0x40, 0x62, 0x81, + 0xe2, 0x53, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, + 0xf2, 0x5a, 0xe1, 0x70, 0x12, 0xa3, 0xf6, 0x57, + 0x15, 0xa1, 0xfa, 0x57, 0x12, 0xa0, 0xea, 0x23, + 0x00, 0x65, 0xd1, 0x1c, 0xd0, 0x75, 0x30, 0x48, + 0xea, 0x0a, 0xb1, 0x3c, 0x71, 0x04, 0x11, 0x20, + 0xfa, 0x11, 0x00, 0xec, 0xd0, 0x40, 0x61, 0x81, + 0xe2, 0x57, 0x12, 0xa1, 0xea, 0x33, 0x00, 0xe2, + 0xd0, 0x60, 0x70, 0x01, 0xb0, 0x7c, 0x70, 0x41, + 0x10, 0x0c, 0x50, 0x40, 0x0c, 0x30, 0xd0, 0x00, + 0x31, 0x01, 0xee, 0x21, 0x21, 0x00, 0xe6, 0x57, + 0xe2, 0x23, 0x31, 0x00, 0xfe, 0x57, 0xd0, 0x75, + 0x30, 0x48, 0xea, 0x28, 0xf2, 0x5a, 0xe2, 0x0d, + 0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0x00, 0x63, + 0xd1, 0x3f, 0xb1, 0xbc, 0x41, 0x84, 0x61, 0x81, + 0xd0, 0x50, 0x60, 0x46, 0xe2, 0x57, 0x00, 0xed, + 0xd0, 0x7c, 0x70, 0x41, 0x08, 0x20, 0xd0, 0x00, + 0x10, 0x08, 0xe2, 0x1c, 0xd2, 0x84, 0x00, 0xed, + 0xd1, 0xa4, 0x62, 0x86, 0xd5, 0x00, 0xb5, 0x01, + 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc7, 0x5e, + 0x97, 0x2e, 0x81, 0x34, 0x80, 0x3f, 0x02, 0xe8, + 0xd0, 0x30, 0xa0, 0x37, 0xa0, 0x38, 0x08, 0x20, + 0xdf, 0x00, 0x80, 0x73, 0x80, 0x3f, 0x00, 0xc6, + 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0xf2, 0x5a, + 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, 0x02, 0x3c, + 0xda, 0x89, 0xe0, 0x46, 0x00, 0x28, 0xd0, 0x64, + 0x70, 0x81, 0x00, 0x22, 0xd0, 0x00, 0x50, 0x80, + 0x60, 0x81, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, + 0x00, 0xed, 0xd1, 0xa4, 0x72, 0x86, 0x00, 0xef, + 0xd1, 0x90, 0x70, 0x46, 0x10, 0x5c, 0x10, 0x65, + 0xed, 0x7d, 0xd0, 0x46, 0xc0, 0x0a, 0x10, 0x40, + 0x60, 0x46, 0x00, 0x22, 0xd0, 0x73, 0x30, 0x54, + 0xe9, 0x8e, 0x12, 0xa4, 0xe9, 0xb5, 0x15, 0x20, + 0xe9, 0xc0, 0xb0, 0x7b, 0xe9, 0xc3, 0xb0, 0x41, + 0xe9, 0xc9, 0xc0, 0x54, 0x10, 0x5c, 0x10, 0x6e, + 0xe9, 0xc6, 0xe1, 0xb5, 0x00, 0x28, 0xd1, 0xb0, + 0xd0, 0x00, 0x60, 0x06, 0x12, 0xa4, 0xf9, 0xb2, + 0x00, 0xed, 0xd1, 0x9c, 0x62, 0x86, 0xd2, 0x80, + 0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86, 0xd0, 0x02, + 0x00, 0xec, 0xd1, 0xbc, 0x60, 0x06, 0x00, 0x64, + 0xd1, 0xa0, 0x72, 0x06, 0x12, 0x21, 0xf9, 0xa6, + 0xd2, 0x0d, 0x62, 0x06, 0x00, 0xed, 0xd1, 0xa0, + 0x61, 0x86, 0xd0, 0x0e, 0x00, 0xed, 0xd1, 0xac, + 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, 0x00, 0x65, + 0xd1, 0xa4, 0x60, 0x06, 0x01, 0x7e, 0xd2, 0x31, + 0xe1, 0xcb, 0x01, 0x46, 0x90, 0x49, 0x00, 0x60, + 0xd0, 0x00, 0x50, 0x40, 0xa0, 0x49, 0x80, 0x3f, + 0x00, 0xc6, 0x0c, 0x09, 0x05, 0x0d, 0xe1, 0x70, + 0x01, 0xbe, 0xde, 0x41, 0xe1, 0xcb, 0x01, 0xbb, + 0xd8, 0x10, 0xe1, 0xcb, 0x01, 0xbd, 0xd8, 0x0b, + 0xe1, 0xcb, 0x03, 0xb8, 0xda, 0x10, 0x01, 0x46, + 0x90, 0x49, 0x00, 0x60, 0xd1, 0x00, 0x50, 0x44, + 0x30, 0x44, 0xa0, 0x49, 0x80, 0x3f, 0x00, 0xc6, + 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x01, 0xfa, 0xd2, 0x3d, 0x00, 0x25, 0xdc, 0xd8, + 0xf0, 0x4a, 0x00, 0x26, 0xd0, 0x18, 0xd0, 0x40, + 0x60, 0x40, 0x00, 0x28, 0xd0, 0x24, 0x70, 0x40, + 0xd0, 0x82, 0x50, 0x42, 0x60, 0x40, 0x00, 0xec, + 0xd0, 0xa4, 0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x81, + 0x00, 0xec, 0xd1, 0x98, 0xd0, 0x41, 0x60, 0x46, + 0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x8e, 0xd0, 0x40, + 0x60, 0x46, 0xe1, 0x81, 0xd0, 0x40, 0x00, 0xe6, + 0xd0, 0x10, 0x60, 0x40, 0xb0, 0x3c, 0x60, 0x40, + 0xb0, 0x3c, 0x60, 0x40, 0xd0, 0xe0, 0x00, 0xea, + 0xd0, 0x40, 0x00, 0xe8, 0xd0, 0x82, 0x01, 0x46, + 0x70, 0x01, 0xb0, 0x7c, 0x60, 0x02, 0xb0, 0xbc, + 0x00, 0x06, 0x00, 0xc6, 0xb0, 0xc1, 0xed, 0x9b, + 0x80, 0x49, 0xd6, 0x44, 0xd5, 0x43, 0x00, 0xe0, + 0xd1, 0x80, 0x00, 0x06, 0x0b, 0x09, 0x01, 0x0d, + 0x0b, 0x09, 0x61, 0x06, 0xb1, 0xbc, 0x01, 0x4d, + 0x09, 0x09, 0x61, 0x46, 0xb1, 0xbc, 0x00, 0xcd, + 0x09, 0x09, 0x10, 0xe4, 0xed, 0xb8, 0x60, 0xc6, + 0xb1, 0xbc, 0x00, 0xcd, 0x60, 0xc6, 0x00, 0xed, + 0xd0, 0x04, 0x70, 0x00, 0x10, 0x20, 0xf9, 0xd3, + 0x10, 0xe3, 0xe9, 0xc4, 0x10, 0xe6, 0xf9, 0xd3, + 0x01, 0x46, 0x90, 0x10, 0x00, 0x20, 0xd0, 0x44, + 0x50, 0x40, 0x00, 0xc6, 0xa0, 0x50, 0x00, 0xa0, + 0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 0x00, 0xed, + 0xd1, 0xa4, 0xd0, 0x04, 0x60, 0x06, 0x00, 0xee, + 0xd1, 0xac, 0x73, 0x86, 0x10, 0xe3, 0xe5, 0xde, + 0xe9, 0xe3, 0x00, 0xe7, 0xd0, 0x40, 0x00, 0xae, + 0xd0, 0xbb, 0xe1, 0xe7, 0x01, 0x24, 0xd0, 0x6b, + 0x00, 0xea, 0xd0, 0xa6, 0xe1, 0xe7, 0x01, 0x21, + 0xd0, 0x7b, 0x00, 0xe8, 0xd0, 0x90, 0x13, 0xa0, + 0xf9, 0xea, 0xc0, 0x42, 0x00, 0xe0, 0xd1, 0xa8, + 0x60, 0x46, 0xb1, 0x98, 0x0b, 0xc9, 0x00, 0x4d, + 0x09, 0x09, 0x10, 0x44, 0x00, 0x8d, 0x20, 0x42, + 0x10, 0x5f, 0x60, 0x46, 0xb1, 0xb8, 0x00, 0x90, + 0xea, 0x17, 0x0a, 0x89, 0x00, 0x8d, 0x60, 0x86, + 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, + 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, + 0x10, 0x60, 0xea, 0x0b, 0x00, 0xe8, 0xd1, 0x80, + 0xf2, 0xb0, 0x10, 0x60, 0xfa, 0x17, 0x08, 0x49, + 0x00, 0xe0, 0xd1, 0xa4, 0x00, 0x4d, 0x60, 0x46, + 0x10, 0x60, 0xea, 0x1b, 0x00, 0xe9, 0xd1, 0x80, + 0xf2, 0xb0, 0x10, 0x60, 0xea, 0x1b, 0x00, 0xe0, + 0xd1, 0x88, 0xd0, 0x40, 0x60, 0x46, 0xd0, 0x00, + 0x00, 0xe0, 0xd1, 0xa8, 0x70, 0x46, 0x00, 0xef, + 0xd1, 0x9c, 0x70, 0x86, 0xb0, 0xb0, 0xee, 0x25, + 0xd0, 0x81, 0x00, 0x90, 0xea, 0x28, 0x20, 0x01, + 0x10, 0x41, 0x10, 0x9f, 0x10, 0xa0, 0xee, 0x25, + 0x10, 0x1c, 0x00, 0x65, 0xd1, 0xa8, 0x60, 0x06, + 0x01, 0xb4, 0xd4, 0x3a, 0xe0, 0x46, 0x50, 0x00, + 0x02, 0x31, 0xdc, 0x13, 0x00, 0x27, 0xdc, 0xd8, + 0xf0, 0x4a, 0x0c, 0x09, 0x00, 0x06, 0x05, 0x0d, + 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xe9, 0xea, + 0xb0, 0x7d, 0xfa, 0x05, 0x09, 0x09, 0x01, 0xcd, + 0x11, 0xe1, 0xf9, 0xc7, 0x80, 0x09, 0x80, 0x27, + 0x0a, 0x09, 0xd6, 0x45, 0x00, 0xe1, 0xd1, 0xa0, + 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, + 0x00, 0x4d, 0x60, 0x46, 0x00, 0x50, 0xe9, 0x91, + 0xd4, 0x01, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d, + 0x60, 0x46, 0x00, 0xe0, 0xd1, 0x80, 0x08, 0x89, + 0x00, 0x4d, 0x08, 0x89, 0x10, 0x4c, 0x71, 0x06, + 0x21, 0x01, 0x61, 0x06, 0xb1, 0xbc, 0x00, 0x4d, + 0x0b, 0x49, 0x10, 0x4c, 0x71, 0x46, 0x21, 0x41, + 0x61, 0x46, 0xb1, 0xb0, 0x00, 0x4d, 0x10, 0x5f, + 0x60, 0x46, 0xb1, 0xbc, 0x0a, 0x09, 0x00, 0x4d, + 0x10, 0x4a, 0x70, 0x86, 0x20, 0x81, 0x60, 0x86, + 0x00, 0xe1, 0xd1, 0xac, 0x08, 0x49, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x09, 0x49, 0x00, 0x8d, + 0x60, 0x86, 0xc0, 0x02, 0x00, 0xe0, 0xd1, 0xa8, + 0x70, 0xc6, 0x10, 0xc0, 0xd0, 0x20, 0x30, 0x01, + 0x10, 0xc0, 0x60, 0xc6, 0xe1, 0x75, 0x11, 0xe2, + 0xf9, 0x75, 0x00, 0xe2, 0xd1, 0x80, 0x08, 0xc9, + 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, + 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x10, 0x60, + 0xf9, 0xd7, 0xb1, 0xb4, 0xe1, 0xde, 0xd2, 0x03, + 0x0a, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0xb2, 0x01, 0xf9, 0xd8, 0x0b, 0xc9, 0x00, 0x4d, + 0x10, 0x49, 0x10, 0x56, 0x60, 0x46, 0xb1, 0xbc, + 0x0b, 0x89, 0x00, 0x4d, 0x10, 0x4a, 0x10, 0x56, + 0x60, 0x46, 0xe1, 0x75, 0x0b, 0x2c, 0xd4, 0x40, + 0xf3, 0xb0, 0xe1, 0x77, 0x00, 0xe0, 0xd0, 0x6c, + 0x00, 0xe0, 0xd1, 0x80, 0xd0, 0x0a, 0xf1, 0xfe, + 0x00, 0xe1, 0xd1, 0xb0, 0xd0, 0x02, 0xf1, 0xfe, + 0x00, 0xe0, 0xd1, 0x80, 0x76, 0x86, 0xb1, 0xbc, + 0x73, 0x46, 0xe2, 0x3c, 0x70, 0x81, 0x60, 0x86, + 0xb1, 0xbc, 0xb0, 0x7c, 0xb0, 0x01, 0xed, 0xfe, + 0x0f, 0xc5, 0x00, 0xe1, 0xd1, 0xa0, 0x70, 0x46, + 0xd0, 0x8f, 0x40, 0x42, 0x00, 0x25, 0xd0, 0xe0, + 0x00, 0x24, 0xd1, 0x20, 0x10, 0x6a, 0xea, 0x1e, + 0x00, 0x66, 0xd0, 0xe0, 0x00, 0x62, 0xd1, 0x00, + 0x10, 0x66, 0xea, 0x1e, 0x00, 0x6e, 0xd0, 0xc0, + 0x10, 0x64, 0xea, 0x1e, 0x00, 0x2b, 0xd0, 0xd0, + 0x00, 0x29, 0xd1, 0x00, 0x00, 0xe0, 0xd1, 0x80, + 0x76, 0x86, 0x16, 0xa0, 0xe9, 0xee, 0x30, 0xda, + 0xe5, 0xee, 0xb1, 0xbc, 0x73, 0x46, 0x13, 0x60, + 0xe9, 0xee, 0x31, 0x0d, 0xe5, 0xee, 0xd0, 0x82, + 0xb1, 0xbc, 0x70, 0x46, 0x10, 0x60, 0xe9, 0xee, + 0xb0, 0x81, 0xee, 0x2c, 0x00, 0xe0, 0xd0, 0x40, + 0x00, 0xe0, 0xd1, 0xac, 0xd0, 0x0a, 0xf1, 0xfe, + 0x00, 0xe1, 0xd0, 0x70, 0xd0, 0x02, 0xf1, 0xfe, + 0x00, 0xec, 0xd1, 0x98, 0xd0, 0x40, 0x60, 0x46, + 0x00, 0xe0, 0xd0, 0x8c, 0x70, 0x82, 0x00, 0x21, + 0xd0, 0x70, 0x60, 0x81, 0xd0, 0x40, 0x00, 0x25, + 0xd0, 0x20, 0x30, 0x1a, 0xfa, 0x50, 0x00, 0x23, + 0xd0, 0x30, 0x30, 0x0d, 0xfa, 0x50, 0xd0, 0x41, + 0x00, 0x21, 0xd1, 0x84, 0x60, 0x46, 0xb6, 0xb1, + 0x16, 0x9c, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, + 0x02, 0x31, 0xdc, 0x13, 0x00, 0x27, 0xdc, 0xd8, + 0xf0, 0x4a, 0x00, 0xec, 0xd0, 0xa8, 0x70, 0xc2, + 0x10, 0xe0, 0xf9, 0x77, 0x00, 0xec, 0xd1, 0x9c, + 0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0, + 0xe9, 0x84, 0xd0, 0x40, 0x60, 0x46, 0xe1, 0x77, + 0x0b, 0x49, 0x00, 0xe2, 0xd1, 0xa0, 0x00, 0x4d, + 0x10, 0x5f, 0x00, 0x6f, 0xd0, 0xff, 0x40, 0x43, + 0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x09, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d, + 0x60, 0x46, 0x10, 0x61, 0xf9, 0x9b, 0xd3, 0xc2, + 0x00, 0xec, 0xd1, 0xbc, 0x63, 0xc6, 0x0c, 0x09, + 0x90, 0x4d, 0x10, 0x60, 0xe5, 0x9c, 0x00, 0x06, + 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, + 0xf9, 0xa9, 0x0b, 0xa0, 0xd4, 0x40, 0xf3, 0xb0, + 0xe1, 0xa0, 0x00, 0xec, 0xd1, 0x9c, 0xd0, 0x40, + 0x60, 0x46, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, + 0x0b, 0x09, 0x00, 0x4d, 0x0b, 0x09, 0x00, 0x4d, + 0x0a, 0x09, 0x01, 0x4d, 0x0a, 0x09, 0x00, 0x4d, + 0x01, 0x59, 0xe9, 0x96, 0x09, 0x09, 0x00, 0x4d, + 0x10, 0x5f, 0x10, 0x61, 0xf9, 0x96, 0x09, 0x09, + 0x01, 0x4d, 0x11, 0x5f, 0x0b, 0xc9, 0x00, 0x4d, + 0xc0, 0x01, 0x10, 0x5f, 0x11, 0x4e, 0x51, 0x41, + 0x08, 0x49, 0x00, 0x4d, 0x0b, 0xc9, 0x10, 0x0f, + 0x00, 0x4d, 0x50, 0x01, 0x00, 0xed, 0xd1, 0xb6, + 0x01, 0x46, 0x00, 0x06, 0xa0, 0x3c, 0xa1, 0x7d, + 0x60, 0x06, 0x00, 0xc6, 0xd5, 0x00, 0xb5, 0x01, + 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, + 0x00, 0xec, 0xd0, 0xac, 0x70, 0xc2, 0x10, 0xe0, + 0xf9, 0x70, 0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x41, + 0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x7f, + 0xd0, 0x40, 0x60, 0x46, 0xe1, 0x70, 0x0a, 0x89, + 0x0b, 0xcd, 0x00, 0xe3, 0xd1, 0x80, 0x6b, 0xc6, + 0x08, 0xc9, 0x05, 0x8d, 0x15, 0xa3, 0xee, 0x6e, + 0x15, 0xa0, 0xea, 0x6e, 0x90, 0x4d, 0xd0, 0x9f, + 0xd0, 0xdf, 0x40, 0x81, 0x10, 0x55, 0x40, 0xc1, + 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc8, 0x1d, + 0x81, 0x34, 0x80, 0x3f, 0x00, 0xc6, 0xd1, 0x23, + 0x31, 0x03, 0x11, 0x02, 0x38, 0x04, 0xb0, 0x8d, + 0x10, 0x9d, 0x28, 0x02, 0xc0, 0x60, 0x00, 0x65, + 0xd1, 0x94, 0x71, 0x06, 0x68, 0x06, 0x30, 0x44, + 0x00, 0xed, 0xd1, 0xa8, 0x70, 0x06, 0x10, 0x20, + 0xe9, 0xb0, 0x00, 0xee, 0xd0, 0xc0, 0x70, 0xc3, + 0x20, 0x43, 0xb0, 0x01, 0xf9, 0xac, 0x60, 0x06, + 0x00, 0x64, 0xd1, 0xbc, 0x71, 0x06, 0xc0, 0x04, + 0x21, 0x01, 0x61, 0x06, 0x10, 0x20, 0xf5, 0xbb, + 0x11, 0x20, 0xe5, 0xbb, 0xb0, 0x41, 0x00, 0x65, + 0xd1, 0x80, 0x71, 0x06, 0x21, 0x01, 0x61, 0x06, + 0x00, 0xed, 0xd1, 0xac, 0x71, 0x06, 0x15, 0xa1, + 0xe9, 0xcb, 0xb1, 0x3f, 0x61, 0x06, 0x15, 0xa3, + 0xf9, 0xd6, 0xd0, 0xbf, 0xe1, 0xd3, 0xd0, 0x40, + 0x60, 0x46, 0xb1, 0xbc, 0x70, 0x86, 0x61, 0x06, + 0x31, 0x02, 0xe5, 0xd3, 0x20, 0x84, 0x00, 0x65, + 0xd1, 0xa4, 0x60, 0x86, 0xd9, 0x40, 0x00, 0xec, + 0xd1, 0x94, 0x79, 0x06, 0xb1, 0x84, 0x78, 0xc6, + 0xc0, 0x63, 0x30, 0x64, 0xe9, 0xf8, 0x00, 0xa7, + 0xd0, 0xff, 0x7a, 0x63, 0x00, 0x65, 0xd0, 0x00, + 0x71, 0x00, 0x31, 0x29, 0xe5, 0xf8, 0xc0, 0x63, + 0xc8, 0xc1, 0xb0, 0x78, 0x40, 0x43, 0xc0, 0xa4, + 0x30, 0x81, 0xe9, 0xf2, 0x7a, 0x41, 0x31, 0x29, + 0xf5, 0xe8, 0x21, 0x29, 0x61, 0x00, 0xb8, 0xfc, + 0x79, 0x63, 0xb8, 0xfc, 0x48, 0xc3, 0x68, 0xc6, + 0x00, 0xed, 0xd1, 0xb8, 0x69, 0x46, 0x80, 0x28, + 0x0b, 0xc9, 0x00, 0x4d, 0x08, 0x49, 0x10, 0x41, + 0x00, 0xe3, 0xd1, 0x84, 0x00, 0x8d, 0x20, 0x42, + 0x60, 0x46, 0x00, 0xee, 0xd1, 0xa4, 0x70, 0x86, + 0x10, 0xa1, 0xee, 0x18, 0xe6, 0x6b, 0x90, 0x86, + 0x00, 0x90, 0xea, 0x18, 0x00, 0xed, 0xd0, 0x1c, + 0x70, 0x80, 0xb0, 0x81, 0xe6, 0x6b, 0x60, 0x80, + 0xb1, 0xa8, 0x70, 0x86, 0x10, 0xa0, 0xfa, 0x6b, + 0x00, 0x21, 0xd0, 0x38, 0x70, 0x80, 0x10, 0xa0, + 0xfa, 0x6b, 0x0f, 0xef, 0xd0, 0xbf, 0x30, 0x81, + 0xfa, 0x22, 0x60, 0x00, 0x08, 0x20, 0xd0, 0x00, + 0x5f, 0x00, 0x15, 0xa3, 0xea, 0x6b, 0x00, 0xee, + 0xd1, 0x80, 0x79, 0x46, 0x00, 0xf8, 0xd0, 0x00, + 0xc4, 0x40, 0x00, 0xe3, 0xd1, 0x84, 0x78, 0x46, + 0x0f, 0xef, 0xd0, 0x3f, 0x30, 0x21, 0xea, 0x48, + 0x00, 0xe0, 0xd1, 0x90, 0x78, 0x06, 0xc0, 0xa1, + 0x18, 0x43, 0x28, 0x42, 0x18, 0x43, 0x28, 0x42, + 0x18, 0x1e, 0xd8, 0x80, 0x08, 0x11, 0xea, 0x41, + 0x28, 0xa1, 0x18, 0x01, 0x18, 0x5f, 0x18, 0x60, + 0xee, 0x3e, 0xc0, 0x51, 0x30, 0x62, 0xee, 0x4e, + 0xc8, 0x91, 0x18, 0x9f, 0x00, 0x21, 0xd1, 0xb8, + 0xd0, 0x01, 0x60, 0x06, 0x00, 0xef, 0xd0, 0x10, + 0xd0, 0x72, 0x60, 0x40, 0x01, 0x46, 0x82, 0x34, + 0x80, 0x3f, 0xc8, 0xdc, 0xc9, 0x1d, 0x81, 0x34, + 0x80, 0x3f, 0x00, 0xc6, 0x38, 0xe4, 0xee, 0x5e, + 0xea, 0x52, 0x28, 0xe5, 0x01, 0x46, 0x90, 0x6d, + 0x28, 0xc1, 0x00, 0xc6, 0x38, 0xe2, 0xf6, 0x6b, + 0xdb, 0x08, 0xf1, 0x16, 0xf1, 0x18, 0x00, 0x21, + 0xd1, 0xb4, 0x61, 0x86, 0xe2, 0x52, 0x01, 0xf7, + 0xd0, 0x19, 0xe0, 0x46, 0xd5, 0x00, 0xb5, 0x01, + 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, + 0x02, 0x31, 0xdc, 0x13, 0x00, 0x27, 0xdc, 0xd8, + 0xf0, 0x4a, 0xdb, 0x09, 0x00, 0xe3, 0xd0, 0x1c, + 0x6b, 0x00, 0xda, 0xc1, 0x00, 0xe6, 0xd1, 0x98, + 0x70, 0x06, 0xb1, 0x84, 0x60, 0x06, 0xb1, 0x84, + 0x60, 0x06, 0x05, 0x9f, 0xe9, 0x9f, 0x08, 0x49, + 0xd1, 0x17, 0x46, 0x44, 0x00, 0x4d, 0x10, 0x43, + 0x26, 0x41, 0x08, 0xc9, 0x05, 0xcd, 0xb5, 0xc1, + 0xe5, 0xcc, 0xc0, 0x57, 0x15, 0xc6, 0x25, 0xc1, + 0x15, 0xa3, 0xf9, 0x9f, 0x08, 0x49, 0xd1, 0x0f, + 0x46, 0x44, 0x00, 0x4d, 0x10, 0x44, 0x26, 0x41, + 0x08, 0xc9, 0x06, 0x0d, 0xb6, 0x01, 0xe5, 0xcc, + 0xc0, 0x58, 0x16, 0x06, 0x26, 0x01, 0x08, 0x49, + 0x00, 0x4d, 0x10, 0x60, 0xe9, 0xa6, 0x0a, 0x09, + 0x00, 0x4d, 0xe1, 0x9f, 0x0c, 0x09, 0x90, 0x4d, + 0x10, 0x60, 0xe5, 0xa7, 0x00, 0x06, 0x05, 0x0d, + 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xf9, 0xb3, + 0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0xab, 0xb0, 0x7d, + 0xf9, 0xb8, 0x02, 0x34, 0xd2, 0x44, 0xe0, 0x46, + 0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x40, 0x60, 0x46, + 0x02, 0x3c, 0xda, 0x89, 0x00, 0xec, 0xd1, 0x80, + 0x70, 0x46, 0xb1, 0xbc, 0x70, 0x86, 0x30, 0x81, + 0xe8, 0x46, 0x15, 0x63, 0xe9, 0xc9, 0x05, 0x5e, + 0xe8, 0x46, 0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, + 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, + 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0xcc, 0xc0, 0xcd, 0x01, 0xcd, 0x42, 0xcd, 0x83, + 0x00, 0xa0, 0xd0, 0x01, 0xa0, 0x38, 0xc8, 0x7f, + 0xc8, 0x06, 0xb1, 0xbe, 0xf3, 0x96, 0xc8, 0x80, + 0xf3, 0x92, 0x58, 0x80, 0xf3, 0x96, 0xc8, 0xc0, + 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x58, 0xc0, + 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 0x59, 0x40, + 0xc0, 0x22, 0xc0, 0x65, 0xc0, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x59, 0x00, + 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x96, 0xc9, 0x80, + 0xf3, 0x92, 0x59, 0x40, 0xf3, 0x96, 0xc9, 0xc0, + 0xf3, 0x92, 0x58, 0x80, 0xc0, 0x23, 0xc0, 0x62, + 0xd0, 0x88, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, + 0xc8, 0xc0, 0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, + 0xc8, 0x80, 0xf3, 0x92, 0x59, 0xc0, 0xc0, 0x24, + 0xc0, 0x67, 0xd0, 0x90, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x59, 0x80, + 0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x96, 0xca, 0x00, + 0xf3, 0x92, 0x59, 0xc0, 0xf3, 0x96, 0xca, 0x40, + 0xf3, 0x92, 0x59, 0x00, 0xc0, 0x25, 0xc0, 0x64, + 0xd0, 0x98, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, + 0xc9, 0x40, 0xf3, 0x92, 0x58, 0x80, 0xf3, 0x96, + 0xc9, 0x00, 0xf3, 0x92, 0x59, 0x00, 0xc0, 0x23, + 0xc0, 0x64, 0xd0, 0x84, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, 0x59, 0x40, + 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x5a, 0x40, + 0xc0, 0x26, 0xc0, 0x69, 0xd0, 0xa0, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, + 0x5a, 0x00, 0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, + 0x5a, 0x40, 0xf3, 0x96, 0xca, 0x80, 0xf3, 0x92, + 0x59, 0x80, 0xc0, 0x27, 0xc0, 0x66, 0xd0, 0xa8, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0xc0, + 0xf3, 0x92, 0x59, 0x00, 0xf3, 0x96, 0xc9, 0x80, + 0xf3, 0x92, 0x58, 0xc0, 0xc0, 0x22, 0xc0, 0x63, + 0xd0, 0x8c, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92, + 0x59, 0x80, 0xc0, 0x25, 0xc0, 0x66, 0xd0, 0x94, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0x80, + 0xf3, 0x92, 0x59, 0xc0, 0xf3, 0x96, 0xc8, 0xc0, + 0xf3, 0x92, 0x5a, 0x80, 0xc0, 0x28, 0xc0, 0x6a, + 0xd0, 0xb0, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, + 0xc9, 0x40, 0xf3, 0x92, 0x59, 0x40, 0xc0, 0x29, + 0xc0, 0x65, 0xd0, 0xb8, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x58, 0xc0, + 0xf3, 0x96, 0xca, 0x00, 0xf3, 0x92, 0x58, 0x80, + 0xc0, 0x24, 0xc0, 0x62, 0xd0, 0x9c, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x92, 0x5a, 0x00, 0xc0, 0x27, + 0xc0, 0x68, 0xd0, 0xa4, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xca, 0x80, 0xf3, 0x92, 0x59, 0x80, + 0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, 0x5a, 0x40, + 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 0x5a, 0x80, + 0xc0, 0x23, 0xc0, 0x6a, 0xd0, 0xac, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x92, 0x59, 0x40, 0xc0, 0x26, + 0xc0, 0x65, 0xd0, 0xb4, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x59, 0x00, + 0xc0, 0x29, 0xc0, 0x64, 0xd0, 0xbc, 0x20, 0x86, + 0xf3, 0x9a, 0xc0, 0x33, 0xc0, 0x74, 0xc0, 0xb5, + 0xc0, 0xf6, 0xd0, 0x40, 0x00, 0xa0, 0xd8, 0x00, + 0xa8, 0x38, 0x08, 0x45, 0x0a, 0x09, 0x00, 0x0d, + 0x0f, 0xc5, 0x50, 0x00, 0x0a, 0x09, 0x00, 0x0d, + 0x10, 0x08, 0x0f, 0xc5, 0x01, 0x46, 0x00, 0x06, + 0xa0, 0x7c, 0xa0, 0x3d, 0x60, 0x42, 0x00, 0xc6, + 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x14, 0x48, 0xd0, 0x81, 0x00, 0xef, 0xd1, 0x8c, + 0x71, 0x46, 0x11, 0x60, 0xfb, 0xb1, 0x60, 0x86, + 0x71, 0x46, 0x31, 0x42, 0xfb, 0xb1, 0x00, 0xec, + 0xd1, 0x0c, 0x74, 0x84, 0x00, 0x68, 0xd0, 0x80, + 0x70, 0x02, 0x10, 0x20, 0xfb, 0xc4, 0xc4, 0x82, + 0xc4, 0xd2, 0xb4, 0xfc, 0xda, 0x00, 0xda, 0x4f, + 0x0a, 0x09, 0x0f, 0xef, 0xd0, 0x3f, 0xb4, 0x7f, + 0xca, 0x29, 0x1a, 0x18, 0x4a, 0x00, 0x1a, 0x48, + 0x00, 0x8d, 0x2a, 0x42, 0xd0, 0x03, 0x40, 0x11, + 0xfb, 0xe3, 0xb4, 0x44, 0x00, 0xa0, 0xd0, 0xc0, + 0x30, 0xd3, 0xff, 0xe3, 0xb4, 0xfe, 0x01, 0x46, + 0x00, 0x06, 0xaa, 0x3d, 0xaa, 0x7c, 0x6a, 0x53, + 0x00, 0xc6, 0xb4, 0xfe, 0xb4, 0x7c, 0x1a, 0x61, + 0xfb, 0xc8, 0xb4, 0x43, 0x00, 0xef, 0xd0, 0x3f, + 0x40, 0x11, 0xeb, 0xf7, 0xb0, 0xc4, 0xe7, 0xf7, + 0xeb, 0xee, 0x61, 0x53, 0x64, 0x52, 0x64, 0xc4, + 0x00, 0x28, 0xd1, 0x24, 0x70, 0x04, 0x00, 0x21, + 0xd0, 0x80, 0x50, 0x02, 0x60, 0x04, 0x61, 0x46, + 0x0a, 0x09, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, + 0x02, 0x31, 0xdc, 0x13, 0x00, 0x27, 0xdc, 0xd8, + 0xf0, 0x4a, 0x01, 0xfa, 0xd2, 0x3d, 0x00, 0x25, + 0xdc, 0xd8, 0xf0, 0x4a, 0x09, 0x09, 0x01, 0xcd, + 0x11, 0xe8, 0xf9, 0xe2, 0x00, 0xe3, 0xd1, 0x9c, + 0x09, 0x09, 0x05, 0xcd, 0xb5, 0xc1, 0x09, 0x09, + 0x00, 0x4d, 0xb0, 0x41, 0x10, 0x46, 0x25, 0xc1, + 0x09, 0x09, 0x06, 0x0d, 0xb6, 0x01, 0x09, 0x09, + 0x00, 0x4d, 0x08, 0x89, 0xb0, 0x41, 0x10, 0x46, + 0x26, 0x01, 0x00, 0x8d, 0x08, 0x89, 0x10, 0x82, + 0xd0, 0x04, 0xc0, 0x55, 0x00, 0x40, 0x40, 0x40, + 0x05, 0x4d, 0x08, 0x49, 0x0b, 0x0d, 0xd1, 0x00, + 0x15, 0x63, 0xe9, 0xa2, 0xd1, 0x01, 0x55, 0x41, + 0xdb, 0x01, 0x4b, 0x15, 0xa1, 0x1b, 0x08, 0x89, + 0x00, 0x4d, 0x08, 0x49, 0x10, 0x41, 0xd1, 0x19, + 0x46, 0x44, 0x26, 0x41, 0x00, 0xcd, 0x08, 0x49, + 0x10, 0xc4, 0x00, 0x4d, 0x08, 0x49, 0x10, 0x41, + 0x20, 0x81, 0xa0, 0x89, 0x00, 0x4d, 0x10, 0x43, + 0x20, 0xc1, 0xa0, 0xe8, 0x08, 0x49, 0x00, 0x4d, + 0x1b, 0x03, 0x5b, 0x01, 0xbb, 0x3f, 0x6b, 0x06, + 0x08, 0x49, 0xb1, 0xbc, 0x00, 0x4d, 0x60, 0x46, + 0x08, 0x49, 0xb1, 0xbc, 0x0a, 0xcd, 0x1a, 0xc2, + 0x4a, 0xd9, 0x1a, 0xde, 0x6a, 0xc6, 0x08, 0x49, + 0xb1, 0xbc, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, + 0xea, 0x3e, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x08, 0xc9, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x09, 0xc9, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x0a, 0x09, 0x00, 0x4d, + 0x60, 0x46, 0xe2, 0x3e, 0x11, 0xe3, 0xfa, 0x00, + 0x00, 0xe7, 0xd0, 0xc0, 0xd0, 0x84, 0xb0, 0x81, + 0xe6, 0x3e, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x43, + 0xb0, 0xfc, 0x10, 0x60, 0xe9, 0xe7, 0x10, 0xa3, + 0xf9, 0xf4, 0x00, 0xe8, 0xd1, 0x80, 0xe1, 0xf8, + 0x10, 0xa2, 0xf9, 0xfa, 0x00, 0xe9, 0xd1, 0x80, + 0xf2, 0xb0, 0xe1, 0xe7, 0xd2, 0x3f, 0x0a, 0x09, + 0x00, 0x4d, 0xb2, 0x01, 0xf5, 0xfb, 0xe1, 0xe7, + 0x11, 0xe7, 0xfa, 0x3e, 0xd4, 0x01, 0x00, 0xe1, + 0xd0, 0x24, 0x70, 0x00, 0x10, 0x21, 0xea, 0x0d, + 0x15, 0x63, 0xfa, 0x0d, 0xd4, 0x03, 0x44, 0x2c, + 0xb4, 0x3f, 0x00, 0xe6, 0xd1, 0x90, 0x0b, 0x09, + 0x00, 0x4d, 0x09, 0x49, 0x10, 0x45, 0x00, 0x8d, + 0x50, 0x81, 0xd0, 0x40, 0x10, 0x87, 0x10, 0x98, + 0x30, 0x42, 0xf2, 0x61, 0x60, 0x46, 0xb1, 0xbc, + 0x0b, 0x09, 0x00, 0x0d, 0x09, 0x49, 0x00, 0x0d, + 0xb4, 0x01, 0xfa, 0x0f, 0x00, 0xe6, 0xd0, 0x18, + 0x30, 0x06, 0xe6, 0x29, 0x60, 0x46, 0xb1, 0xbc, + 0xe2, 0x22, 0x00, 0xe0, 0xd1, 0x88, 0x70, 0x46, + 0x10, 0x63, 0xea, 0x39, 0x10, 0x64, 0xea, 0x39, + 0x00, 0xe6, 0xd1, 0x90, 0xd0, 0x00, 0x60, 0x06, + 0xb1, 0xbc, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, + 0xe2, 0x3e, 0x00, 0xef, 0xd1, 0x84, 0x70, 0x46, + 0x10, 0x60, 0xfa, 0x30, 0x0c, 0x09, 0x90, 0x4d, + 0x10, 0x60, 0xe6, 0x3f, 0x00, 0x06, 0x05, 0x0d, + 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xfa, 0x4b, + 0xd4, 0x40, 0xf3, 0xb0, 0xe2, 0x43, 0xb0, 0x7d, + 0xe9, 0x7a, 0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x40, + 0x60, 0x46, 0x02, 0x3c, 0xda, 0x89, 0x00, 0xec, + 0xd1, 0x80, 0x70, 0x46, 0xb1, 0xbc, 0x70, 0x86, + 0x30, 0x81, 0xe8, 0x46, 0x15, 0x63, 0xea, 0x5e, + 0x05, 0x5e, 0xe8, 0x46, 0x01, 0x73, 0xd4, 0x3d, + 0xe0, 0x46, 0x00, 0xe0, 0xd0, 0x00, 0x70, 0xc0, + 0x10, 0xc1, 0x00, 0xe0, 0xd0, 0x08, 0x70, 0x00, + 0x10, 0x23, 0xea, 0x75, 0xc0, 0x83, 0x10, 0x9d, + 0x30, 0xc2, 0x10, 0x9f, 0x30, 0xc2, 0x00, 0xef, + 0xd0, 0xac, 0x70, 0x82, 0x10, 0xa3, 0xea, 0x75, + 0x10, 0xc1, 0xc0, 0x83, 0x30, 0x81, 0xe6, 0x7e, + 0xc0, 0x83, 0x20, 0x81, 0xf6, 0x7f, 0xd0, 0x40, + 0x30, 0x43, 0x0f, 0xc5, 0xc0, 0x43, 0x0f, 0xc5, + 0x00, 0xed, 0xd1, 0xa4, 0x72, 0x86, 0x15, 0xa3, + 0xee, 0x23, 0x15, 0xa1, 0xe6, 0x23, 0x08, 0x20, + 0xd0, 0x00, 0x5f, 0x00, 0xd8, 0xc4, 0x15, 0x63, + 0xe9, 0x7e, 0x48, 0xd5, 0x18, 0xde, 0x18, 0xe0, + 0xe9, 0xc2, 0x00, 0xed, 0xd1, 0xb4, 0x79, 0xc6, + 0x19, 0xe0, 0xe9, 0x8c, 0x00, 0xed, 0xd0, 0x3a, + 0x79, 0xc6, 0x69, 0xc0, 0xd9, 0xc0, 0x69, 0xc6, + 0x00, 0xed, 0xd0, 0x38, 0x79, 0x40, 0x19, 0x60, + 0xe9, 0x98, 0x00, 0x28, 0xd0, 0x24, 0x70, 0x40, + 0x02, 0x20, 0xd0, 0x80, 0x50, 0x42, 0x60, 0x40, + 0x15, 0xa3, 0xe9, 0x9f, 0x00, 0xec, 0xd1, 0xb8, + 0x79, 0xc6, 0x69, 0x46, 0xc9, 0x67, 0x00, 0xec, + 0xd9, 0xb4, 0x70, 0x66, 0x00, 0xec, 0xd1, 0xbc, + 0x70, 0x06, 0x10, 0x20, 0xed, 0xbe, 0x10, 0x60, + 0xe9, 0xc1, 0x00, 0xe0, 0xda, 0xa8, 0x7a, 0xaa, + 0xc0, 0x2a, 0x10, 0x1f, 0x00, 0x22, 0xd0, 0xa0, + 0x70, 0x82, 0x20, 0x6a, 0x00, 0x9f, 0xe9, 0xb5, + 0x20, 0x40, 0x19, 0x60, 0xf9, 0xb8, 0xc9, 0x41, + 0xb0, 0x48, 0x30, 0x65, 0xf5, 0xbd, 0xb0, 0x70, + 0xed, 0xbe, 0xd9, 0x40, 0x00, 0xed, 0xd1, 0xbc, + 0x69, 0x46, 0x69, 0x66, 0x12, 0xa4, 0xea, 0x21, + 0x00, 0xec, 0xd1, 0xbc, 0x73, 0xc6, 0x15, 0xa3, + 0xe9, 0xdf, 0x33, 0xe3, 0xe5, 0xd3, 0xed, 0xd2, + 0x63, 0xc6, 0x00, 0x21, 0xd1, 0xa8, 0x63, 0xc6, + 0x00, 0xed, 0xd1, 0xa0, 0x63, 0xc6, 0x15, 0xa1, + 0xf9, 0xdc, 0x12, 0xa3, 0xe5, 0xe3, 0xd3, 0xc2, + 0x00, 0xec, 0xd1, 0xbc, 0x63, 0xc6, 0xe1, 0xe3, + 0x12, 0xa3, 0xea, 0x21, 0xe1, 0xe3, 0x12, 0xa2, + 0xf6, 0x21, 0x13, 0xe0, 0xfa, 0x21, 0x00, 0xee, + 0xd1, 0x8c, 0x78, 0x06, 0xb1, 0xbc, 0x78, 0x46, + 0xb1, 0xbc, 0x78, 0x86, 0xd1, 0x88, 0x72, 0x46, + 0xd1, 0x84, 0x73, 0x06, 0x13, 0x20, 0xf9, 0xe3, + 0x00, 0x64, 0xd1, 0xa0, 0x70, 0x46, 0xd0, 0xa2, + 0x30, 0x81, 0xe9, 0xff, 0x10, 0x70, 0xea, 0x11, + 0x10, 0x6d, 0xea, 0x14, 0x10, 0x76, 0xea, 0x19, + 0x10, 0x7a, 0xea, 0x28, 0xe2, 0x3b, 0x18, 0xe0, + 0xea, 0x3b, 0x00, 0xed, 0xd1, 0x80, 0x70, 0x86, + 0xb0, 0x81, 0xd0, 0x3f, 0x40, 0x02, 0x10, 0x20, + 0xea, 0x0c, 0x60, 0x86, 0xf3, 0x8a, 0xe1, 0xe3, + 0xc0, 0x02, 0x10, 0x1a, 0x50, 0x80, 0x60, 0x86, + 0xe2, 0x3b, 0x15, 0xa3, 0xea, 0x21, 0xe2, 0xe9, + 0xd2, 0x80, 0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86, + 0xe3, 0x0c, 0x00, 0xed, 0xd1, 0x88, 0xd0, 0x60, + 0x70, 0x06, 0x50, 0x40, 0x60, 0x46, 0x15, 0xa3, + 0xfb, 0x0c, 0xd5, 0x84, 0xe3, 0x0c, 0xd5, 0x00, + 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, + 0x00, 0xed, 0xd1, 0x88, 0xd0, 0x60, 0x70, 0x06, + 0x50, 0x40, 0x60, 0x46, 0x15, 0xa2, 0xe7, 0x0c, + 0xee, 0x21, 0x00, 0x21, 0xd1, 0x8c, 0x18, 0xe0, + 0xfa, 0x39, 0x70, 0x46, 0x10, 0x61, 0xea, 0x70, + 0xe2, 0x21, 0x65, 0x86, 0xe2, 0x21, 0x18, 0xe0, + 0xea, 0x70, 0xd1, 0x80, 0x73, 0x06, 0x15, 0xa2, + 0xee, 0x68, 0x00, 0x22, 0xd1, 0x80, 0x70, 0x46, + 0x6b, 0x06, 0xcb, 0x01, 0xb1, 0xb4, 0x70, 0x46, + 0x6a, 0xc6, 0xca, 0xc1, 0x00, 0x65, 0xd1, 0x98, + 0x70, 0x46, 0x10, 0x61, 0xfa, 0x50, 0x02, 0x41, + 0xc3, 0x21, 0xc7, 0xe0, 0x02, 0x50, 0xea, 0x56, + 0xc3, 0x20, 0xc7, 0xe1, 0xd1, 0x88, 0xd0, 0x01, + 0x02, 0x40, 0x62, 0x46, 0x0f, 0xef, 0xd0, 0x7f, + 0x30, 0x6f, 0xfa, 0x5f, 0xc3, 0x20, 0xc7, 0x4c, + 0xd0, 0x00, 0x00, 0x65, 0xd1, 0x98, 0x70, 0x46, + 0x60, 0x06, 0xb0, 0x41, 0x43, 0x01, 0xe2, 0x70, + 0xc3, 0x22, 0xc7, 0xcc, 0xc7, 0x60, 0xc7, 0xa1, + 0x02, 0x50, 0xea, 0x70, 0xc7, 0x61, 0xc7, 0xa0, + 0xdb, 0x80, 0xd1, 0x00, 0x00, 0xef, 0xd1, 0xa8, + 0x70, 0x46, 0x10, 0x60, 0xfa, 0x7a, 0x00, 0xe0, + 0xd1, 0x88, 0x70, 0x46, 0x00, 0x22, 0xd1, 0xb0, + 0x70, 0x86, 0x30, 0x81, 0xea, 0x82, 0x60, 0x46, + 0xd0, 0x20, 0xf3, 0x06, 0x10, 0x63, 0xea, 0x87, + 0x10, 0x64, 0xea, 0x87, 0xe2, 0x95, 0x00, 0xef, + 0xd1, 0x6c, 0x71, 0x45, 0xc0, 0x05, 0x30, 0x01, + 0xf6, 0x95, 0xdb, 0x82, 0xd1, 0x01, 0x10, 0x63, + 0xea, 0x95, 0xd1, 0x02, 0x11, 0x62, 0xea, 0x95, + 0xd1, 0x03, 0xd1, 0x8c, 0x61, 0x06, 0xdb, 0x40, + 0x00, 0xe0, 0xd0, 0x00, 0x71, 0x00, 0xc0, 0x84, + 0x10, 0x9c, 0xb0, 0x96, 0xfa, 0xa0, 0xb1, 0x38, + 0xb0, 0x96, 0xfa, 0xa3, 0xb1, 0x30, 0x00, 0x29, + 0xd1, 0x84, 0x00, 0x22, 0xd0, 0x74, 0x70, 0x86, + 0x70, 0xc1, 0x61, 0x06, 0x30, 0xc2, 0xea, 0xae, + 0x60, 0x81, 0xdb, 0x41, 0xb0, 0x3c, 0xb1, 0xbc, + 0xb0, 0x7c, 0x71, 0x00, 0x70, 0x86, 0x70, 0xc1, + 0x61, 0x06, 0x30, 0xc2, 0xea, 0xb9, 0x60, 0x81, + 0xdb, 0x41, 0x00, 0xee, 0xd1, 0xb4, 0x70, 0x06, + 0xb1, 0xbc, 0x70, 0x46, 0x30, 0x40, 0xea, 0xc2, + 0x60, 0x06, 0xdb, 0x41, 0x00, 0x23, 0xd0, 0x70, + 0x30, 0x81, 0xea, 0xc7, 0x30, 0x81, 0x50, 0x02, + 0xea, 0xca, 0xd0, 0x01, 0x00, 0x22, 0xd1, 0xbc, + 0x70, 0x86, 0x30, 0x80, 0xea, 0xd2, 0x60, 0x06, + 0xd0, 0x10, 0xf3, 0x06, 0x00, 0x22, 0xd1, 0xa4, + 0x71, 0x06, 0xd0, 0x01, 0x41, 0x00, 0x5b, 0x44, + 0x5b, 0x6e, 0x6b, 0x46, 0x00, 0x28, 0xd0, 0x70, + 0x70, 0x41, 0x10, 0x62, 0xfa, 0xe6, 0xd1, 0x84, + 0x70, 0x06, 0x10, 0x20, 0xfa, 0xdf, 0x00, 0x22, + 0xd0, 0x00, 0xf3, 0x06, 0x02, 0x7d, 0xdc, 0x62, + 0xe0, 0x46, 0x00, 0xed, 0xd1, 0x88, 0x71, 0x06, + 0x01, 0x1f, 0xfa, 0xfd, 0xd0, 0x41, 0x41, 0x01, + 0xd0, 0x62, 0x00, 0x65, 0xd0, 0x30, 0x70, 0x00, + 0x10, 0x21, 0xea, 0xfa, 0xee, 0xf9, 0x1a, 0xe1, + 0xfa, 0xfa, 0xd0, 0x52, 0x51, 0x01, 0x61, 0x06, + 0xe3, 0x0c, 0x18, 0xe0, 0xea, 0x70, 0xc7, 0x60, + 0xc7, 0xe1, 0x02, 0x50, 0xea, 0x70, 0xc7, 0x61, + 0xc7, 0xe0, 0xe2, 0x70, 0x00, 0x28, 0xdc, 0xa4, + 0x7c, 0x72, 0x5c, 0x40, 0x6c, 0x72, 0x0f, 0xc5, + 0x18, 0xe0, 0xeb, 0x82, 0xd9, 0x0d, 0x00, 0xee, + 0xd1, 0xa4, 0x70, 0x06, 0x10, 0x21, 0xfb, 0x7f, + 0xd9, 0x0c, 0x90, 0x06, 0x00, 0x10, 0xeb, 0x7f, + 0x00, 0x21, 0xd1, 0x88, 0x7a, 0x06, 0x1a, 0x20, + 0xeb, 0x7f, 0xd9, 0x00, 0x00, 0xed, 0xd1, 0xbc, + 0x79, 0x46, 0x19, 0x60, 0xeb, 0x7f, 0x39, 0x68, + 0xc0, 0xe5, 0xc0, 0x25, 0x10, 0x13, 0xb0, 0x0f, + 0xef, 0x7f, 0xb0, 0x22, 0xe7, 0x7f, 0x00, 0xe0, + 0xd1, 0xa8, 0x71, 0x46, 0x11, 0x5f, 0x29, 0x45, + 0x00, 0x22, 0xd0, 0x18, 0x00, 0x22, 0xd4, 0x54, + 0x00, 0x22, 0xd0, 0x9c, 0x70, 0x00, 0x74, 0x51, + 0x70, 0x42, 0x34, 0x40, 0xe7, 0x3c, 0xd0, 0x40, + 0x00, 0x22, 0xd4, 0x50, 0x74, 0x51, 0x34, 0x40, + 0xef, 0x42, 0x20, 0x45, 0x60, 0x42, 0x39, 0x41, + 0x19, 0x60, 0xf7, 0x5e, 0x00, 0x65, 0xd1, 0xa8, + 0x7a, 0x86, 0x29, 0x6a, 0x19, 0x59, 0xb9, 0x7e, + 0xf7, 0x75, 0x15, 0xa3, 0xf7, 0x57, 0x00, 0xed, + 0xd1, 0xac, 0x70, 0x06, 0x00, 0xed, 0xd1, 0xb0, + 0x70, 0x46, 0x30, 0x01, 0xfb, 0x7f, 0x00, 0x65, + 0xd1, 0x84, 0x70, 0x46, 0xb0, 0x7f, 0x60, 0x46, + 0xd5, 0x84, 0xe3, 0x7f, 0x11, 0x41, 0xd0, 0x4a, + 0x00, 0xed, 0xd1, 0xa0, 0x74, 0x46, 0xd0, 0x00, + 0x60, 0x06, 0x30, 0xc5, 0x39, 0x45, 0xe7, 0x6e, + 0x14, 0x60, 0xeb, 0x6b, 0xf3, 0x85, 0xb0, 0x41, + 0xef, 0x65, 0xe3, 0x71, 0x00, 0x66, 0xd1, 0xa0, + 0x60, 0xc6, 0x15, 0xa3, 0xeb, 0x7f, 0xf3, 0x85, + 0xe3, 0x7f, 0xd9, 0x01, 0x00, 0x66, 0xd1, 0xa0, + 0x70, 0x06, 0x30, 0x03, 0xe7, 0x7e, 0x10, 0x1d, + 0x10, 0x3b, 0xe7, 0x7f, 0x60, 0xc6, 0x00, 0x66, + 0xd1, 0xa4, 0x69, 0x06, 0x15, 0xa4, 0xea, 0x23, + 0xe2, 0x3b, 0x00, 0x65, 0xdd, 0x08, 0x7c, 0xf4, + 0xbc, 0xff, 0x6c, 0xf4, 0x00, 0xef, 0xdd, 0x10, + 0x7c, 0xf4, 0xbc, 0xfe, 0x6c, 0xf4, 0xc0, 0x3f, + 0xf1, 0x18, 0xf1, 0x16, 0xf1, 0x18, 0x00, 0x05, + 0x08, 0x20, 0xd0, 0x40, 0x5f, 0x01, 0x15, 0x63, + 0xe9, 0x77, 0x05, 0x5e, 0xea, 0xf2, 0x00, 0x22, + 0xd1, 0xa0, 0x6b, 0x06, 0x00, 0x22, 0xd1, 0xa8, + 0x6b, 0xc6, 0x00, 0x22, 0xd1, 0xac, 0x6a, 0xc6, + 0x00, 0xee, 0xd0, 0x0c, 0x00, 0xe6, 0xd1, 0x9c, + 0x70, 0x40, 0x30, 0x5f, 0xe9, 0x8d, 0xb0, 0x3c, + 0xb1, 0xb4, 0x70, 0x40, 0x30, 0x5f, 0xe9, 0x8d, + 0xb1, 0xb4, 0x00, 0xe6, 0xd0, 0x10, 0xd0, 0x83, + 0x70, 0x40, 0x60, 0x46, 0xb0, 0x3c, 0xb1, 0xbc, + 0xb0, 0x81, 0xed, 0x90, 0x00, 0xee, 0xd0, 0x0c, + 0x00, 0xe6, 0xd1, 0x9c, 0x70, 0x40, 0x30, 0x4c, + 0xe9, 0xa3, 0xb0, 0x3c, 0xb1, 0xb4, 0x70, 0x40, + 0x30, 0x4c, 0xe9, 0xa3, 0xb1, 0xb4, 0x00, 0xe6, + 0xd0, 0x00, 0x61, 0x80, 0x00, 0x21, 0xd1, 0xb4, + 0x70, 0x06, 0x10, 0x20, 0xe9, 0xae, 0xd0, 0x00, + 0x60, 0x06, 0xf1, 0x18, 0x00, 0x21, 0xd1, 0x8c, + 0x70, 0x46, 0x65, 0x86, 0xde, 0xc0, 0x00, 0xee, + 0xd0, 0x20, 0x70, 0x00, 0x10, 0x22, 0xfd, 0xb9, + 0xde, 0xc2, 0x00, 0x21, 0xd0, 0x04, 0x70, 0x00, + 0x10, 0x21, 0xe9, 0xc0, 0x15, 0xa3, 0xe9, 0xdc, + 0xd0, 0x02, 0x4c, 0x00, 0x10, 0x63, 0xe9, 0xc5, + 0xcc, 0x3b, 0xd0, 0x04, 0x63, 0x00, 0xd0, 0x00, + 0x70, 0x00, 0x30, 0x1f, 0xfa, 0xf2, 0xd0, 0x18, + 0x70, 0x00, 0x10, 0x20, 0xed, 0xc7, 0xd0, 0x04, + 0x70, 0x80, 0x10, 0xa0, 0xea, 0xf2, 0xf1, 0x16, + 0x00, 0x21, 0xd0, 0x9a, 0xc0, 0x39, 0x30, 0x1f, + 0x10, 0x18, 0x30, 0x02, 0xfd, 0xcf, 0xe2, 0xf2, + 0x00, 0xe0, 0xd9, 0x04, 0x79, 0x24, 0xb9, 0x38, + 0x19, 0x1c, 0xd0, 0x1e, 0x30, 0x24, 0xf5, 0xe5, + 0x29, 0x00, 0xdc, 0x88, 0x4c, 0xac, 0xd0, 0x02, + 0x40, 0x2c, 0x10, 0x02, 0x0c, 0x80, 0x10, 0x63, + 0xea, 0x5a, 0x15, 0x63, 0xf9, 0xf0, 0xf1, 0x18, + 0xdc, 0x1e, 0x1e, 0xe0, 0xe9, 0xf6, 0x15, 0x63, + 0xf9, 0xf6, 0xbe, 0xfc, 0xd0, 0x2c, 0x6c, 0x00, + 0xcc, 0x24, 0xd9, 0x40, 0x06, 0x50, 0xea, 0x0c, + 0xc0, 0x24, 0xb0, 0x0f, 0xfe, 0x0c, 0xd9, 0x74, + 0x79, 0x65, 0x19, 0x5f, 0x30, 0x25, 0xee, 0x05, + 0x29, 0x40, 0x19, 0x5f, 0x19, 0x41, 0xc0, 0x25, + 0x20, 0x30, 0x30, 0x24, 0xe6, 0x0c, 0x3c, 0x00, + 0xd0, 0x38, 0x69, 0x40, 0x1c, 0x05, 0xbc, 0x38, + 0x3c, 0x32, 0x5c, 0x3b, 0xbc, 0x3f, 0xd8, 0xec, + 0x78, 0xe3, 0xc0, 0xa3, 0x10, 0xaf, 0xf6, 0x19, + 0xd0, 0x8f, 0x02, 0xe4, 0xd8, 0x00, 0xd0, 0xc0, + 0x20, 0xe0, 0xb0, 0x81, 0xee, 0x1c, 0xd0, 0x30, + 0x60, 0xc0, 0x00, 0xab, 0xd0, 0x30, 0xc0, 0xc0, + 0xd8, 0x40, 0xc1, 0x23, 0xd4, 0x5e, 0x34, 0x63, + 0xdc, 0x40, 0x0c, 0x1f, 0xfa, 0x45, 0xc0, 0x65, + 0xb0, 0x41, 0xe6, 0x31, 0x68, 0x40, 0xb0, 0x3c, + 0xe2, 0x2c, 0xc0, 0xc0, 0x34, 0x65, 0xdc, 0x48, + 0x4c, 0x70, 0x1c, 0x5f, 0x20, 0xf1, 0x15, 0x63, + 0xfa, 0x46, 0xf2, 0x3e, 0xc1, 0x11, 0xc0, 0x83, + 0xf2, 0x8f, 0xe2, 0x59, 0xb1, 0x01, 0xe6, 0x44, + 0x68, 0x40, 0x28, 0x60, 0xb0, 0x3c, 0xe2, 0x3e, + 0x0f, 0xc5, 0xd9, 0x40, 0xb1, 0x0f, 0x11, 0x01, + 0x21, 0x25, 0xf2, 0x3e, 0xc1, 0x11, 0xb1, 0x01, + 0xe6, 0x59, 0x20, 0x31, 0x68, 0x40, 0x30, 0x31, + 0xb0, 0x3c, 0x28, 0x60, 0x70, 0x43, 0x30, 0x31, + 0x60, 0x40, 0x20, 0x31, 0xb0, 0x3c, 0xb0, 0xf8, + 0xe2, 0x4b, 0xe2, 0xe1, 0xd8, 0xec, 0x78, 0xe3, + 0x00, 0xa8, 0xd0, 0x80, 0x00, 0xa8, 0xd1, 0x44, + 0x00, 0xab, 0xd0, 0x30, 0xc0, 0xc0, 0x0c, 0x1f, + 0xfa, 0x9d, 0xd9, 0x78, 0x79, 0x65, 0x39, 0x25, + 0x19, 0x5f, 0xc9, 0xa5, 0x19, 0x83, 0x20, 0x26, + 0x20, 0xe6, 0x20, 0xa6, 0x21, 0x66, 0xc1, 0x23, + 0xc0, 0x64, 0x10, 0x5f, 0x10, 0x9d, 0x20, 0x81, + 0x31, 0x01, 0x30, 0x44, 0xf6, 0x78, 0x21, 0x01, + 0x30, 0x84, 0x10, 0x83, 0xc4, 0x64, 0x34, 0x63, + 0xdc, 0x48, 0x4c, 0x70, 0x1c, 0x5f, 0x15, 0x63, + 0xfa, 0xad, 0x20, 0xb1, 0xf2, 0x8f, 0xc1, 0x24, + 0x11, 0x1f, 0xc0, 0x85, 0x30, 0xb1, 0xf2, 0x8f, + 0xc1, 0x11, 0xc0, 0x83, 0x0c, 0x9d, 0xfa, 0x8d, + 0xb0, 0xbc, 0xf2, 0x8f, 0xe2, 0xd6, 0xb1, 0x01, + 0xe6, 0x44, 0x70, 0x42, 0xb0, 0xb8, 0x60, 0x40, + 0xb0, 0x3c, 0xe2, 0x8f, 0xb1, 0x01, 0xe6, 0x44, + 0x70, 0x42, 0xb0, 0xb8, 0x60, 0x40, 0xb0, 0x38, + 0xe2, 0x96, 0x00, 0xab, 0xd0, 0x34, 0xc1, 0x23, + 0xb1, 0x0f, 0xf2, 0x96, 0xd1, 0x1e, 0x31, 0x23, + 0x00, 0xa8, 0xd0, 0x84, 0xf2, 0x96, 0xd1, 0x0f, + 0x00, 0xa8, 0xd0, 0x84, 0xc0, 0x03, 0xf2, 0x96, + 0xe2, 0xd6, 0xd8, 0x82, 0x48, 0x95, 0x18, 0x81, + 0xb1, 0x01, 0xe6, 0xc3, 0x20, 0xb1, 0x70, 0x42, + 0x30, 0xb1, 0x20, 0x22, 0x60, 0x40, 0x30, 0x22, + 0xb0, 0xbc, 0xb0, 0x3c, 0x30, 0xb1, 0x70, 0x42, + 0x20, 0xb1, 0x30, 0x22, 0x60, 0x40, 0x20, 0x22, + 0xb0, 0xbc, 0xb0, 0x3c, 0xe2, 0xb0, 0xc1, 0x11, + 0xc0, 0x85, 0x30, 0xb1, 0x20, 0xe2, 0xb1, 0x01, + 0xe6, 0xd6, 0x70, 0x42, 0xb0, 0xb8, 0x20, 0x22, + 0x60, 0x40, 0x30, 0x22, 0xb0, 0x3c, 0x70, 0x43, + 0xb0, 0xf8, 0x30, 0x22, 0x60, 0x40, 0x20, 0x22, + 0xb0, 0x3c, 0xe2, 0xc7, 0xd0, 0x08, 0x5c, 0x00, + 0x3c, 0x32, 0xd0, 0x04, 0x40, 0x30, 0x3c, 0x00, + 0x15, 0x63, 0xfa, 0xe1, 0x1e, 0xe0, 0xea, 0xe1, + 0xbc, 0x3c, 0x00, 0xab, 0xd0, 0xb0, 0x00, 0xa8, + 0xd0, 0x00, 0x00, 0x20, 0xd1, 0x1e, 0x70, 0x42, + 0xb0, 0xbc, 0x60, 0x40, 0xb0, 0x3c, 0xb1, 0x01, + 0xee, 0xe7, 0xd0, 0x30, 0x30, 0x30, 0xee, 0xed, + 0xd0, 0x04, 0x63, 0x00, 0x08, 0x20, 0xd0, 0x40, + 0x3f, 0x01, 0x02, 0xba, 0xd0, 0x3c, 0xe0, 0x46, + 0x01, 0x46, 0xd0, 0x08, 0x94, 0x89, 0xd0, 0x8c, + 0x44, 0x82, 0x14, 0x9e, 0x30, 0x12, 0xd0, 0x88, + 0x10, 0x80, 0x00, 0xe8, 0xd1, 0x80, 0x70, 0xc6, + 0x00, 0x06, 0xa0, 0xbd, 0xa0, 0xfc, 0x80, 0x3f, + 0xb1, 0xbe, 0x60, 0xc6, 0x00, 0x06, 0x80, 0xa9, + 0x80, 0x3f, 0x80, 0x2a, 0x80, 0x3f, 0x00, 0x21, + 0xd0, 0x3c, 0x00, 0x0a, 0xb1, 0x82, 0xd0, 0x6b, + 0x70, 0x46, 0x00, 0x06, 0x80, 0x07, 0x01, 0x20, + 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, + 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, + 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x29, + 0x80, 0x2b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08, + 0xa0, 0x27, 0x90, 0x09, 0xd0, 0x41, 0x40, 0x01, + 0xd0, 0x44, 0x40, 0x70, 0x20, 0x01, 0xa0, 0x27, + 0x80, 0x3f, 0x00, 0xc6, 0x15, 0x63, 0xe9, 0xae, + 0x05, 0x5e, 0xe9, 0xbe, 0x00, 0xe0, 0xd0, 0x40, + 0x70, 0x81, 0x10, 0x9c, 0xb0, 0x96, 0xf9, 0xb7, + 0x00, 0x21, 0xd0, 0x40, 0xe1, 0xbb, 0xb0, 0x96, + 0xf9, 0xbe, 0x00, 0x22, 0xd0, 0x40, 0x27, 0xc1, + 0x27, 0x41, 0x27, 0x81, 0x90, 0x83, 0x00, 0x64, + 0xd0, 0x10, 0x60, 0x80, 0x01, 0x46, 0x82, 0x34, + 0x80, 0x3f, 0x00, 0x64, 0xd0, 0x14, 0x67, 0x40, + 0x80, 0x34, 0x80, 0x3f, 0x00, 0xc6, 0x90, 0xae, + 0x00, 0x64, 0xd0, 0x18, 0x60, 0x80, 0x90, 0xa6, + 0x00, 0x64, 0xd0, 0x1c, 0x60, 0x80, 0x15, 0x63, + 0xe9, 0xe3, 0x0c, 0x1f, 0xe9, 0xe3, 0x05, 0x50, + 0xf9, 0xe3, 0x15, 0xa3, 0xf9, 0xe3, 0x90, 0x4d, + 0x10, 0x60, 0xe5, 0xdb, 0x00, 0x06, 0x05, 0x0d, + 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x15, 0xa3, + 0xf9, 0xfb, 0x00, 0x21, 0xd0, 0x04, 0x70, 0x00, + 0x10, 0x21, 0xe9, 0xfb, 0xd0, 0x38, 0x70, 0x00, + 0x15, 0x63, 0xe9, 0xef, 0x10, 0x1f, 0x15, 0x21, + 0xe5, 0xe0, 0xd0, 0x5e, 0x30, 0x54, 0xe5, 0xe0, + 0xc0, 0x40, 0xb0, 0x7f, 0x30, 0x54, 0xe9, 0xfb, + 0x0c, 0x09, 0x05, 0x0d, 0xe1, 0xef, 0xc0, 0x5f, + 0x10, 0x58, 0x10, 0x48, 0x00, 0xee, 0xd0, 0x8c, + 0xd0, 0xc3, 0x70, 0x02, 0x30, 0x01, 0xea, 0x10, + 0xb0, 0xbc, 0xb0, 0xc1, 0xee, 0x01, 0x00, 0x26, + 0xd0, 0x20, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, + 0x15, 0xa3, 0xea, 0x0f, 0xb0, 0x88, 0x77, 0xc2, + 0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40, + 0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c, + 0xd3, 0x80, 0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, + 0x00, 0x4d, 0x00, 0x50, 0xfa, 0x1a, 0x0c, 0x49, + 0x00, 0x8d, 0xc0, 0x42, 0x10, 0x60, 0xea, 0x2a, + 0xb0, 0x5e, 0xb0, 0x43, 0xfe, 0x34, 0xd0, 0x61, + 0x23, 0x81, 0xe2, 0x1f, 0x0c, 0x09, 0x05, 0x0d, + 0x15, 0x20, 0xfe, 0x31, 0xd0, 0x5f, 0x30, 0x54, + 0xee, 0x10, 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, + 0xc6, 0xd4, 0xb6, 0xc1, 0xe6, 0x31, 0xd0, 0x5e, + 0x30, 0x5b, 0xfe, 0x31, 0xd7, 0x00, 0xb7, 0x01, + 0xd3, 0x81, 0x00, 0x27, 0xd0, 0x10, 0xd0, 0x81, + 0x60, 0x80, 0x15, 0x63, 0xfa, 0x54, 0x00, 0x22, + 0xdc, 0xd8, 0x03, 0xf7, 0xd2, 0x10, 0xf0, 0x4a, + 0x15, 0xa3, 0xfa, 0x51, 0x02, 0xf6, 0xde, 0x26, + 0x0c, 0x10, 0xf8, 0x46, 0x02, 0xfb, 0xda, 0x22, + 0xe0, 0x46, 0x02, 0xf1, 0xd8, 0x2b, 0xe0, 0x46, + 0x00, 0x22, 0xdc, 0xd8, 0x03, 0xf9, 0xd2, 0x10, + 0xf0, 0x4a, 0x03, 0x34, 0xdc, 0x20, 0x15, 0xa3, + 0xe8, 0x46, 0x02, 0xff, 0xde, 0x27, 0xe0, 0x46, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xe0, 0xe1, 0xec, 0xe2, 0x12, + 0xe2, 0x14, 0xe1, 0xc7, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, + 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x5e, 0x30, 0x5b, 0xfc, 0x11, + 0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20, + 0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19, + 0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xde, + 0xf9, 0xba, 0x03, 0xdf, 0xe9, 0x99, 0xd3, 0x40, + 0xca, 0x50, 0xd1, 0x42, 0xe2, 0xea, 0xc0, 0x50, + 0x10, 0x54, 0xc0, 0x90, 0x10, 0x8c, 0x10, 0x92, + 0x10, 0xe0, 0xe5, 0xa8, 0xc0, 0x01, 0x10, 0x01, + 0x20, 0x40, 0xc0, 0x02, 0x10, 0x01, 0x20, 0x80, + 0x10, 0x60, 0xfd, 0xab, 0xb0, 0x7f, 0x10, 0xa0, + 0xfd, 0xae, 0xb0, 0xbf, 0x10, 0x5f, 0x10, 0x9f, + 0x00, 0xef, 0xd0, 0x3e, 0x20, 0x52, 0x20, 0x83, + 0x20, 0x93, 0x10, 0x4c, 0x10, 0x82, 0x40, 0x80, + 0x50, 0x42, 0x0f, 0xc5, 0xcb, 0xaa, 0xcb, 0xeb, + 0xca, 0x50, 0xd0, 0xc0, 0xb0, 0xc1, 0xf1, 0x9b, + 0xcb, 0x01, 0xd0, 0xc1, 0xf1, 0x9b, 0xcb, 0x41, + 0xba, 0x7f, 0xbb, 0x3f, 0xe2, 0xea, 0xcc, 0x5b, + 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, + 0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, + 0x06, 0xd0, 0xe9, 0xd5, 0x01, 0x69, 0xd0, 0x20, + 0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, + 0x2c, 0x40, 0x2c, 0x80, 0x01, 0x74, 0xd6, 0x00, + 0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, + 0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xe5, + 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xec, 0x80, 0x07, + 0xd4, 0x00, 0xc4, 0x50, 0xd3, 0x08, 0xe2, 0x95, + 0xd0, 0x71, 0x20, 0x56, 0x00, 0x48, 0xd1, 0x8c, + 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xfa, 0x06, 0x5e, + 0xfa, 0x03, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, + 0xf9, 0xfa, 0xd3, 0xc4, 0x06, 0x5e, 0xfa, 0x03, + 0xd0, 0x43, 0x40, 0x4c, 0xea, 0x03, 0x08, 0x49, + 0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46, + 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xea, 0x0a, + 0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02, + 0xb0, 0x20, 0x03, 0x19, 0xea, 0x10, 0xb0, 0x20, + 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80, + 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, + 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xd3, 0xe1, 0xdc, 0xe2, 0x00, + 0xe2, 0x02, 0xe1, 0xac, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x91, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, + 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x5e, 0x30, 0x5b, 0xfc, 0x11, + 0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x8e, + 0xbc, 0x10, 0xd0, 0x30, 0xc0, 0x40, 0x30, 0x70, + 0xed, 0x8e, 0x03, 0x10, 0xe9, 0x97, 0x0f, 0x19, + 0xf9, 0x93, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xdf, + 0xe9, 0xa1, 0xd3, 0x40, 0xca, 0x50, 0xcb, 0x52, + 0x03, 0x1d, 0xf9, 0xa8, 0xca, 0x12, 0xca, 0x52, + 0xe1, 0xa5, 0x03, 0x1d, 0xf9, 0xa8, 0xca, 0x12, + 0xca, 0x53, 0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e, + 0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea, + 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, + 0x17, 0x20, 0xf9, 0xd2, 0x00, 0xa8, 0xd0, 0x00, + 0xcc, 0x5b, 0x1c, 0x5f, 0x1c, 0x43, 0x20, 0x31, + 0x7c, 0x40, 0xb0, 0x3c, 0x7e, 0x80, 0xcc, 0xb1, + 0xce, 0xfa, 0x1c, 0x9f, 0x1e, 0xdf, 0x01, 0x69, + 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xc4, 0x3c, 0x80, + 0x0e, 0xd9, 0xe9, 0xc7, 0x3e, 0xc0, 0x3e, 0xf2, + 0x3e, 0xb1, 0xd0, 0x01, 0x40, 0x1b, 0x10, 0x05, + 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30, + 0x70, 0x00, 0x2c, 0x80, 0xe3, 0x1e, 0xd3, 0xc2, + 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xd8, 0xf2, 0x32, + 0xb3, 0x81, 0xe9, 0xdc, 0x80, 0x07, 0xe2, 0x95, + 0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, + 0xe9, 0xe8, 0x06, 0x5e, 0xf9, 0xf1, 0x08, 0x89, + 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xe8, 0xd3, 0xc4, + 0x06, 0x5e, 0xf9, 0xf1, 0xd0, 0x43, 0x40, 0x4c, + 0xe9, 0xf1, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87, + 0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, + 0x03, 0x1c, 0xe9, 0xf8, 0x09, 0x49, 0x00, 0x0d, + 0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19, + 0xe9, 0xfe, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b, + 0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50, + 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xc1, 0xe1, 0xca, 0xe1, 0xee, + 0xe1, 0xf0, 0xe1, 0xa8, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, + 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x5e, 0x30, 0x5b, 0xfc, 0x11, + 0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20, + 0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19, + 0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xdf, + 0xe9, 0x9d, 0xd3, 0x40, 0xca, 0x50, 0xcb, 0x52, + 0x03, 0x1d, 0xf9, 0xa4, 0xca, 0x12, 0xca, 0x52, + 0xe1, 0xa1, 0x03, 0x1d, 0xf9, 0xa4, 0xca, 0x12, + 0xca, 0x53, 0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e, + 0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea, + 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, + 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1, + 0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0xb6, 0x01, 0x69, + 0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08, + 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30, + 0x70, 0x00, 0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4, + 0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0, + 0xed, 0xc6, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xca, + 0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c, + 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xd6, 0x06, 0x5e, + 0xf9, 0xdf, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, + 0xf9, 0xd6, 0xd3, 0xc4, 0x06, 0x5e, 0xf9, 0xdf, + 0xd0, 0x43, 0x40, 0x4c, 0xe9, 0xdf, 0x08, 0x49, + 0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46, + 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xe6, + 0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02, + 0xb0, 0x20, 0x03, 0x19, 0xe9, 0xec, 0xb0, 0x20, + 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80, + 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, + 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xdb, 0xe1, 0xe9, 0xe2, 0x00, + 0xe2, 0x02, 0xe1, 0xc3, 0xe1, 0x65, 0x30, 0x5a, + 0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, + 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x4f, 0x30, 0x5b, 0xfc, 0x11, + 0xc0, 0x39, 0x30, 0x31, 0x10, 0x11, 0x10, 0x20, + 0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19, + 0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xd0, + 0xf9, 0x98, 0xca, 0x50, 0x03, 0xde, 0xf9, 0x9a, + 0xd1, 0x42, 0xe2, 0xea, 0xcb, 0xaa, 0xcb, 0xeb, + 0xc0, 0x50, 0x10, 0x54, 0xc0, 0x90, 0x10, 0x8c, + 0x10, 0x92, 0xd0, 0xc1, 0x05, 0x50, 0xe9, 0xa5, + 0xb0, 0xc2, 0x10, 0x60, 0xfd, 0xa8, 0xb0, 0x7f, + 0x10, 0xa0, 0xfd, 0xab, 0xb0, 0xbf, 0x10, 0x5f, + 0x10, 0x9f, 0x00, 0xef, 0xd0, 0x3e, 0x20, 0x52, + 0x20, 0x83, 0x20, 0x93, 0x10, 0x4c, 0x10, 0x82, + 0x40, 0x80, 0x50, 0x42, 0xd0, 0x81, 0x14, 0x1f, + 0x14, 0x01, 0x05, 0x50, 0xe9, 0xbd, 0x50, 0x42, + 0xe1, 0xbe, 0x54, 0x02, 0xca, 0x10, 0xca, 0x50, + 0xcb, 0x01, 0xcb, 0x41, 0xe2, 0xea, 0xcc, 0x5b, + 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, + 0x2c, 0x40, 0x1c, 0x49, 0xcc, 0xb1, 0x1c, 0x9f, + 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x05, 0x50, + 0xf9, 0xd2, 0xb0, 0x3c, 0x2c, 0x40, 0x2c, 0x80, + 0x01, 0x74, 0xd6, 0x00, 0x2c, 0x80, 0x02, 0xe4, + 0xde, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 0xd3, 0xc0, + 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xe0, 0xf2, 0x32, + 0xb3, 0x81, 0xe9, 0xe9, 0x80, 0x07, 0xd4, 0x02, + 0x44, 0x15, 0x14, 0x1f, 0xc4, 0x50, 0xd3, 0x08, + 0xe2, 0x95, 0xd0, 0x71, 0x20, 0x56, 0x00, 0x48, + 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xf7, + 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xf6, + 0xd3, 0xc4, 0xe1, 0xf7, 0xb3, 0xc1, 0x01, 0x46, + 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xfe, + 0x09, 0x49, 0x00, 0x0d, 0xa0, 0x2c, 0xe2, 0x5b, + 0x06, 0x5f, 0xfa, 0x7f, 0xd4, 0x02, 0x44, 0x15, + 0x14, 0x1f, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, + 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xc9, 0xe1, 0xd2, 0xe1, 0xe7, + 0xe1, 0xe9, 0xe1, 0xab, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x91, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, + 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x4f, 0x30, 0x5b, 0xfc, 0x11, + 0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x8e, + 0xbc, 0x10, 0xd0, 0x20, 0xc0, 0x40, 0x30, 0x70, + 0xed, 0x8e, 0x03, 0x10, 0xe9, 0x97, 0x0f, 0x19, + 0xf9, 0x93, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xd0, + 0xf9, 0xa0, 0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, + 0xf9, 0xa7, 0xca, 0x12, 0xca, 0x52, 0xe1, 0xa4, + 0x03, 0x1d, 0xf9, 0xa7, 0xca, 0x12, 0xca, 0x53, + 0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, + 0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea, 0x00, 0x24, + 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, + 0xf9, 0xc8, 0x00, 0x2a, 0xd0, 0x00, 0x20, 0x1b, + 0x20, 0x1b, 0x05, 0x50, 0xf9, 0xb8, 0xb0, 0x3f, + 0x10, 0x02, 0x7c, 0x40, 0xcc, 0xb1, 0x1c, 0x9f, + 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xc1, + 0x3c, 0x80, 0xde, 0xa0, 0x2c, 0x5f, 0x2c, 0x9f, + 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, 0xde, 0xc1, + 0xe3, 0x1e, 0xd3, 0xc0, 0xf2, 0xd3, 0x13, 0xa0, + 0xed, 0xce, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xd2, + 0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c, + 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xde, 0x08, 0x89, + 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xdd, 0xd3, 0xc4, + 0xe1, 0xde, 0xb3, 0xc1, 0x01, 0x46, 0x90, 0x2c, + 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xe5, 0x09, 0x49, + 0x00, 0x0d, 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, + 0xfa, 0x7f, 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, + 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xa3, 0xc0, 0x00, 0xc0, 0x00, + 0xc0, 0x00, 0xe1, 0x8a, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x87, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x5e, + 0x30, 0x5b, 0xfd, 0xb4, 0xc0, 0x39, 0x30, 0x31, + 0x10, 0x12, 0x10, 0x20, 0xe9, 0x82, 0xd1, 0x42, + 0xd3, 0x40, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, + 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, + 0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0, + 0xe9, 0x98, 0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80, + 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40, + 0x2c, 0x80, 0x01, 0x74, 0xd6, 0x00, 0x2c, 0x80, + 0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, 0xf2, 0xd3, + 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xc8, + 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, + 0xe9, 0xbf, 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, + 0x10, 0x5c, 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xc8, + 0x0f, 0x17, 0xf9, 0xb4, 0x0f, 0x49, 0xf2, 0xd3, + 0x0f, 0x19, 0xf9, 0xb8, 0xdf, 0x00, 0x00, 0x06, + 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, 0xc0, 0x5b, + 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xc8, 0x0f, 0x17, + 0xf9, 0xc3, 0x02, 0xf1, 0xd8, 0x2b, 0xe0, 0x46, + 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xb5, 0xc0, 0x00, 0xc0, 0x00, + 0xc0, 0x00, 0xe1, 0x8e, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x8b, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x5e, + 0x30, 0x5b, 0xfd, 0xc6, 0xbc, 0x10, 0xd0, 0x10, + 0x0c, 0x1e, 0xf9, 0x88, 0xbc, 0x10, 0xd0, 0x30, + 0xc0, 0x40, 0x30, 0x70, 0xed, 0x88, 0xd1, 0x42, + 0xd3, 0x40, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, + 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xb4, + 0x00, 0xa8, 0xd0, 0x00, 0xcc, 0x5b, 0x1c, 0x5f, + 0x1c, 0x43, 0x20, 0x31, 0x7c, 0x40, 0xb0, 0x3c, + 0x7e, 0x80, 0xcc, 0xb1, 0xce, 0xfa, 0x1c, 0x9f, + 0x1e, 0xdf, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, + 0xe9, 0xa6, 0x3c, 0x80, 0x0e, 0xd9, 0xe9, 0xa9, + 0x3e, 0xc0, 0x3e, 0xf2, 0x3e, 0xb1, 0xd0, 0x01, + 0x40, 0x1b, 0x10, 0x05, 0x20, 0x1f, 0x2c, 0x40, + 0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, + 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, + 0x30, 0x5a, 0xe5, 0xda, 0x00, 0x26, 0xd0, 0x00, + 0x70, 0x00, 0x10, 0x20, 0xe9, 0xd1, 0x00, 0xe0, + 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5c, 0x30, 0x5b, + 0xb0, 0x41, 0xed, 0xda, 0x0f, 0x17, 0xf9, 0xc6, + 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xca, + 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb3, 0xd8, 0x29, + 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, + 0xe5, 0xda, 0x0f, 0x17, 0xf9, 0xd5, 0x02, 0xf6, + 0xde, 0x26, 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, + 0xe2, 0x95, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xa2, 0xc0, 0x00, 0xc0, 0x00, + 0xc0, 0x00, 0xe1, 0x8a, 0xe1, 0x65, 0x30, 0x5a, + 0xe5, 0x87, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x4f, + 0x30, 0x5b, 0xfd, 0xb3, 0xc0, 0x39, 0x30, 0x31, + 0x10, 0x11, 0x10, 0x20, 0xe9, 0x82, 0xd1, 0x42, + 0xd3, 0x41, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, + 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, + 0x1c, 0x49, 0xcc, 0xb1, 0x1c, 0x9f, 0xc0, 0x1c, + 0x10, 0x08, 0x20, 0x1f, 0x05, 0x50, 0xf9, 0x99, + 0xb0, 0x3c, 0x2c, 0x40, 0x2c, 0x80, 0x01, 0x74, + 0xd6, 0x00, 0x2c, 0x80, 0x02, 0xe4, 0xde, 0x80, + 0xde, 0xc1, 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, + 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xc7, 0x00, 0x26, + 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 0xe9, 0xbe, + 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5b, + 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xc7, 0x0f, 0x17, + 0xf9, 0xb3, 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, + 0xf9, 0xb7, 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb3, + 0xd8, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, + 0xb0, 0x7e, 0xe5, 0xc7, 0x0f, 0x17, 0xf9, 0xc2, + 0x02, 0xff, 0xde, 0x27, 0xe0, 0x46, 0xd3, 0x08, + 0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xac, 0xc0, 0x00, 0xc0, 0x00, + 0xc0, 0x00, 0xe1, 0x8e, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x8b, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x4f, + 0x30, 0x5b, 0xfd, 0xbd, 0xbc, 0x10, 0xd0, 0x10, + 0x0c, 0x1e, 0xf9, 0x88, 0xbc, 0x10, 0xd0, 0x20, + 0xc0, 0x40, 0x30, 0x70, 0xed, 0x88, 0xd1, 0x42, + 0xd3, 0x41, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, + 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xab, + 0x00, 0x2a, 0xd0, 0x00, 0x20, 0x1b, 0x20, 0x1b, + 0x05, 0x50, 0xf9, 0x9b, 0xb0, 0x3f, 0x10, 0x02, + 0x7c, 0x40, 0xcc, 0xb1, 0x1c, 0x9f, 0x01, 0x69, + 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xa4, 0x3c, 0x80, + 0xde, 0xa0, 0x2c, 0x5f, 0x2c, 0x9f, 0xd0, 0x30, + 0x70, 0x00, 0x2c, 0x80, 0xde, 0xc1, 0xe3, 0x1e, + 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, + 0xe5, 0xd1, 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, + 0x10, 0x20, 0xe9, 0xc8, 0x00, 0xe0, 0xd0, 0x44, + 0x70, 0x41, 0x10, 0x5b, 0x30, 0x5b, 0xb0, 0x41, + 0xed, 0xd1, 0x0f, 0x17, 0xf9, 0xbd, 0x0f, 0x49, + 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xc1, 0xdf, 0x00, + 0x00, 0x06, 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, + 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xd1, + 0x0f, 0x17, 0xf9, 0xcc, 0x03, 0x34, 0xdc, 0x20, + 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, + 0xd0, 0x61, 0x23, 0x81, 0x0c, 0x49, 0xd0, 0x61, + 0x00, 0x8d, 0x10, 0xa0, 0xea, 0x3b, 0x30, 0x42, + 0xe6, 0x30, 0x23, 0x82, 0x0f, 0xc5, 0x0c, 0x09, + 0x05, 0x0d, 0x15, 0x20, 0xfe, 0x45, 0xd0, 0x5f, + 0x15, 0x63, 0xea, 0x43, 0xd0, 0x50, 0x30, 0x54, + 0xee, 0x4a, 0x0f, 0x17, 0xfa, 0x45, 0x03, 0xb3, + 0xd8, 0x29, 0xe0, 0x46, 0x80, 0x07, 0x09, 0x49, + 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, + 0x00, 0x4d, 0xa0, 0x6c, 0xd0, 0xa1, 0x00, 0x88, + 0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, 0xfa, 0x53, + 0xf2, 0x32, 0xd3, 0x80, 0xe1, 0x76, 0xd1, 0xc2, + 0x41, 0xcf, 0x11, 0xdf, 0xd0, 0x41, 0x01, 0xc1, + 0x00, 0xef, 0xd0, 0xbe, 0x03, 0x10, 0xf9, 0x77, + 0x80, 0x07, 0x21, 0x96, 0x11, 0xa2, 0xe9, 0x78, + 0x03, 0x1d, 0xea, 0x73, 0xc0, 0xd7, 0xc2, 0x90, + 0xf2, 0xa4, 0xc4, 0x0a, 0x03, 0xd0, 0xea, 0x72, + 0xc2, 0x91, 0xf2, 0xa4, 0xc4, 0x4a, 0x03, 0x1e, + 0xea, 0x8d, 0xc0, 0xd8, 0xc2, 0x92, 0xf2, 0xa4, + 0xc4, 0x8a, 0x03, 0xd0, 0xea, 0x7d, 0xc2, 0x93, + 0xf2, 0xa4, 0xc4, 0xca, 0xe2, 0x8d, 0xd3, 0xc0, + 0xc0, 0xd7, 0xc2, 0x90, 0xf2, 0xa4, 0xc4, 0x0a, + 0x03, 0xd0, 0xea, 0x88, 0xc2, 0x91, 0xf2, 0xa4, + 0xc4, 0x4a, 0x08, 0x49, 0x00, 0x4d, 0x10, 0x61, + 0xf8, 0x11, 0x03, 0x1f, 0xea, 0x93, 0x0d, 0xc9, + 0x00, 0x4d, 0xd0, 0x1a, 0xe2, 0x98, 0x03, 0x10, + 0xfa, 0x97, 0xd0, 0x1d, 0xe2, 0x98, 0xd0, 0x18, + 0x0f, 0x16, 0xfa, 0x98, 0xd0, 0x4c, 0x40, 0x4c, + 0x10, 0x6c, 0xea, 0xa2, 0x03, 0xde, 0xfa, 0xa2, + 0x0f, 0x12, 0xfa, 0xa0, 0x00, 0x08, 0xe2, 0xd9, + 0xd2, 0x00, 0x13, 0xe1, 0xee, 0xa9, 0x08, 0x49, + 0x02, 0x0d, 0x00, 0xc8, 0xc2, 0xca, 0x12, 0x94, + 0xd0, 0x1f, 0x30, 0x07, 0x12, 0xc0, 0xc2, 0x43, + 0x12, 0x5a, 0x00, 0x0d, 0x03, 0xde, 0xea, 0xb6, + 0x0e, 0xc9, 0x04, 0x8d, 0x02, 0x48, 0x22, 0x80, + 0x12, 0x88, 0xd0, 0x0b, 0x30, 0x03, 0x12, 0x80, + 0xd0, 0x19, 0x20, 0x03, 0x12, 0x80, 0x00, 0x0d, + 0x22, 0xc0, 0x12, 0xc8, 0xd0, 0x0b, 0x30, 0x09, + 0x12, 0xc0, 0x12, 0xd8, 0xd0, 0x16, 0x20, 0x09, + 0x20, 0x07, 0x12, 0xc0, 0x42, 0xc2, 0x22, 0x8b, + 0x22, 0x88, 0x03, 0xde, 0xea, 0xd2, 0x0e, 0xc9, + 0xc4, 0x4a, 0x04, 0xcd, 0x0f, 0xc5, 0x01, 0x46, + 0x90, 0x4d, 0x00, 0xc6, 0x10, 0x60, 0xe6, 0xd3, + 0x0f, 0xc5, 0x01, 0x74, 0xd6, 0x00, 0xca, 0x9d, + 0xcb, 0x9e, 0xca, 0xea, 0xcb, 0xee, 0x2a, 0xc0, + 0x2b, 0xc0, 0xca, 0x10, 0xca, 0x51, 0xcb, 0x12, + 0xcb, 0x53, 0xd1, 0x40, 0xd3, 0x41, 0xb7, 0x3f, + 0xc0, 0x5c, 0xe1, 0x7b, 0xd0, 0xc0, 0xc1, 0x28, + 0xc2, 0x2a, 0xc2, 0xab, 0xf1, 0x7a, 0x0f, 0x17, + 0xfa, 0xef, 0xcc, 0xe8, 0xcd, 0x29, 0xcd, 0x6c, + 0xcd, 0xad, 0xc8, 0x08, 0xc8, 0x49, 0xca, 0x0a, + 0xca, 0x4b, 0xf3, 0x31, 0xd0, 0xc1, 0xc1, 0x34, + 0xc2, 0x2a, 0xc2, 0xab, 0xf1, 0x7a, 0x00, 0x28, + 0xd9, 0xc0, 0xc8, 0x88, 0xc8, 0xc9, 0xa9, 0xf8, + 0xca, 0x8a, 0xca, 0xcb, 0x11, 0x62, 0xe9, 0x79, + 0xd0, 0xc0, 0xc1, 0x35, 0xc2, 0x2e, 0xc2, 0xaf, + 0xf1, 0x7a, 0xc9, 0x08, 0xc9, 0x49, 0xa9, 0xf8, + 0xcb, 0x0a, 0xcb, 0x4b, 0xd0, 0xc1, 0xc1, 0x36, + 0xc2, 0x2e, 0xc2, 0xaf, 0xf1, 0x7a, 0xc0, 0x27, + 0xc9, 0x88, 0xc9, 0xc9, 0xa0, 0x38, 0xcb, 0x8a, + 0xcb, 0xcb, 0xe1, 0x79, 0x5f, 0x0d, 0x07, 0x7d, + 0xde, 0x07, 0x11, 0x5e, 0x30, 0x05, 0xcd, 0xc0, + 0x00, 0x28, 0xd0, 0x00, 0xa0, 0x38, 0x11, 0x61, + 0xf9, 0x75, 0x00, 0xe2, 0xd0, 0x00, 0x0f, 0x1d, + 0xeb, 0x29, 0x00, 0x2d, 0xdf, 0x4b, 0xf3, 0x3f, + 0xe1, 0x75, 0x04, 0xeb, 0xd0, 0x00, 0x11, 0x62, + 0xeb, 0x36, 0xb0, 0x20, 0x0f, 0x19, 0xfb, 0x36, + 0xac, 0xe0, 0x01, 0xa4, 0xde, 0x00, 0x5e, 0x0d, + 0x00, 0x2d, 0xdf, 0x7a, 0xdd, 0xc0, 0xd8, 0x80, + 0xd9, 0x00, 0xd9, 0x80, 0x5f, 0x00, 0x01, 0x46, + 0x00, 0x28, 0xd0, 0x01, 0x00, 0x06, 0xa0, 0x37, + 0x80, 0x3f, 0x00, 0xc6, 0x0f, 0xc5, 0xad, 0xda, + 0xc6, 0xb1, 0xd0, 0x01, 0x01, 0xa3, 0xde, 0x1d, + 0x40, 0x30, 0x3e, 0x00, 0x80, 0x3f, 0x0e, 0x0a, + 0x66, 0xda, 0xc8, 0x28, 0xc8, 0x69, 0xc8, 0xaa, + 0xc8, 0xeb, 0x0c, 0x1e, 0xfb, 0x68, 0x26, 0xba, + 0x07, 0x7d, 0xdc, 0x00, 0x1d, 0xcf, 0x1d, 0xd1, + 0x5d, 0xc0, 0x00, 0x2d, 0xdf, 0x64, 0x0f, 0x87, + 0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, + 0xc9, 0x2c, 0xc9, 0x6d, 0xc9, 0xae, 0xc9, 0xef, + 0x0f, 0x2f, 0xd0, 0x37, 0x4f, 0x00, 0x0f, 0x1a, + 0xeb, 0xbe, 0x01, 0xa4, 0xde, 0x20, 0xd0, 0x01, + 0x40, 0x3c, 0x2e, 0x00, 0x00, 0x2d, 0xdf, 0x7a, + 0xac, 0xe0, 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe0, + 0xbf, 0x79, 0xbe, 0x3c, 0x0f, 0x1b, 0xeb, 0x9e, + 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe1, 0xbf, 0x79, + 0xbe, 0x34, 0x18, 0xa0, 0xeb, 0xb9, 0x0f, 0x87, + 0xad, 0x20, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe2, + 0xbf, 0x79, 0xbe, 0x3c, 0x0f, 0x87, 0x0e, 0x0a, + 0x76, 0xe3, 0x0f, 0x1b, 0xeb, 0xb3, 0xbf, 0x77, + 0xbe, 0x0c, 0x19, 0x20, 0xeb, 0xb9, 0x0f, 0x87, + 0xad, 0x60, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe4, + 0xbe, 0x3c, 0xbf, 0x75, 0x0f, 0x15, 0xf8, 0x1c, + 0x1f, 0x0a, 0x1f, 0x16, 0x0f, 0x87, 0x0e, 0x0a, + 0x76, 0xe5, 0xbf, 0x79, 0xbe, 0x34, 0x19, 0xa0, + 0xeb, 0xb9, 0x0f, 0x87, 0xad, 0xa0, 0x80, 0x3f, + 0x0e, 0x0a, 0x76, 0xe6, 0xbe, 0x3c, 0xbf, 0x79, + 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe7, 0x0f, 0x15, + 0xeb, 0xbe, 0x00, 0x2f, 0xdf, 0x72, 0x1d, 0xe0, + 0xf8, 0x1c, 0x00, 0x28, 0xd0, 0x01, 0xa0, 0x38, + 0x80, 0x3f, 0x0f, 0x87, 0xd0, 0x01, 0x4d, 0xc0, + 0x1f, 0x0f, 0x1f, 0x11, 0x00, 0x2f, 0xdf, 0x76, + 0xc6, 0xb2, 0x03, 0x7d, 0xde, 0x0e, 0x01, 0xa3, + 0xde, 0x2d, 0x5d, 0xc0, 0x0f, 0x87, 0x1e, 0xe1, + 0xeb, 0xdb, 0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, + 0x66, 0xda, 0x0c, 0x1e, 0xfb, 0xe4, 0x26, 0xbb, + 0x03, 0xff, 0xdd, 0xff, 0x4d, 0xc0, 0x00, 0xa3, + 0xde, 0x2d, 0xbf, 0x56, 0x0f, 0x87, 0x07, 0x7d, + 0xde, 0x0e, 0x5d, 0xc0, 0x00, 0xa3, 0xde, 0x1d, + 0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, + 0xdf, 0x5c, 0xd0, 0x0e, 0x4f, 0x00, 0x0f, 0x87, + 0xd0, 0x06, 0x40, 0x3c, 0xeb, 0xf0, 0xbf, 0x3e, + 0xb0, 0x04, 0xe7, 0xf2, 0xeb, 0xf6, 0xbf, 0x0c, + 0xbf, 0x3a, 0x0f, 0x87, 0x0f, 0x1d, 0xfb, 0x4b, + 0xbf, 0x38, 0x0f, 0x87, 0x0f, 0x1c, 0xfb, 0xcb, + 0xbf, 0x30, 0x0f, 0x87, 0x50, 0x00, 0x50, 0x00, + 0x0f, 0x17, 0xf9, 0x70, 0x90, 0x4d, 0x10, 0x60, + 0xe5, 0x72, 0x0f, 0x49, 0x90, 0x4d, 0x10, 0x60, + 0xe5, 0x76, 0x0f, 0x19, 0xf9, 0x79, 0x01, 0x46, + 0xd0, 0x11, 0xa0, 0x38, 0x80, 0x3f, 0x00, 0xc6, + 0xdf, 0x00, 0x00, 0x06, 0x08, 0x20, 0xd0, 0x00, + 0x10, 0x08, 0xa0, 0x0a, 0xa0, 0x1b, 0x0c, 0x20, + 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0x90, 0x4d, + 0x0f, 0xff, 0xd8, 0x1f, 0x40, 0x40, 0xa0, 0x4d, + 0x80, 0x0a, 0xd0, 0x00, 0x06, 0x50, 0xf9, 0x95, + 0xd0, 0x01, 0xa0, 0x09, 0x80, 0x1b, 0xa0, 0x27, + 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, + 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, + 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x40, + 0xa0, 0x69, 0x80, 0x2b, 0x80, 0x07, 0x08, 0x20, + 0xdf, 0x00, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38, + 0x80, 0x3f, 0x01, 0xb0, 0xd0, 0x10, 0xa0, 0x37, + 0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38, + 0xd0, 0x10, 0xa0, 0x38, 0x15, 0x63, 0xe9, 0xba, + 0x05, 0x5e, 0xf9, 0xfa, 0xc0, 0xdf, 0x00, 0xe0, + 0xd1, 0x80, 0x70, 0x06, 0x10, 0x1c, 0xc1, 0x40, + 0x11, 0x48, 0xd3, 0x10, 0x00, 0x21, 0xd0, 0x80, + 0xb0, 0x16, 0xe9, 0xca, 0xd3, 0x20, 0x10, 0x81, + 0xb0, 0x16, 0xf9, 0xfa, 0x30, 0xc2, 0xd2, 0x5e, + 0xd0, 0x8f, 0x00, 0xee, 0xd0, 0x54, 0x70, 0x41, + 0x30, 0x43, 0xed, 0xd7, 0xd2, 0x6c, 0x72, 0x49, + 0xc0, 0x89, 0xb0, 0xbf, 0x10, 0x9f, 0x22, 0x42, + 0x04, 0x31, 0xd0, 0x10, 0xc0, 0x42, 0x30, 0x49, + 0xe5, 0xde, 0x10, 0x03, 0xc1, 0x0c, 0xc1, 0x83, + 0xb1, 0xbe, 0x01, 0x46, 0x00, 0x06, 0xa0, 0x3d, + 0xa0, 0x3c, 0x60, 0x06, 0x00, 0xc6, 0xb1, 0xbc, + 0xb1, 0x01, 0xed, 0xe1, 0xc1, 0x0c, 0x21, 0x85, + 0x01, 0x46, 0x00, 0x06, 0xa0, 0x3d, 0xa0, 0x3c, + 0x60, 0x06, 0x00, 0xc6, 0xb1, 0xbc, 0xb1, 0x01, + 0xed, 0xec, 0x02, 0xe4, 0xd0, 0x00, 0x20, 0xc0, + 0xb2, 0x41, 0xed, 0xd8, 0x15, 0xa3, 0xfa, 0x00, + 0xbc, 0x10, 0x0c, 0x1e, 0xfa, 0x00, 0xbc, 0x10, + 0xd0, 0x04, 0x70, 0x00, 0x10, 0x20, 0xfa, 0x00, + 0x00, 0x27, 0xd0, 0x10, 0xd0, 0x40, 0x60, 0x40, + 0x00, 0x26, 0xd0, 0x14, 0x60, 0x40, 0xb0, 0x28, + 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x01, 0x7a, + 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, + 0x00, 0x28, 0xd1, 0xb0, 0x70, 0x06, 0xd0, 0x81, + 0x60, 0x86, 0x10, 0x20, 0xe9, 0xab, 0xb0, 0x3f, + 0x60, 0x06, 0x00, 0xec, 0xd1, 0x84, 0x70, 0x46, + 0xb1, 0x84, 0x70, 0x86, 0x30, 0x42, 0xe9, 0xab, + 0x70, 0x42, 0xd0, 0x35, 0x30, 0x40, 0xf9, 0xab, + 0x00, 0x63, 0xd0, 0x3f, 0xb0, 0xbc, 0x40, 0x80, + 0x70, 0xc2, 0x10, 0xe3, 0xe5, 0xab, 0xb0, 0xbc, + 0x40, 0x80, 0x60, 0x86, 0x00, 0x28, 0xd0, 0x24, + 0x70, 0x40, 0x00, 0x22, 0xd0, 0x80, 0x50, 0x42, + 0x60, 0x40, 0x00, 0x64, 0xd0, 0x60, 0xd0, 0x90, + 0x60, 0x81, 0x00, 0xed, 0xd1, 0x88, 0x70, 0x46, + 0x10, 0xe4, 0xe9, 0xa8, 0x00, 0x21, 0xd0, 0xe8, + 0xd0, 0x00, 0x60, 0x03, 0xd0, 0x81, 0x40, 0x42, + 0x60, 0x46, 0x02, 0x3c, 0xda, 0x89, 0xe0, 0x46, + 0xd0, 0x82, 0x50, 0x42, 0x60, 0x46, 0x00, 0x23, + 0xd5, 0x3e, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, + 0x01, 0x46, 0xdf, 0x5c, 0x08, 0x20, 0xd1, 0x00, + 0xcf, 0x04, 0x11, 0x08, 0xa1, 0x0a, 0xa1, 0x1b, + 0x11, 0x1f, 0xa1, 0x27, 0xd2, 0x80, 0xb2, 0x81, + 0x90, 0x4d, 0xc0, 0x01, 0x10, 0x14, 0x00, 0x16, + 0xe9, 0x8d, 0x80, 0x33, 0x80, 0x3f, 0x92, 0x8b, + 0x00, 0x23, 0xd0, 0x3f, 0x42, 0x80, 0xe9, 0x8d, + 0x0f, 0xff, 0xdf, 0xff, 0x40, 0x01, 0xa0, 0x0d, + 0xe1, 0x94, 0xa1, 0x0a, 0x00, 0xea, 0xd0, 0x00, + 0xd0, 0x8e, 0x00, 0x06, 0x0f, 0x0b, 0x70, 0x80, + 0x80, 0x73, 0x80, 0x0a, 0xd0, 0x00, 0x06, 0x50, + 0xf9, 0x9a, 0xd0, 0x01, 0xd0, 0x44, 0x40, 0x70, + 0x20, 0x01, 0x15, 0x63, 0xf9, 0xa1, 0x80, 0x1b, + 0xe1, 0xa2, 0x80, 0x5b, 0xa0, 0x27, 0x01, 0x20, + 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, + 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, + 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x40, 0xa0, 0x69, + 0x80, 0x2b, 0x80, 0x07, 0x08, 0x20, 0xd0, 0x00, + 0xcf, 0x00, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38, + 0x80, 0x3f, 0x01, 0xb2, 0xd2, 0x10, 0xa0, 0x37, + 0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38, + 0x00, 0x30, 0xd0, 0x10, 0xa0, 0x38, 0x80, 0x3f, + 0x00, 0xc6, 0x00, 0x28, 0xd1, 0x24, 0x70, 0x04, + 0xd0, 0x41, 0x50, 0x01, 0x60, 0x04, 0x00, 0x27, + 0xd0, 0x18, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, + 0x00, 0x26, 0xd0, 0x20, 0x70, 0x40, 0xb0, 0x7f, + 0x60, 0x40, 0x08, 0x20, 0xdf, 0x00, 0xd4, 0x00, + 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 0xd3, 0x81, + 0x12, 0xa0, 0xed, 0xe3, 0xd0, 0x08, 0x0a, 0x09, + 0x00, 0x4d, 0xb0, 0x01, 0xed, 0xdf, 0x03, 0xbe, + 0xd6, 0x27, 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, + 0x02, 0x24, 0xd0, 0x00, 0xa0, 0x37, 0x00, 0x27, + 0xd3, 0xd0, 0x00, 0x26, 0xd0, 0x04, 0x73, 0xcf, + 0x13, 0xe1, 0xe9, 0x7b, 0xb0, 0x3c, 0xf2, 0x00, + 0x00, 0x26, 0xd0, 0x40, 0xd0, 0x00, 0x60, 0x01, + 0x00, 0x26, 0xd0, 0x14, 0xf2, 0x00, 0x00, 0x26, + 0xd0, 0x18, 0xf2, 0x00, 0x00, 0xee, 0xd0, 0x1c, + 0x71, 0x40, 0xd1, 0x1e, 0x15, 0x63, 0xe9, 0x8d, + 0x11, 0x1f, 0xc7, 0x1a, 0xb7, 0x01, 0xd3, 0x81, + 0xc4, 0xd4, 0xf2, 0x04, 0x00, 0x26, 0xd0, 0x18, + 0x70, 0x40, 0xb0, 0x54, 0xfd, 0x9b, 0x00, 0xed, + 0xd0, 0x24, 0xd0, 0x44, 0x60, 0x40, 0x13, 0xe1, + 0xf9, 0xbc, 0x15, 0xa3, 0xf9, 0xa1, 0x0c, 0x10, + 0xe9, 0xb9, 0x11, 0x61, 0xe5, 0xb3, 0xed, 0xb9, + 0x15, 0xa3, 0xf9, 0xab, 0x00, 0x26, 0xd0, 0x14, + 0x70, 0x40, 0x10, 0x62, 0xf5, 0xb3, 0x15, 0x22, + 0xe5, 0xb3, 0xc0, 0x44, 0x30, 0x54, 0xe5, 0xb3, + 0x34, 0xd4, 0xf5, 0xb3, 0xe1, 0xbf, 0x03, 0xb3, + 0xd8, 0x29, 0x00, 0x26, 0xd0, 0x40, 0x60, 0x01, + 0xe1, 0xdb, 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, + 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x80, 0x07, + 0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, + 0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c, 0xd3, 0x80, + 0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d, + 0x00, 0x50, 0xf9, 0xc9, 0x0c, 0x49, 0xd0, 0x61, + 0x00, 0x8d, 0x10, 0xa0, 0xe9, 0x90, 0x30, 0x42, + 0xf5, 0xd8, 0xd0, 0x61, 0x23, 0x81, 0xe1, 0xce, + 0x23, 0x82, 0x13, 0xa1, 0xf9, 0x90, 0xd0, 0x42, + 0x15, 0xa1, 0xf9, 0xdf, 0xb0, 0x7f, 0x00, 0x26, + 0xd0, 0x14, 0x70, 0x00, 0x30, 0x01, 0xf5, 0xe8, + 0x16, 0xe0, 0xe5, 0xe8, 0xb6, 0xc1, 0xbc, 0x20, + 0xc0, 0x44, 0x30, 0x5b, 0xfd, 0xb9, 0xc0, 0x44, + 0x30, 0x54, 0xe5, 0xb9, 0x15, 0x63, 0xf9, 0xf8, + 0x15, 0xa3, 0xf9, 0xf5, 0x03, 0x3b, 0xda, 0x1c, + 0xe0, 0x46, 0x03, 0x38, 0xdc, 0x17, 0xe0, 0x46, + 0x15, 0xa3, 0xf9, 0xfd, 0x03, 0x72, 0xd0, 0x19, + 0xe0, 0x46, 0x03, 0x3f, 0xd2, 0x17, 0xe0, 0x46, + 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x0f, 0xc5, + 0xdf, 0x00, 0x0c, 0x09, 0x05, 0x0d, 0x08, 0x20, + 0xdf, 0x00, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, + 0x00, 0xef, 0xd0, 0x14, 0x70, 0x40, 0x10, 0x60, + 0xe9, 0x45, 0xb0, 0x04, 0x70, 0x40, 0xb0, 0x41, + 0xed, 0x44, 0x00, 0xed, 0xd0, 0x24, 0xd0, 0x44, + 0x60, 0x40, 0x00, 0x64, 0xd0, 0x20, 0x70, 0x00, + 0x10, 0x30, 0xe9, 0x45, 0x00, 0x21, 0xd0, 0x28, + 0x60, 0x40, 0x00, 0x64, 0xd2, 0xc0, 0x70, 0x0b, + 0x00, 0x11, 0xe9, 0x6a, 0x08, 0x20, 0xd0, 0x4f, + 0x30, 0x40, 0xe9, 0x55, 0xb0, 0x4f, 0xf9, 0x6a, + 0x03, 0xef, 0xdf, 0xbf, 0xaf, 0xb8, 0xdf, 0x80, + 0x0f, 0x87, 0xd0, 0x18, 0x70, 0x00, 0x10, 0x20, + 0xed, 0x6c, 0xdf, 0x84, 0xd0, 0x40, 0x60, 0x7e, + 0x00, 0x27, 0xd0, 0x54, 0x70, 0x41, 0x10, 0x60, + 0x01, 0xa0, 0xd0, 0x40, 0xa0, 0x78, 0x80, 0x34, + 0x80, 0x3f, 0x01, 0x3c, 0xd2, 0x39, 0x00, 0x21, + 0xdf, 0x86, 0x0f, 0x87, 0xd0, 0x40, 0x60, 0x4b, + 0x03, 0xe5, 0xd0, 0x10, 0xe0, 0x36, 0x50, 0x00, + 0x00, 0x28, 0xd0, 0x24, 0x72, 0xc0, 0xd0, 0x40, + 0x60, 0x40, 0xd0, 0x0c, 0x52, 0xc0, 0xc0, 0x1c, + 0x30, 0x1d, 0xf5, 0x3c, 0x20, 0x1f, 0x30, 0x1e, + 0x90, 0x6d, 0x20, 0x01, 0x00, 0x22, 0xd0, 0x58, + 0x60, 0x01, 0x00, 0xe3, 0xd0, 0x48, 0x70, 0x41, + 0x30, 0x40, 0xf5, 0x47, 0xb2, 0xc8, 0x00, 0xe3, + 0xd0, 0x4c, 0x70, 0x41, 0x30, 0x40, 0xfd, 0x4d, + 0xb2, 0xc4, 0x00, 0x28, 0xd0, 0x20, 0x70, 0x00, + 0x42, 0xc0, 0xa2, 0xc5, 0x12, 0xe0, 0xe9, 0x55, + 0x80, 0x40, 0x80, 0x34, 0x80, 0x3f, 0xcf, 0x95, + 0x82, 0x34, 0x80, 0x3f, 0x03, 0xe7, 0xd0, 0x08, + 0x1f, 0xa3, 0xe9, 0x60, 0x03, 0xe9, 0xd0, 0x08, + 0x00, 0x27, 0xd0, 0x4c, 0x7f, 0x81, 0x00, 0x27, + 0xd0, 0x54, 0x70, 0x41, 0x10, 0x60, 0x03, 0xa0, + 0xd0, 0x40, 0xa0, 0x78, 0xe0, 0x3c, 0x50, 0x00, + 0xc0, 0x84, 0x10, 0x8c, 0x10, 0x92, 0xd0, 0x41, + 0x30, 0x4d, 0x40, 0x43, 0x10, 0x43, 0x20, 0x81, + 0xd1, 0x8f, 0x41, 0x82, 0x10, 0x9c, 0x20, 0x9b, + 0xc1, 0xc2, 0x10, 0x82, 0x20, 0x87, 0xc0, 0x42, + 0x10, 0x43, 0x20, 0x81, 0x10, 0x88, 0x22, 0x02, + 0x10, 0x97, 0x01, 0xd0, 0xe9, 0x48, 0xb0, 0x96, + 0x10, 0x88, 0x22, 0x82, 0xc0, 0x5c, 0x10, 0x48, + 0xc0, 0x84, 0x10, 0x91, 0x10, 0x86, 0x20, 0x42, + 0x41, 0x0d, 0x11, 0x02, 0x20, 0x44, 0x22, 0x01, + 0x22, 0x81, 0x02, 0xe4, 0xd2, 0x40, 0xc2, 0xca, + 0xb2, 0xe0, 0x01, 0xd0, 0xe9, 0x5e, 0xc2, 0xca, + 0x22, 0xc9, 0xb2, 0xa0, 0x22, 0x48, 0xd0, 0x78, + 0x03, 0x50, 0xf9, 0x69, 0xd0, 0x7c, 0x01, 0x9d, + 0xf9, 0x69, 0xc2, 0x48, 0xb2, 0x60, 0xc2, 0xca, + 0xb2, 0xf0, 0x11, 0x82, 0x41, 0x81, 0x22, 0x06, + 0x11, 0x9f, 0x41, 0x81, 0x22, 0x86, 0x0f, 0xc5, + 0xc0, 0x84, 0x10, 0x8c, 0x10, 0x92, 0xd1, 0x8f, + 0x41, 0x82, 0x10, 0x9c, 0xc1, 0xdb, 0x11, 0xc1, + 0x21, 0xc3, 0x20, 0x87, 0xc1, 0xc2, 0x10, 0x82, + 0x20, 0x87, 0xc0, 0x42, 0x10, 0x43, 0x20, 0x81, + 0x10, 0x88, 0x22, 0x02, 0x10, 0x97, 0x01, 0xd0, + 0xe9, 0x46, 0xb0, 0x96, 0x10, 0x88, 0x22, 0x82, + 0xc0, 0x5c, 0x10, 0x48, 0xc0, 0x84, 0x10, 0x91, + 0x10, 0x86, 0x20, 0x42, 0xd0, 0x81, 0x41, 0x02, + 0x11, 0x02, 0x20, 0x44, 0x22, 0x01, 0x22, 0x81, + 0x02, 0xe4, 0xd2, 0x40, 0xc2, 0xca, 0xb2, 0xe0, + 0x01, 0xd0, 0xe9, 0x5d, 0xc2, 0xca, 0x22, 0xc9, + 0xb2, 0xa0, 0x22, 0x48, 0x11, 0x9f, 0x11, 0x83, + 0x22, 0x06, 0x11, 0x9c, 0x11, 0x83, 0x22, 0x86, + 0x0f, 0xc5, 0xd0, 0x41, 0x40, 0x44, 0x20, 0x55, + 0x10, 0x62, 0xf9, 0x6f, 0x01, 0x74, 0xd6, 0x00, + 0xc2, 0x9f, 0xc2, 0x1f, 0x22, 0x80, 0xe1, 0x30, + 0x0f, 0x11, 0xf9, 0x51, 0x90, 0x38, 0x80, 0x3f, + 0x00, 0x1b, 0xf9, 0x51, 0x00, 0x27, 0xd0, 0x04, + 0x70, 0x40, 0x30, 0x71, 0xf9, 0x51, 0xb0, 0x3c, + 0x70, 0x40, 0x30, 0x5d, 0xf9, 0x51, 0xb0, 0x08, + 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x10, 0x63, + 0xe5, 0x5d, 0x02, 0x20, 0xd0, 0x01, 0xa0, 0x37, + 0x00, 0x26, 0xd0, 0x24, 0x70, 0x40, 0xb0, 0x7f, + 0x60, 0x40, 0xb0, 0x08, 0x70, 0x40, 0xb0, 0x41, + 0x60, 0x40, 0x00, 0x26, 0xd0, 0x30, 0x70, 0x40, + 0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x30, 0xd0, 0x40, + 0x60, 0x40, 0xb0, 0x3c, 0x6c, 0x40, 0xb0, 0x3c, + 0x67, 0x40, 0x00, 0x33, 0xdf, 0x78, 0xe0, 0x36, + 0x00, 0x26, 0xd0, 0x1c, 0x70, 0x40, 0xb0, 0x7f, + 0x60, 0x40, 0xb0, 0x3c, 0x70, 0x40, 0xb0, 0x41, + 0x60, 0x40, 0x08, 0x20, 0xdf, 0x00, 0x80, 0x35, + 0xc0, 0x3c, 0x10, 0x08, 0xa0, 0x0a, 0xa0, 0x27, + 0xa0, 0x1b, 0xdf, 0x5c, 0x01, 0xa0, 0xd0, 0x00, + 0xa0, 0x38, 0x80, 0x3f, 0x80, 0x34, 0x80, 0x3f, + 0x03, 0xba, 0xda, 0x1e, 0xcf, 0x95, 0x82, 0x34, + 0x80, 0x3f, 0x03, 0xe7, 0xd0, 0x08, 0x1f, 0xa3, + 0xe9, 0x55, 0x1f, 0xa0, 0xe9, 0x55, 0x03, 0xe9, + 0xd0, 0x08, 0x00, 0x21, 0xdf, 0x86, 0xe0, 0x3c, + 0x89, 0x78, 0x89, 0x37, 0x00, 0xee, 0xd0, 0x14, + 0x76, 0x00, 0xd0, 0x30, 0x76, 0x40, 0x26, 0x58, + 0xd6, 0xd9, 0x00, 0xee, 0xd0, 0x20, 0x75, 0x40, + 0xd0, 0x1c, 0x71, 0x40, 0xd0, 0x20, 0x71, 0x00, + 0xd0, 0x24, 0x70, 0x80, 0xc4, 0x02, 0xd0, 0x28, + 0x70, 0xc0, 0x00, 0x21, 0xd0, 0x10, 0x72, 0x00, + 0x93, 0x90, 0xd4, 0x81, 0x13, 0x96, 0x43, 0x92, + 0x34, 0x8e, 0x00, 0x22, 0xd1, 0xa4, 0x71, 0x86, + 0xde, 0x40, 0x7e, 0x79, 0xd0, 0x18, 0x70, 0x40, + 0xb0, 0x41, 0xf5, 0x58, 0xd3, 0x42, 0x50, 0x4d, + 0x60, 0x40, 0x10, 0x60, 0xe5, 0x62, 0xd0, 0x54, + 0x70, 0x01, 0xb0, 0x3c, 0x60, 0x01, 0x04, 0x2d, + 0xd0, 0x08, 0xe0, 0x36, 0x00, 0x22, 0xd0, 0x60, + 0x71, 0xc1, 0xd0, 0x4f, 0x41, 0xc1, 0x03, 0xef, + 0xd0, 0x30, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, + 0x04, 0x21, 0xd0, 0x20, 0xd3, 0x44, 0x72, 0x8d, + 0x12, 0xa0, 0xe8, 0x36, 0xc0, 0x47, 0x10, 0x5d, + 0x30, 0x4e, 0xf8, 0x36, 0xb2, 0x3e, 0x60, 0x4d, + 0x00, 0xed, 0xd0, 0x48, 0x70, 0x01, 0xde, 0x45, + 0x50, 0x39, 0x00, 0x1b, 0xf9, 0x44, 0xb0, 0x01, + 0x00, 0x1c, 0xf9, 0x47, 0xb0, 0x04, 0x60, 0x01, + 0xd0, 0x40, 0x62, 0x81, 0xce, 0x4a, 0xd0, 0x43, + 0x41, 0xc1, 0xd0, 0x58, 0x61, 0xc1, 0x90, 0x43, + 0x00, 0xe0, 0xd0, 0x28, 0x70, 0x00, 0x10, 0x1f, + 0x20, 0x40, 0xb1, 0xc1, 0xf5, 0x54, 0x00, 0x21, + 0xd0, 0x08, 0x60, 0x40, 0x00, 0xe6, 0xd0, 0x40, + 0x70, 0x41, 0xd2, 0x94, 0x60, 0x4a, 0x04, 0x2b, + 0xd0, 0x10, 0x01, 0x90, 0xf8, 0x36, 0x04, 0x2d, + 0xd0, 0x08, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, + 0xc0, 0x47, 0x10, 0x5d, 0x30, 0x4e, 0xf9, 0x41, + 0x90, 0x43, 0x00, 0xe0, 0xd0, 0x28, 0x70, 0x00, + 0x20, 0x40, 0x00, 0x21, 0xd0, 0x08, 0x60, 0x40, + 0x00, 0x26, 0xd0, 0x74, 0x70, 0x01, 0xb0, 0x3f, + 0x60, 0x01, 0x00, 0xed, 0xd0, 0x48, 0x70, 0x41, + 0x00, 0x5e, 0xf9, 0x4b, 0x00, 0x21, 0xd0, 0x00, + 0x73, 0x80, 0xd4, 0x81, 0x34, 0x8e, 0x00, 0x34, + 0xd3, 0x48, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, + 0xd1, 0x88, 0xd1, 0xc8, 0x01, 0x1b, 0xe9, 0x39, + 0x11, 0x9f, 0x11, 0xdf, 0xd4, 0x80, 0xd3, 0x81, + 0xe1, 0x43, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x00, + 0x00, 0x10, 0xf9, 0x37, 0x0c, 0x1f, 0xf9, 0x36, + 0x13, 0xa1, 0xe9, 0x43, 0xbe, 0x7c, 0x00, 0x65, + 0xd2, 0x46, 0x12, 0x48, 0xc0, 0x39, 0x30, 0x18, + 0xe5, 0x4b, 0xd2, 0x70, 0x72, 0x49, 0x22, 0x79, + 0x00, 0x21, 0xd0, 0x00, 0x63, 0x80, 0x04, 0x24, + 0xd0, 0x00, 0x02, 0x10, 0xe9, 0x56, 0xd0, 0x41, + 0x51, 0x41, 0xe0, 0x36, 0x15, 0x61, 0xe8, 0x36, + 0xd5, 0x80, 0xd3, 0x00, 0xd3, 0x40, 0x04, 0x27, + 0xd0, 0x20, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, + 0x00, 0x21, 0xd0, 0x18, 0x73, 0x00, 0xb0, 0x04, + 0x73, 0x80, 0xd2, 0x80, 0xb0, 0x38, 0x72, 0xc0, + 0x31, 0x0d, 0xc0, 0x0e, 0x10, 0x0b, 0x10, 0x20, + 0xe9, 0x42, 0xf5, 0x3f, 0x22, 0x8d, 0x10, 0x01, + 0x13, 0x5f, 0xe1, 0x3b, 0x33, 0x8b, 0x15, 0x61, + 0xf9, 0x49, 0x00, 0x21, 0xd0, 0x64, 0x70, 0x41, + 0x33, 0x81, 0x03, 0xd0, 0xe9, 0x4c, 0x20, 0x0b, + 0x13, 0xdf, 0x12, 0xc1, 0x13, 0xe0, 0xf9, 0x49, + 0x10, 0x03, 0xc0, 0x50, 0x10, 0x4b, 0x13, 0x0b, + 0x23, 0x00, 0x13, 0x20, 0xe9, 0x5c, 0xf5, 0x59, + 0x22, 0x81, 0x13, 0x01, 0x10, 0x5f, 0xe1, 0x55, + 0x12, 0x99, 0x12, 0x87, 0x21, 0x0a, 0x00, 0xa0, + 0xd2, 0x80, 0xc3, 0x0a, 0x03, 0x90, 0xe9, 0x66, + 0x22, 0x82, 0x23, 0x03, 0x10, 0x81, 0x10, 0xc1, + 0x13, 0x9f, 0x13, 0xa0, 0xed, 0x62, 0xc0, 0x8a, + 0xc0, 0xcc, 0x04, 0x26, 0xd0, 0x00, 0xe0, 0x36, + 0x15, 0x61, 0xf9, 0x3d, 0x07, 0x32, 0xd0, 0x00, + 0x30, 0x03, 0xed, 0x3d, 0xc0, 0x03, 0x10, 0x1d, + 0x30, 0xc0, 0xc0, 0x02, 0x10, 0x1d, 0x30, 0x80, + 0xe1, 0x32, 0x10, 0x94, 0x10, 0xd4, 0x00, 0x21, + 0xd0, 0x20, 0x73, 0x00, 0xc5, 0x8c, 0xd3, 0x4e, + 0x01, 0x1b, 0xe9, 0x48, 0x13, 0x1f, 0xd3, 0x4f, + 0x43, 0x4c, 0x13, 0x1c, 0xc0, 0x0c, 0x10, 0x03, + 0x20, 0x0c, 0xc0, 0x40, 0x10, 0x42, 0x20, 0x40, + 0x10, 0x46, 0x20, 0x4d, 0x10, 0x42, 0x2e, 0x41, + 0x10, 0x5c, 0x10, 0x43, 0x00, 0x59, 0xe9, 0x5b, + 0x01, 0x69, 0xd0, 0x20, 0x30, 0x40, 0x22, 0x41, + 0x04, 0x27, 0xd0, 0x20, 0xe0, 0x36, 0x50, 0x00, + 0x2c, 0x14, 0xd0, 0x34, 0x63, 0x00, 0xd0, 0x38, + 0x72, 0xc0, 0xc0, 0x51, 0x10, 0x5c, 0x30, 0x4b, + 0x10, 0x44, 0xd4, 0xc0, 0xd5, 0x00, 0xc0, 0x18, + 0x30, 0x39, 0xed, 0x5f, 0xd4, 0xd0, 0xc5, 0x01, + 0xd0, 0x18, 0x70, 0x00, 0x0c, 0x1f, 0xe9, 0x48, + 0x10, 0x20, 0xfd, 0x48, 0xd4, 0xc0, 0xd5, 0x00, + 0x10, 0x22, 0xe5, 0x4e, 0xd4, 0xc0, 0xbc, 0x30, + 0xd5, 0x00, 0xb5, 0x10, 0xb0, 0x3f, 0xf9, 0x52, + 0x3c, 0x01, 0x3c, 0x01, 0x02, 0x1f, 0xe9, 0x5f, + 0x00, 0xa8, 0xd3, 0xc0, 0xd3, 0x9e, 0x00, 0xa9, + 0xd0, 0x38, 0x70, 0x4f, 0xb3, 0xfc, 0x60, 0x40, + 0xb0, 0x3c, 0xb3, 0x81, 0xed, 0x59, 0x00, 0x21, + 0xd0, 0x28, 0x70, 0x00, 0x10, 0x20, 0xf9, 0x69, + 0x02, 0x1f, 0xf9, 0x6a, 0x90, 0x10, 0x00, 0x1e, + 0xe9, 0x6a, 0xb1, 0x7c, 0x04, 0x29, 0xd0, 0x20, + 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x01, 0x5e, 0xf9, 0x35, 0x01, 0x50, 0xe9, 0x35, + 0xb1, 0x78, 0xd2, 0x00, 0x01, 0x5c, 0xf9, 0x5f, + 0xc0, 0x18, 0x30, 0x39, 0xed, 0x5f, 0x11, 0x9f, + 0xce, 0x58, 0xc2, 0x59, 0x00, 0xa9, 0xd2, 0x38, + 0x14, 0x82, 0x22, 0x12, 0xc0, 0x0c, 0x10, 0x1f, + 0x10, 0x03, 0x22, 0x00, 0x70, 0x48, 0x03, 0x10, + 0xe9, 0x4c, 0xb2, 0x38, 0xbe, 0x60, 0xb2, 0x60, + 0x2e, 0x41, 0x10, 0x5f, 0x00, 0x59, 0xe9, 0x53, + 0x01, 0x69, 0xd0, 0x3c, 0x30, 0x40, 0x22, 0x41, + 0x13, 0x41, 0x2e, 0x4d, 0x13, 0x5d, 0x13, 0x43, + 0x22, 0x4d, 0x14, 0xe0, 0xe9, 0x5f, 0x33, 0x0b, + 0x13, 0x04, 0x2c, 0x0c, 0x35, 0x0c, 0xc3, 0x46, + 0xc3, 0x87, 0x04, 0x61, 0xd0, 0x28, 0x15, 0x62, + 0xfc, 0x36, 0x04, 0x2f, 0xd0, 0x28, 0xe0, 0x36, + 0x00, 0x22, 0xd0, 0x74, 0x74, 0x01, 0xb0, 0x7c, + 0x74, 0x41, 0xb0, 0x7c, 0x00, 0x27, 0xd0, 0x20, + 0x30, 0x11, 0xf5, 0x3b, 0x24, 0x40, 0x71, 0x41, + 0xd1, 0x08, 0xc0, 0x10, 0x10, 0x1c, 0xb0, 0x16, + 0xf9, 0x4a, 0x00, 0x23, 0xd0, 0x30, 0x30, 0x11, + 0xf9, 0x4a, 0xb1, 0x70, 0x01, 0x50, 0xf9, 0x4a, + 0xb1, 0x20, 0x14, 0x41, 0xc0, 0x90, 0x00, 0x2b, + 0xd0, 0xd0, 0x01, 0x50, 0xe9, 0x50, 0xc0, 0xd0, + 0x00, 0x34, 0xdc, 0x00, 0x20, 0x11, 0x10, 0x1f, + 0xa0, 0x1c, 0x00, 0x21, 0xd0, 0x2c, 0x70, 0x00, + 0x10, 0x05, 0x51, 0x40, 0xd0, 0x1c, 0x61, 0x40, + 0xd0, 0x20, 0x61, 0x00, 0xd0, 0x24, 0x60, 0x80, + 0xd0, 0x28, 0x60, 0xc0, 0x04, 0x2d, 0xd0, 0x08, + 0x00, 0x22, 0xd0, 0x64, 0xb1, 0x81, 0x61, 0x81, + 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x90, 0x50, 0xd0, 0x3c, 0x10, 0x41, 0x60, 0x40, + 0x15, 0x62, 0xfd, 0x3d, 0xc0, 0x10, 0x10, 0x1e, + 0x10, 0x07, 0x21, 0x00, 0x10, 0x16, 0x34, 0x00, + 0xc0, 0x90, 0xd3, 0x40, 0x00, 0x24, 0xd3, 0xc0, + 0x04, 0x22, 0xd0, 0x20, 0x01, 0x9f, 0xe8, 0x36, + 0xd0, 0x54, 0x70, 0x41, 0x73, 0x41, 0x04, 0x2e, + 0xd0, 0x00, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, + 0x00, 0xef, 0xd3, 0x30, 0x73, 0x0c, 0xd0, 0x0c, + 0x70, 0x00, 0xc0, 0x40, 0x13, 0x24, 0xf5, 0x42, + 0x13, 0x22, 0xe9, 0x41, 0xe5, 0x43, 0xd3, 0x00, + 0x10, 0x22, 0xf9, 0x41, 0xd0, 0x01, 0xd0, 0x43, + 0xd3, 0x01, 0x21, 0x00, 0xd3, 0x40, 0x03, 0x10, + 0xf9, 0x47, 0xd3, 0x40, 0xe1, 0x61, 0x00, 0x23, + 0xd0, 0x00, 0x10, 0x61, 0xe9, 0x50, 0xb0, 0x33, + 0x10, 0x63, 0xe9, 0x50, 0x00, 0x22, 0xd0, 0x1a, + 0xc3, 0xc0, 0xd2, 0xc0, 0x00, 0x10, 0xe9, 0x55, + 0x22, 0xd0, 0x10, 0x1f, 0x14, 0x01, 0x10, 0x20, + 0xed, 0x52, 0x14, 0x18, 0x12, 0xd8, 0xc0, 0x8b, + 0x32, 0xd0, 0x12, 0xc3, 0x33, 0x4b, 0x13, 0x47, + 0x21, 0x0d, 0x04, 0x22, 0xd0, 0x20, 0xe0, 0x36, + 0x00, 0x24, 0xd0, 0x30, 0xd0, 0x40, 0x60, 0x40, + 0xd3, 0xc7, 0x43, 0xc4, 0x31, 0x0f, 0xd5, 0xd4, + 0x25, 0xcf, 0x15, 0xc4, 0x10, 0xdf, 0xc2, 0xc6, + 0xc3, 0x07, 0x11, 0x81, 0xb1, 0x3b, 0x15, 0x64, + 0xe9, 0x47, 0x10, 0xdf, 0x12, 0xc1, 0x11, 0x81, + 0x11, 0xc1, 0xb1, 0x3f, 0xb5, 0xf8, 0x90, 0x10, + 0x00, 0x16, 0xf9, 0x5e, 0xb5, 0xfc, 0xd0, 0x20, + 0x40, 0x39, 0x2e, 0x4b, 0x22, 0x4c, 0x12, 0x20, + 0xe9, 0x59, 0x20, 0x39, 0x00, 0x1b, 0xe9, 0x59, + 0x2c, 0x13, 0x35, 0x13, 0x0e, 0x5a, 0xf9, 0x59, + 0xb2, 0x38, 0x02, 0xe3, 0xd0, 0x00, 0x0e, 0x5a, + 0xe9, 0x5e, 0x2e, 0x40, 0x01, 0xee, 0xd2, 0x80, + 0x42, 0x84, 0xc0, 0x03, 0x30, 0x02, 0xf5, 0x6b, + 0x31, 0x0a, 0x12, 0x98, 0x20, 0x03, 0xf5, 0x69, + 0x12, 0x9f, 0x12, 0x87, 0x51, 0x0a, 0x00, 0x34, + 0xd4, 0xc8, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, + 0xd3, 0xc7, 0x43, 0xc4, 0x15, 0x61, 0xf9, 0x48, + 0x10, 0xc1, 0xd5, 0xe0, 0xd1, 0x80, 0xd1, 0xc0, + 0x31, 0x0f, 0x13, 0xe1, 0xe9, 0x3c, 0xd3, 0xc0, + 0x00, 0x24, 0xd0, 0x30, 0x63, 0xc0, 0x25, 0xcf, + 0x15, 0xc2, 0xd0, 0x03, 0x40, 0x16, 0x25, 0xc0, + 0x15, 0xc2, 0x15, 0x81, 0x35, 0x91, 0xe1, 0x5c, + 0x00, 0x24, 0xd0, 0x30, 0x63, 0xc0, 0x01, 0x50, + 0xe9, 0x54, 0x15, 0xa0, 0xf9, 0x55, 0x00, 0x24, + 0xd0, 0x34, 0x70, 0x00, 0x10, 0x20, 0xe9, 0x55, + 0xd3, 0xc0, 0x31, 0x0f, 0xd5, 0xfc, 0x25, 0xcf, + 0x15, 0xc3, 0x14, 0xa0, 0xe9, 0x5c, 0xb5, 0xfc, + 0x00, 0x34, 0xd4, 0xc8, 0xe0, 0x36, 0x50, 0x00, + 0xc4, 0x91, 0x34, 0x96, 0xed, 0x34, 0xd4, 0x80, + 0x14, 0x84, 0xb3, 0xc1, 0xe5, 0x41, 0xc0, 0x52, + 0x10, 0x5e, 0x34, 0x81, 0xb3, 0xc1, 0xe5, 0x41, + 0xc0, 0x52, 0x10, 0x5c, 0x24, 0x81, 0xb3, 0xc1, + 0xe5, 0x37, 0x02, 0x68, 0xd0, 0x00, 0xb4, 0xb0, + 0x14, 0x9b, 0x00, 0x23, 0xd0, 0x70, 0x30, 0x52, + 0xed, 0x4a, 0x24, 0x81, 0x20, 0x12, 0xa0, 0x1c, + 0x10, 0x8a, 0x50, 0x83, 0xa0, 0x96, 0xa1, 0x50, + 0xa1, 0x11, 0xc0, 0x52, 0xd4, 0x84, 0x10, 0x6c, + 0xed, 0x56, 0xd4, 0x81, 0xd1, 0x00, 0xb1, 0x13, + 0x00, 0x23, 0xd1, 0x40, 0xc2, 0xb9, 0x22, 0x86, + 0x12, 0x20, 0xf9, 0x66, 0x02, 0xe3, 0xd0, 0x40, + 0x02, 0x9a, 0xe9, 0x63, 0x22, 0x81, 0x02, 0x5a, + 0xe9, 0x66, 0x22, 0x41, 0x75, 0xd7, 0xc3, 0xd7, + 0xd0, 0xd7, 0x00, 0x21, 0xd0, 0xb6, 0x8b, 0x38, + 0x00, 0x33, 0xdc, 0xd0, 0xe0, 0x36, 0x50, 0x00, + 0xd0, 0x7c, 0x60, 0x01, 0xae, 0x52, 0xd0, 0x60, + 0x40, 0x79, 0x00, 0x13, 0xe8, 0xc9, 0xa2, 0x94, + 0x22, 0x86, 0x13, 0xe0, 0xe4, 0xd0, 0x13, 0xc1, + 0x15, 0x62, 0xfc, 0xd1, 0x13, 0xc1, 0xe0, 0xd1, + 0xc3, 0xd7, 0x03, 0xd9, 0xe8, 0xd4, 0x22, 0x8d, + 0x15, 0x62, 0xfc, 0xda, 0x03, 0xda, 0xe8, 0xda, + 0x22, 0x8d, 0x22, 0x8d, 0xce, 0x4a, 0x22, 0x86, + 0x00, 0x14, 0xe8, 0xe0, 0xa2, 0x53, 0x22, 0x47, + 0x03, 0xd1, 0xe8, 0xe8, 0x22, 0x4e, 0x15, 0x62, + 0xfc, 0xe8, 0x03, 0xd2, 0xe8, 0xe8, 0x22, 0x4e, + 0x12, 0x20, 0xe9, 0x09, 0x20, 0x79, 0x00, 0x5b, + 0xe8, 0xf4, 0x15, 0x20, 0xfc, 0xf1, 0x2c, 0x13, + 0x35, 0x13, 0x0e, 0x5b, 0xe8, 0xf4, 0xb2, 0x38, + 0x02, 0x9a, 0xe8, 0xfb, 0x70, 0x08, 0xd0, 0x7c, + 0x42, 0x81, 0x22, 0x98, 0x22, 0x80, 0x02, 0x5a, + 0xe9, 0x11, 0x70, 0x08, 0xd0, 0x78, 0x42, 0x41, + 0x22, 0x59, 0x10, 0x1f, 0x22, 0x40, 0x00, 0x19, + 0xe9, 0x11, 0x01, 0x69, 0xd0, 0x7c, 0x32, 0x41, + 0xe1, 0x11, 0x02, 0xe3, 0xd0, 0x40, 0x02, 0x9a, + 0xe9, 0x0e, 0x22, 0x81, 0x02, 0x5a, 0xe9, 0x11, + 0x22, 0x41, 0x0e, 0x5a, 0xe9, 0x15, 0xce, 0x4a, + 0x3e, 0x46, 0x0f, 0x87, 0xdd, 0x48, 0xe1, 0x19, + 0xdd, 0x40, 0xdc, 0xc8, 0xdd, 0x3c, 0x7d, 0x34, + 0x1d, 0x19, 0x3d, 0x35, 0x4d, 0x33, 0x4c, 0xec, + 0x3d, 0x33, 0xf9, 0x17, 0x0f, 0xc5, 0x50, 0x00, + 0xd0, 0x39, 0xd0, 0x35, 0xd0, 0x1d, 0xd0, 0x2d, + 0xd0, 0x3f, 0xd0, 0x2e, 0xd0, 0x3c, 0xd0, 0x37, + 0xd0, 0x38, 0xd0, 0x19, 0xd0, 0x33, 0xd0, 0x2e, + 0xd0, 0x3d, 0xd0, 0x3e, 0xd0, 0x27, 0xd0, 0x3e, + 0xd0, 0x3a, 0xd0, 0x2f, 0xd0, 0x32, 0x00, 0x00, + 0x47, 0x78, 0x46, 0xc0, 0xe1, 0x01, 0x00, 0x90, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x40, 0x00, 0xe5, 0x9f, 0x20, 0x6c, + 0xe0, 0x21, 0x10, 0x01, 0xe1, 0x02, 0x00, 0x91, + 0xe3, 0x50, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x02, + 0xe3, 0xa0, 0x00, 0x00, 0xeb, 0x00, 0x38, 0x71, + 0xea, 0xff, 0xff, 0xf7, 0xe8, 0xbd, 0x40, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xb5, 0x00, 0x4a, 0x12, + 0x68, 0x10, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x00, + 0xf7, 0xf0, 0xfb, 0x8c, 0xe7, 0xf7, 0xbd, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, + 0xe5, 0x9f, 0x20, 0x2c, 0xe3, 0xa0, 0x10, 0x01, + 0xe1, 0x02, 0x00, 0x91, 0xe3, 0x50, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x02, 0xe3, 0xa0, 0x00, 0x00, + 0xeb, 0x00, 0x38, 0x60, 0xea, 0xff, 0xff, 0xf7, + 0xe8, 0xbd, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x10, + 0x48, 0x02, 0x40, 0x49, 0x60, 0x01, 0x47, 0x70, + 0x70, 0x00, 0x00, 0x34, 0x2e, 0x08, 0x20, 0x28, + 0x47, 0x78, 0x46, 0xc0, 0xe1, 0xa0, 0x09, 0x00, + 0xe1, 0xb0, 0x10, 0x01, 0x03, 0xc0, 0x01, 0x02, + 0x13, 0x80, 0x01, 0x02, 0xe3, 0xa0, 0x13, 0x3f, + 0xe3, 0xa0, 0x30, 0x0e, 0xe1, 0xb0, 0x10, 0x81, + 0x3a, 0x00, 0x00, 0x04, 0xe1, 0xb0, 0x00, 0x80, + 0x32, 0x21, 0x13, 0x03, 0xe2, 0x53, 0x30, 0x01, + 0x1a, 0xff, 0xff, 0xf9, 0xea, 0x00, 0x00, 0x03, + 0xe1, 0xb0, 0x00, 0x80, 0x22, 0x21, 0x13, 0x03, + 0xe2, 0x53, 0x30, 0x01, 0x1a, 0xff, 0xff, 0xf4, + 0xe1, 0xa0, 0x0d, 0x21, 0xe1, 0x2f, 0xff, 0x1e, + 0xe9, 0x2d, 0x41, 0xf0, 0xe2, 0x4d, 0xd0, 0x14, + 0xe3, 0xa0, 0xc0, 0x44, 0xe2, 0x8c, 0xc4, 0x66, + 0xe5, 0x9c, 0xc0, 0x00, 0xe5, 0x9f, 0x01, 0x94, + 0xe5, 0x80, 0xc0, 0x00, 0xe1, 0xa0, 0xc1, 0x4c, + 0xe2, 0x0c, 0xc0, 0x03, 0xe5, 0x9f, 0x01, 0x88, + 0xe5, 0xc0, 0xc0, 0x00, 0xe5, 0x9f, 0x01, 0x84, + 0xe5, 0x90, 0x00, 0x00, 0xe0, 0x80, 0x64, 0x0c, + 0xe1, 0xa0, 0x70, 0x06, 0xe8, 0xb7, 0x00, 0x01, + 0xe2, 0x00, 0x40, 0x1f, 0xe2, 0x8f, 0x2f, 0x69, + 0xe7, 0x92, 0x21, 0x04, 0xe3, 0x52, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x51, 0xe5, 0x9f, 0x32, 0x1c, + 0xe2, 0x83, 0x50, 0xbc, 0xe5, 0x9f, 0x12, 0x1c, + 0xe1, 0x55, 0x00, 0x01, 0x03, 0xa0, 0x50, 0x00, + 0xe5, 0x9f, 0x12, 0x04, 0xe1, 0x51, 0x00, 0x05, + 0x0a, 0x00, 0x00, 0x45, 0xe5, 0x9f, 0x81, 0xf4, + 0xe0, 0x88, 0x80, 0x03, 0xe5, 0x9f, 0x11, 0x5c, + 0xe1, 0xa0, 0x36, 0x20, 0xe2, 0x03, 0x30, 0x0f, + 0xe1, 0x81, 0x10, 0x03, 0xe5, 0x9f, 0x21, 0x48, + 0xe7, 0x92, 0x31, 0x04, 0xe1, 0xa0, 0x39, 0x83, + 0xe1, 0xa0, 0x35, 0xa3, 0xe1, 0x81, 0x10, 0x03, + 0xe1, 0xa0, 0x33, 0xa0, 0xe2, 0x03, 0x30, 0x01, + 0xe1, 0xa0, 0x3b, 0x03, 0xe1, 0x81, 0x10, 0x03, + 0xe1, 0xa0, 0x35, 0x20, 0xe2, 0x03, 0x30, 0x03, + 0xe1, 0xa0, 0x32, 0x03, 0xe1, 0x81, 0x10, 0x03, + 0xe1, 0xa0, 0x3a, 0xa0, 0xe2, 0x03, 0x30, 0x01, + 0xe1, 0xa0, 0x3b, 0x83, 0xe1, 0x81, 0x10, 0x03, + 0xe1, 0xa0, 0x34, 0xa0, 0xe2, 0x03, 0x30, 0x01, + 0xe1, 0xa0, 0x3a, 0x83, 0xe1, 0x81, 0x10, 0x03, + 0xe2, 0x00, 0x30, 0x60, 0xe1, 0xa0, 0x31, 0x03, + 0xe1, 0x81, 0x10, 0x03, 0xe8, 0xa8, 0x00, 0x02, + 0xe5, 0x9f, 0x00, 0xf0, 0xe3, 0xa0, 0x10, 0x30, + 0xe5, 0x80, 0x10, 0x00, 0xe5, 0x9f, 0x00, 0x9c, + 0xe5, 0xd0, 0x40, 0x00, 0xe2, 0x84, 0x10, 0x01, + 0xe5, 0xc0, 0x10, 0x00, 0xe2, 0x04, 0x40, 0x00, + 0xe5, 0x9f, 0x00, 0x98, 0xe5, 0x90, 0x10, 0x00, + 0xe3, 0x11, 0x00, 0x10, 0x1a, 0x00, 0x00, 0x1a, + 0xe5, 0x80, 0x10, 0x00, 0xe5, 0x8f, 0x51, 0x4c, + 0xe1, 0xa0, 0x22, 0x04, 0xe1, 0x82, 0x10, 0x0c, + 0xe5, 0x9f, 0x00, 0xac, 0xe0, 0x80, 0x02, 0x01, + 0xe5, 0x80, 0x70, 0x00, 0xe5, 0x80, 0x80, 0x04, + 0xe5, 0x9f, 0x10, 0x5c, 0xe5, 0x80, 0x10, 0x08, + 0xe5, 0x9f, 0x10, 0x58, 0xe5, 0x80, 0x10, 0x0c, + 0xe5, 0x9f, 0x00, 0x58, 0xe5, 0x90, 0x10, 0x00, + 0xe0, 0x84, 0x00, 0x01, 0xe3, 0xa0, 0x20, 0x01, + 0xe1, 0xa0, 0x00, 0x12, 0xe3, 0xa0, 0x10, 0x40, + 0xe2, 0x81, 0x14, 0x66, 0xe5, 0x81, 0x00, 0x00, + 0xe3, 0xa0, 0x10, 0x01, 0xe1, 0xa0, 0x0c, 0x11, + 0xe3, 0xa0, 0x10, 0xb8, 0xe2, 0x81, 0x14, 0x66, + 0xe5, 0x81, 0x00, 0x00, 0xe2, 0x8d, 0xd0, 0x14, + 0xe8, 0xbd, 0x81, 0xf0, 0xe5, 0x9f, 0x10, 0xf0, + 0xe2, 0x81, 0x10, 0x01, 0xe5, 0x8f, 0x10, 0xe8, + 0xea, 0xff, 0xff, 0xf4, 0xe5, 0x9f, 0xf0, 0x08, + 0xa0, 0x00, 0x05, 0xc4, 0x80, 0x00, 0x00, 0xb8, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x06, 0xf4, + 0xa0, 0x00, 0x04, 0x28, 0xa0, 0x00, 0x00, 0x00, + 0xa0, 0x00, 0x05, 0x50, 0x2c, 0x00, 0x1f, 0xe8, + 0x2c, 0x00, 0x1f, 0xea, 0x2c, 0x00, 0x1f, 0xf4, + 0x00, 0x00, 0x05, 0xe0, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x12, 0x2c, 0x00, 0x02, 0x00, + 0x64, 0x00, 0x04, 0x00, 0x64, 0x00, 0x00, 0x80, + 0x47, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0xc0, + 0x66, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xea, 0x00, 0x00, 0x07, 0xe1, 0xb0, 0xf0, 0x0e, + 0xe5, 0x9f, 0xf1, 0x00, 0xe2, 0x5e, 0xf0, 0x04, + 0xe2, 0x5e, 0xf0, 0x08, 0xea, 0x00, 0x00, 0x02, + 0xe5, 0x9f, 0xf0, 0xec, 0xe2, 0x5e, 0xf0, 0x04, + 0x2c, 0x00, 0x00, 0xe8, 0xe1, 0x0f, 0x00, 0x00, + 0xe3, 0xc0, 0x00, 0x1f, 0xe3, 0x80, 0x00, 0x1b, + 0xe1, 0x29, 0xf0, 0x00, 0xe5, 0x9f, 0xd0, 0xd8, + 0xe5, 0x9f, 0x00, 0xd8, 0xe0, 0x8d, 0xd0, 0x00, + 0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x1f, + 0xe3, 0x80, 0x00, 0x13, 0xe1, 0x29, 0xf0, 0x00, + 0xe5, 0x9f, 0xd0, 0xc4, 0xe5, 0x9f, 0x00, 0xc4, + 0xe0, 0x8d, 0xd0, 0x00, 0xe1, 0x0f, 0x00, 0x00, + 0xe3, 0xc0, 0x00, 0x1f, 0xe3, 0x80, 0x00, 0x12, + 0xe1, 0x29, 0xf0, 0x00, 0xe5, 0x9f, 0xd0, 0xb0, + 0xe5, 0x9f, 0x00, 0xb0, 0xe0, 0x8d, 0xd0, 0x00, + 0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x9f, + 0xe3, 0x80, 0x00, 0x10, 0xe1, 0x29, 0xf0, 0x00, + 0xe5, 0x9f, 0xd0, 0x60, 0xeb, 0x00, 0x00, 0x08, + 0xe5, 0x9f, 0x00, 0x64, 0xe5, 0x9f, 0x10, 0x5c, + 0xeb, 0x00, 0x37, 0x7f, 0xe5, 0x9f, 0x00, 0x60, + 0xe5, 0x9f, 0x10, 0x58, 0xeb, 0x00, 0x37, 0x7f, + 0xe5, 0x9f, 0xe0, 0x58, 0xe3, 0x8e, 0xe0, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0xe5, 0x9f, 0x00, 0x8c, + 0xe5, 0x9f, 0x10, 0x8c, 0xe5, 0x9f, 0x30, 0x8c, + 0xe1, 0x50, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x03, + 0xe1, 0x51, 0x00, 0x03, 0x34, 0x90, 0x20, 0x04, + 0x34, 0x81, 0x20, 0x04, 0x3a, 0xff, 0xff, 0xfb, + 0xe5, 0x9f, 0x10, 0x74, 0xe3, 0xa0, 0x20, 0x00, + 0xe1, 0x53, 0x00, 0x01, 0x34, 0x83, 0x20, 0x04, + 0x3a, 0xff, 0xff, 0xfc, 0xe1, 0x2f, 0xff, 0x1e, + 0x2e, 0x1b, 0xff, 0xf0, 0x2e, 0x1b, 0x7f, 0xf0, + 0x2e, 0x1b, 0x7f, 0xef, 0x2e, 0x08, 0xd7, 0x6c, + 0xcc, 0x1f, 0xff, 0xef, 0xcc, 0x1f, 0x7f, 0xf0, + 0x2e, 0x00, 0x1a, 0xf9, 0x2e, 0x02, 0x38, 0xbc, + 0x2e, 0x02, 0x39, 0xb4, 0x2e, 0x08, 0x33, 0xa4, + 0x00, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x23, 0xa4, + 0x00, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x2b, 0xa4, + 0x00, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x97, 0x1c, + 0xe5, 0x9f, 0xf0, 0x04, 0xe5, 0x9f, 0xf0, 0x04, + 0xe5, 0x9f, 0xf0, 0x04, 0x2e, 0x08, 0x97, 0x1c, + 0x2e, 0x08, 0x97, 0x1d, 0x2e, 0x08, 0x97, 0x1e, + 0x2e, 0x03, 0xa9, 0xd0, 0x2e, 0x08, 0x00, 0x00, + 0x2e, 0x08, 0x3c, 0x20, 0x2e, 0x08, 0xd7, 0x68, + 0x1d, 0x77, 0x1e, 0x16, 0x03, 0x00, 0x03, 0x03, + 0x1d, 0x7f, 0x50, 0x50, 0x4f, 0x5d, 0x49, 0x5d, + 0x40, 0x4a, 0x44, 0x43, 0x01, 0x49, 0x4d, 0x56, + 0x48, 0x4b, 0x5d, 0x4f, 0x5d, 0x4d, 0x4f, 0x0a, + 0x78, 0x71, 0x73, 0x7f, 0x70, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x1b, 0x12, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x08, 0x0f, 0x0f, 0x0d, + 0x13, 0x0d, 0x11, 0x0e, 0x07, 0x08, 0x09, 0x0d, + 0x0d, 0x15, 0x10, 0x05, 0x08, 0x08, 0x09, 0x0e, + 0x07, 0x08, 0x07, 0x07, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x07, 0x07, + 0x0e, 0x0e, 0x0e, 0x0d, 0x18, 0x0f, 0x10, 0x11, + 0x11, 0x10, 0x0f, 0x13, 0x11, 0x06, 0x0c, 0x10, + 0x0d, 0x13, 0x11, 0x13, 0x10, 0x13, 0x11, 0x10, + 0x0e, 0x11, 0x0f, 0x17, 0x0f, 0x10, 0x0f, 0x07, + 0x07, 0x07, 0x0c, 0x0d, 0x08, 0x0d, 0x0e, 0x0c, + 0x0e, 0x0d, 0x07, 0x0e, 0x0e, 0x05, 0x06, 0x0c, + 0x06, 0x14, 0x0e, 0x0d, 0x0e, 0x0e, 0x08, 0x0c, + 0x07, 0x0e, 0x0b, 0x11, 0x0b, 0x0c, 0x0c, 0x08, + 0x06, 0x08, 0x0e, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x98, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x98, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xc0, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x19, 0x80, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x0c, 0xc0, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x0c, 0xc0, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x19, 0x80, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, + 0x0c, 0xc0, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x0c, 0xc0, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x60, 0x00, 0x00, 0x06, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x60, 0x00, 0x00, 0x0e, 0xe0, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x60, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xc0, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xc0, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xc0, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xf0, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x03, 0xe0, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x30, 0x78, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x30, 0x1c, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x3e, 0x60, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x0c, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x70, 0x60, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x0c, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, + 0x60, 0xe0, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, + 0x30, 0x70, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x37, 0x1c, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, + 0x71, 0xe0, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x33, 0xf8, 0x00, 0x00, 0xe0, 0x0e, 0x00, 0x00, + 0x7f, 0xe0, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0xf0, 0x00, 0x00, 0xc0, 0x06, 0x00, 0x00, + 0x1e, 0x30, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x06, 0x30, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, + 0x1e, 0x03, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x33, 0x07, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x7a, 0xf0, 0x00, 0x00, + 0x61, 0x86, 0x00, 0x00, 0x1c, 0xe0, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x0c, 0x60, 0x00, 0x00, 0x62, 0x30, 0x00, 0x00, + 0x61, 0x8e, 0x00, 0x00, 0x18, 0x60, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x0c, 0x60, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, + 0x61, 0x8c, 0x00, 0x00, 0x18, 0x60, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, + 0x61, 0x9c, 0x00, 0x00, 0x0c, 0xe0, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, + 0x61, 0xb8, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0xc0, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, + 0x33, 0x30, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0xc0, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, + 0x1e, 0x73, 0xc0, 0x00, 0x1f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0xc0, 0x00, 0x00, 0x02, 0xe0, 0x00, 0x00, + 0x00, 0x66, 0x60, 0x00, 0x39, 0xcc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x39, 0xc0, 0x00, 0x00, 0x02, 0x70, 0x00, 0x00, + 0x00, 0xec, 0x30, 0x00, 0x70, 0xdc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x02, 0x30, 0x00, 0x00, + 0x00, 0xcc, 0x30, 0x00, 0x60, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x62, 0x30, 0x00, 0x00, + 0x01, 0xcc, 0x30, 0x00, 0x60, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0x80, 0x00, 0x00, 0x72, 0x70, 0x00, 0x00, + 0x01, 0x8c, 0x30, 0x00, 0x70, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x3a, 0xf0, 0x00, 0x00, + 0x03, 0x8c, 0x30, 0x00, 0x38, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x03, 0x06, 0x60, 0x00, 0x3f, 0xee, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x63, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x07, 0x03, 0xc0, 0x00, 0x0f, 0xcc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xc0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x1d, 0x80, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x06, 0xc0, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x19, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x0e, 0xc0, 0x00, 0x00, + 0x3f, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x01, 0xc0, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x01, 0xc0, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, + 0x7f, 0xe0, 0x00, 0x00, 0x67, 0x80, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x1c, 0xc0, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x38, 0xc0, 0x00, 0x00, + 0x60, 0x70, 0x00, 0x00, 0x78, 0xe0, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x30, 0xe0, 0x00, 0x00, + 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x70, 0xc0, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x60, 0x70, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x38, 0x60, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x30, 0x0f, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x38, 0x06, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x00, + 0x07, 0xc0, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x0f, 0xfc, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x0f, 0xfe, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x30, 0x1e, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3c, 0x07, 0x80, 0x00, 0x38, 0x06, 0x00, 0x00, + 0x0f, 0xfe, 0x00, 0x00, 0x07, 0xc1, 0xe0, 0x00, + 0x07, 0xc0, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x1e, 0x1e, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x30, 0x3c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3c, 0x07, 0x80, 0x00, 0x3c, 0x06, 0x00, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x0e, 0x00, 0x70, 0x00, + 0x06, 0xc0, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, + 0x38, 0x07, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0x03, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x30, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3c, 0x07, 0x80, 0x00, 0x3e, 0x06, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x1c, 0x79, 0xb8, 0x00, + 0x0e, 0xe0, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, + 0x30, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x03, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x30, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x36, 0x0d, 0x80, 0x00, 0x36, 0x06, 0x00, 0x00, + 0x30, 0x01, 0x80, 0x00, 0x39, 0xff, 0x9c, 0x00, + 0x0c, 0x60, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x31, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x36, 0x0d, 0x80, 0x00, 0x37, 0x06, 0x00, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x31, 0xcf, 0x9c, 0x00, + 0x0c, 0x60, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x37, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x36, 0x0d, 0x80, 0x00, 0x33, 0x06, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x33, 0x87, 0x0c, 0x00, + 0x1c, 0x70, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x3f, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x37, 0x1d, 0x80, 0x00, 0x31, 0x86, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x77, 0x03, 0x0c, 0x00, + 0x18, 0x30, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x60, 0x3f, 0x80, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x33, 0x19, 0x80, 0x00, 0x31, 0xc6, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x67, 0x03, 0x0c, 0x00, + 0x38, 0x38, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x3f, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x3d, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x33, 0x19, 0x80, 0x00, 0x30, 0xc6, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x66, 0x03, 0x0c, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x01, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x33, 0x19, 0x80, 0x00, 0x30, 0x66, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x66, 0x07, 0x1c, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x70, 0x03, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x01, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x30, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x31, 0xb1, 0x80, 0x00, 0x30, 0x76, 0x00, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x66, 0x06, 0x18, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x07, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x01, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x00, 0x00, + 0x30, 0x38, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x31, 0xb1, 0x80, 0x00, 0x30, 0x36, 0x00, 0x00, + 0x30, 0x01, 0x80, 0x00, 0x67, 0x0e, 0x38, 0x00, + 0x60, 0x0c, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x38, 0x06, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x00, 0x00, + 0x30, 0x3c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x31, 0xf1, 0x80, 0x00, 0x30, 0x3e, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x77, 0x1e, 0x70, 0x00, + 0x60, 0x0c, 0x00, 0x00, 0x30, 0x1e, 0x00, 0x00, + 0x1e, 0x1e, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1e, 0x0f, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, + 0x30, 0x1c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x31, 0xf1, 0x80, 0x00, 0x30, 0x1e, 0x00, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x73, 0xff, 0xe0, 0x00, + 0xe0, 0x0e, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x0f, 0xfc, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0f, 0xff, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, + 0x30, 0x0e, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x30, 0xe1, 0x80, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x0f, 0xfe, 0x00, 0x00, 0x39, 0xe7, 0xc0, 0x00, + 0xc0, 0x06, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x07, 0xf0, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x03, 0xfc, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x30, 0x07, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x30, 0xe1, 0x80, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x3c, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 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, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x07, 0xf0, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0xc0, 0x06, 0x00, 0x00, + 0xc0, 0x38, 0x06, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0xe0, 0x07, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x0f, 0xfe, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0xe0, 0x0e, 0x00, 0x00, + 0xe0, 0x7c, 0x0e, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x1e, 0x00, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x30, 0x1e, 0x00, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, + 0xe0, 0x7c, 0x0e, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x30, 0x1c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x0e, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x60, 0x6c, 0x0c, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x01, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x60, 0xec, 0x0c, 0x00, 0x0e, 0xe0, 0x00, 0x00, + 0x1c, 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x70, 0xee, 0x1c, 0x00, 0x06, 0xc0, 0x00, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x30, 0x1e, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x70, 0xc6, 0x1c, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x06, 0x60, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, + 0x30, 0xc6, 0x18, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x07, 0xf8, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, + 0x31, 0xc7, 0x18, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x30, 0xe0, 0x00, 0x00, + 0x00, 0x7c, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x31, 0x83, 0x18, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x30, 0x70, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00, + 0x39, 0x83, 0x38, 0x00, 0x0e, 0xe0, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x30, 0x38, 0x00, 0x00, + 0x60, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x0e, 0xe0, 0x00, 0x00, + 0x1b, 0x83, 0xb0, 0x00, 0x0e, 0xe0, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x31, 0x80, 0x00, 0x30, 0x38, 0x00, 0x00, + 0x70, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x0e, 0xe0, 0x00, 0x00, + 0x1b, 0x01, 0xb0, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0x3f, 0x80, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x1f, 0x01, 0xf0, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1e, 0x1f, 0x00, 0x00, 0x30, 0x1e, 0x00, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x1c, 0x1c, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x1f, 0x01, 0xf0, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0f, 0xff, 0x80, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x0f, 0xf8, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x1e, 0x00, 0xe0, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x03, 0xff, 0xc0, 0x00, 0x30, 0x07, 0x00, 0x00, + 0x07, 0xf0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x07, 0xf0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x0e, 0x00, 0xe0, 0x00, 0xe0, 0x0e, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x33, 0xc0, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x0f, 0xb0, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x33, 0xc0, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x37, 0xcf, 0x80, 0x00, 0x33, 0xc0, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3f, 0xdf, 0x80, 0x00, 0x37, 0xe0, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x3c, 0x70, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x3c, 0x70, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x31, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3c, 0xf9, 0xc0, 0x00, 0x3c, 0x70, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x70, 0x60, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x38, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x33, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x70, 0xc0, 0x00, 0x38, 0x30, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xe0, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x60, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x33, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x60, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x33, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xe0, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x70, 0x60, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x70, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x31, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x71, 0xe0, 0x00, 0x00, 0x3c, 0x70, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xe0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x30, 0x00, 0x00, 0x33, 0xc0, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x0f, 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, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x37, 0xc0, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0xc0, 0x60, 0x00, 0x00, + 0xc0, 0x81, 0x80, 0x00, 0xe0, 0x60, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x3f, 0xf0, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0xc0, 0x60, 0x00, 0x00, + 0xc1, 0xc1, 0x80, 0x00, 0x60, 0xc0, 0x00, 0x00, + 0x60, 0xe0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x3c, 0x70, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, + 0xe1, 0xc1, 0x80, 0x00, 0x31, 0xc0, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x60, 0xc0, 0x00, 0x00, + 0x63, 0xe3, 0x00, 0x00, 0x3b, 0x80, 0x00, 0x00, + 0x30, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x3e, 0x08, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, + 0x63, 0x63, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x31, 0xc0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x7f, 0x98, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x7f, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, + 0x67, 0x63, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x39, 0xc0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x67, 0xf8, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1f, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, + 0x37, 0x76, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x19, 0x80, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x41, 0xf0, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x3b, 0x80, 0x00, 0x00, + 0x36, 0x36, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x19, 0x80, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0x3e, 0x3e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x1d, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x70, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x1e, 0x3c, 0x00, 0x00, 0x3b, 0x80, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x3c, 0x70, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x1c, 0x1c, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x37, 0xe0, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x1c, 0x1c, 0x00, 0x00, 0x60, 0xc0, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x33, 0xc0, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x0c, 0x18, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x0a, 0x12, 0x13, 0x10, 0x17, 0x10, 0x15, 0x10, + 0x08, 0x09, 0x0a, 0x10, 0x10, 0x1a, 0x13, 0x06, + 0x0a, 0x0a, 0x0b, 0x11, 0x08, 0x0a, 0x08, 0x08, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x08, 0x08, 0x11, 0x11, 0x11, 0x10, + 0x1d, 0x13, 0x13, 0x15, 0x15, 0x13, 0x12, 0x17, + 0x15, 0x07, 0x0f, 0x13, 0x10, 0x17, 0x15, 0x17, + 0x13, 0x17, 0x15, 0x13, 0x13, 0x15, 0x13, 0x1e, + 0x13, 0x13, 0x12, 0x08, 0x08, 0x08, 0x0e, 0x10, + 0x0a, 0x10, 0x10, 0x0f, 0x10, 0x10, 0x08, 0x10, + 0x10, 0x07, 0x07, 0x0e, 0x07, 0x19, 0x10, 0x10, + 0x10, 0x10, 0x0a, 0x0f, 0x08, 0x10, 0x0d, 0x15, + 0x0d, 0x0d, 0x0e, 0x0a, 0x08, 0x0a, 0x11, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x07, 0xff, 0x80, 0x00, 0x0e, 0x38, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1c, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x0f, 0xff, 0xe0, 0x00, 0x0e, 0x38, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0c, 0x00, 0x00, + 0x03, 0xb8, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x1f, 0x83, 0xf0, 0x00, 0x0e, 0x38, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x07, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, + 0x78, 0x00, 0x3c, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x0f, 0x1e, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x78, 0x00, 0x3c, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, + 0x0e, 0x0e, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x70, 0x00, 0x1c, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, + 0x0e, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x70, 0x00, 0x1c, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x70, 0x00, 0x1c, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, + 0x1c, 0x07, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x70, 0x00, 0x1c, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0x38, 0x3e, 0x00, 0x00, + 0x1f, 0xff, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, + 0x70, 0x00, 0x1c, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0x38, 0x1f, 0x00, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x78, 0x00, 0x3c, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x3f, 0x9c, 0x00, 0x00, + 0x78, 0x00, 0x3c, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x3c, 0x00, 0x78, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x3c, 0x01, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x78, 0x03, 0xc0, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x1e, 0x00, 0xf8, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x3c, 0x01, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x39, 0xc3, 0x80, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x70, 0x3c, 0x00, 0x00, + 0x1f, 0x83, 0xf0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x1f, 0x07, 0xc0, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x39, 0xe7, 0x00, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x78, 0x7c, 0x00, 0x00, + 0x0f, 0xff, 0xe0, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x0f, 0xff, 0x80, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xff, 0x00, 0x00, + 0xe0, 0x01, 0xe0, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x03, 0xff, 0xc0, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x07, 0xff, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x7c, 0x00, 0x00, + 0xe0, 0x00, 0xe0, 0x00, 0x1f, 0x8e, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x03, 0xfe, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 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, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, + 0x0f, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x60, 0x00, + 0x03, 0xe0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x01, 0xc0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x1f, 0xc0, 0xe0, 0x00, + 0x07, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x0f, 0x3c, 0x00, 0x00, + 0x3d, 0xb8, 0x00, 0x00, 0x38, 0xe0, 0xc0, 0x00, + 0x0f, 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x76, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, + 0x79, 0xbc, 0x00, 0x00, 0x30, 0x61, 0xc0, 0x00, + 0x0e, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x7f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, + 0x71, 0x9c, 0x00, 0x00, 0x30, 0x61, 0x80, 0x00, + 0x0e, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0x71, 0x80, 0x00, 0x00, 0x30, 0x63, 0x80, 0x00, + 0x0e, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0x79, 0x80, 0x00, 0x00, 0x30, 0x63, 0x00, 0x00, + 0x0f, 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0x7d, 0x80, 0x00, 0x00, 0x30, 0x67, 0x00, 0x00, + 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x39, 0xc0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x00, 0x00, + 0x3f, 0x80, 0x00, 0x00, 0x38, 0xe6, 0x00, 0x00, + 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x19, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x1f, 0xce, 0x00, 0x00, + 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x0f, 0xf8, 0x00, 0x00, 0x0f, 0x8c, 0x7c, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x01, 0xfc, 0x00, 0x00, 0x00, 0x1c, 0xfe, 0x00, + 0x3e, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0xf0, 0x00, 0x00, + 0x01, 0xbe, 0x00, 0x00, 0x00, 0x19, 0xc7, 0x00, + 0x38, 0x73, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0x01, 0x9e, 0x00, 0x00, 0x00, 0x39, 0x83, 0x00, + 0x78, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0x01, 0x8e, 0x00, 0x00, 0x00, 0x31, 0x83, 0x00, + 0x70, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0x71, 0x8e, 0x00, 0x00, 0x00, 0x71, 0x83, 0x00, + 0x70, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x71, 0x8e, 0x00, 0x00, 0x00, 0x61, 0x83, 0x00, + 0x70, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x79, 0x9e, 0x00, 0x00, 0x00, 0xe1, 0x83, 0x00, + 0x78, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x79, 0xe0, 0x00, 0x00, + 0x3d, 0xbc, 0x00, 0x00, 0x00, 0xc1, 0xc7, 0x00, + 0x3c, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x01, 0xc0, 0xfe, 0x00, + 0x1f, 0xfb, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, + 0x0f, 0xf0, 0x00, 0x00, 0x01, 0x80, 0x7c, 0x00, + 0x0f, 0xe1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xc0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x0f, 0xe0, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x03, 0xf0, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x0f, 0xf8, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x3c, 0x3c, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, + 0x7c, 0x7c, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, + 0x00, 0xf8, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x3e, 0x3e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x3c, 0x3c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, + 0x78, 0x3c, 0x00, 0x00, 0x70, 0x3c, 0x00, 0x00, + 0x01, 0xf8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x78, 0x0e, 0x00, 0x00, + 0x78, 0x1e, 0x00, 0x00, 0x1e, 0xe0, 0x00, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x01, 0xf8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x1c, 0xe0, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x03, 0xb8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x3f, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x10, 0xe0, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, + 0x07, 0x38, 0x00, 0x00, 0x7b, 0xe0, 0x00, 0x00, + 0x73, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x1c, 0x38, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x07, 0xfc, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x3c, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x0f, 0x38, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, + 0x77, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x03, 0xfc, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, + 0x0e, 0x38, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, + 0x7f, 0xfc, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x0f, 0xe0, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x1c, 0x38, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, + 0x7c, 0x3e, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x3c, 0x3e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, + 0x38, 0x38, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x78, 0x1e, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x3c, 0x3c, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x01, 0xe0, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x78, 0x38, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x78, 0x1e, 0x00, 0x00, 0x1f, 0xee, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x03, 0xfc, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x0f, 0xce, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xfc, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x3f, 0x80, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x78, 0x1e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x7f, 0xfe, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x78, 0x0e, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x38, 0x1e, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x78, 0x1e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x3c, 0x3c, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x7c, 0x3e, 0x00, 0x00, 0x78, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x7f, 0xfc, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x7f, 0xfc, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x0f, 0xf8, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x7f, 0xfc, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 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, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0xf0, 0x00, 0x01, 0xf0, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x01, 0xe0, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x7c, 0x00, + 0x3c, 0x00, 0xe0, 0x00, 0x01, 0xff, 0x00, 0x00, + 0x00, 0x7f, 0xfe, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x07, 0xff, 0xc0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x7c, 0x00, + 0x3c, 0x00, 0xe0, 0x00, 0x07, 0xff, 0x80, 0x00, + 0x01, 0xff, 0xff, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x3f, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xe0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7e, 0x00, 0xfc, 0x00, + 0x3e, 0x00, 0xe0, 0x00, 0x0f, 0xff, 0xe0, 0x00, + 0x03, 0xf8, 0x3f, 0x80, 0x03, 0xb8, 0x00, 0x00, + 0x38, 0x0f, 0x80, 0x00, 0x1f, 0x83, 0xe0, 0x00, + 0x38, 0x07, 0xc0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1f, 0x83, 0xf0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7e, 0x00, 0xfc, 0x00, + 0x3f, 0x00, 0xe0, 0x00, 0x1f, 0x83, 0xf0, 0x00, + 0x07, 0xc0, 0x07, 0xc0, 0x07, 0xbc, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x3e, 0x01, 0xe0, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7f, 0x01, 0xfc, 0x00, + 0x3f, 0x00, 0xe0, 0x00, 0x3e, 0x00, 0xf8, 0x00, + 0x07, 0x80, 0x03, 0xe0, 0x07, 0x1c, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x3c, 0x00, 0xf0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x77, 0x01, 0xdc, 0x00, + 0x3b, 0x80, 0xe0, 0x00, 0x3c, 0x00, 0x78, 0x00, + 0x0f, 0x0f, 0x1d, 0xe0, 0x07, 0x1c, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x78, 0x00, 0x70, 0x00, + 0x38, 0x00, 0xf0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x30, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x77, 0x01, 0xdc, 0x00, + 0x3b, 0xc0, 0xe0, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x1e, 0x3f, 0xbc, 0xf0, 0x0f, 0x1e, 0x00, 0x00, + 0x38, 0x0f, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x70, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x77, 0x83, 0xdc, 0x00, + 0x39, 0xc0, 0xe0, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x1e, 0x7f, 0xfc, 0xf0, 0x0e, 0x0e, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x70, 0x00, 0x3f, 0xff, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x3f, 0xff, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x73, 0x83, 0x9c, 0x00, + 0x38, 0xe0, 0xe0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x1c, 0xf9, 0xf8, 0x70, 0x0e, 0x0e, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x70, 0x00, 0x3f, 0xff, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x3f, 0xff, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3b, 0xe0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x73, 0x83, 0x9c, 0x00, + 0x38, 0xe0, 0xe0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x3c, 0xf0, 0xf8, 0x70, 0x1e, 0x0f, 0x00, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x70, 0x00, 0x3f, 0xff, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x0f, 0xf8, 0x00, + 0x3f, 0xff, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x73, 0xc7, 0x9c, 0x00, + 0x38, 0x70, 0xe0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x39, 0xe0, 0x78, 0x70, 0x1c, 0x07, 0x00, 0x00, + 0x38, 0x07, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x70, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x0f, 0xf8, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x71, 0xc7, 0x1c, 0x00, + 0x38, 0x38, 0xe0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x39, 0xe0, 0x78, 0x70, 0x1f, 0xff, 0x00, 0x00, + 0x38, 0x03, 0xc0, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x70, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x0f, 0xf8, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3e, 0x78, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x71, 0xc7, 0x1c, 0x00, + 0x38, 0x38, 0xe0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x39, 0xc0, 0x70, 0x70, 0x3f, 0xff, 0x80, 0x00, + 0x38, 0x01, 0xc0, 0x00, 0x78, 0x00, 0x60, 0x00, + 0x38, 0x00, 0xf0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x00, 0x38, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x71, 0xef, 0x1c, 0x00, + 0x38, 0x1c, 0xe0, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x39, 0xc0, 0xf0, 0xf0, 0x3f, 0xff, 0x80, 0x00, + 0x38, 0x01, 0xc0, 0x00, 0x78, 0x00, 0xf0, 0x00, + 0x38, 0x00, 0xf0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x00, 0x38, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x70, 0x38, 0x00, 0x00, 0x38, 0x3e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0xee, 0x1c, 0x00, + 0x38, 0x1e, 0xe0, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x39, 0xc0, 0xf0, 0xe0, 0x38, 0x03, 0x80, 0x00, + 0x38, 0x01, 0xc0, 0x00, 0x3c, 0x00, 0xf0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x70, 0x38, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0xee, 0x1c, 0x00, + 0x38, 0x0e, 0xe0, 0x00, 0x3c, 0x00, 0x78, 0x00, + 0x39, 0xe1, 0xe1, 0xc0, 0x78, 0x03, 0xc0, 0x00, + 0x38, 0x03, 0xc0, 0x00, 0x3e, 0x01, 0xe0, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x78, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x78, 0x78, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0xfe, 0x1c, 0x00, + 0x38, 0x07, 0xe0, 0x00, 0x1e, 0x00, 0xf8, 0x00, + 0x3d, 0xe3, 0xe3, 0xc0, 0x70, 0x01, 0xc0, 0x00, + 0x38, 0x07, 0xc0, 0x00, 0x1f, 0x87, 0xe0, 0x00, + 0x38, 0x07, 0xc0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1f, 0x81, 0xf8, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x7c, 0xf8, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x7c, 0x1c, 0x00, + 0x38, 0x07, 0xe0, 0x00, 0x1f, 0x83, 0xf0, 0x00, + 0x3c, 0xff, 0xe7, 0x80, 0x70, 0x01, 0xc0, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x3f, 0xf0, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x7c, 0x1c, 0x00, + 0x38, 0x03, 0xe0, 0x00, 0x0f, 0xff, 0xe0, 0x00, + 0x1e, 0xfe, 0xff, 0x00, 0xe0, 0x01, 0xe0, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x3f, 0xf0, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x7c, 0x1c, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x03, 0xff, 0xc0, 0x00, + 0x1e, 0x3c, 0x7c, 0x78, 0xe0, 0x00, 0xe0, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x0f, 0xc0, 0x00, 0x00, 0x38, 0x01, 0xe0, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x38, 0x1c, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x00, 0xfe, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xc0, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xf8, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x7f, 0xff, 0xc0, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0xe0, 0x00, 0xe0, 0x00, 0xe0, 0x0f, 0x80, 0x38, + 0x78, 0x03, 0xc0, 0x00, 0xf0, 0x01, 0xe0, 0x00, + 0x7f, 0xff, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x07, 0xff, 0xc0, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x7f, 0xff, 0xc0, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0xf0, 0x01, 0xe0, 0x00, 0xf0, 0x0f, 0x80, 0x78, + 0x3c, 0x07, 0x80, 0x00, 0x70, 0x03, 0xc0, 0x00, + 0x7f, 0xff, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xe0, 0x00, + 0x3f, 0xff, 0xc0, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x7f, 0xff, 0xc0, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0xf0, 0x1f, 0xc0, 0x78, + 0x1c, 0x07, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x7f, 0xff, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x07, 0xc0, 0x00, 0x1f, 0x83, 0xf0, 0x00, + 0x38, 0x03, 0xe0, 0x00, 0x3e, 0x0f, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x70, 0x1f, 0xc0, 0x70, + 0x1e, 0x0f, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x03, 0xc0, 0x00, 0x1e, 0x00, 0xf8, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x78, 0x03, 0xc0, 0x00, 0x70, 0x1d, 0xc0, 0x70, + 0x0f, 0x1e, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x01, 0xc0, 0x00, 0x3c, 0x00, 0x78, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x78, 0x1d, 0xc0, 0xf0, + 0x07, 0xbc, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, + 0x00, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x1c, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x01, 0xc0, 0x00, 0x38, 0x00, 0x3c, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x38, 0x07, 0x80, 0x00, 0x78, 0x3d, 0xe0, 0xf0, + 0x07, 0xbc, 0x00, 0x00, 0x0f, 0x1e, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x1c, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x01, 0xc0, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x3c, 0x07, 0x80, 0x00, 0x38, 0x38, 0xe0, 0xe0, + 0x03, 0xf8, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x03, 0xc0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x38, 0x03, 0xe0, 0x00, 0x1f, 0x80, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x1c, 0x07, 0x00, 0x00, 0x38, 0x38, 0xe0, 0xe0, + 0x01, 0xf0, 0x00, 0x00, 0x07, 0xbc, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x07, 0xc0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x3f, 0xff, 0xc0, 0x00, 0x0f, 0xf8, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x3c, 0x38, 0xe1, 0xe0, + 0x00, 0xe0, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x01, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x78, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x03, 0xfe, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x3c, 0x78, 0xf1, 0xe0, + 0x01, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x70, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x0e, 0x0e, 0x00, 0x00, 0x1c, 0x70, 0x71, 0xc0, + 0x01, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x38, 0x3c, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x0f, 0x1e, 0x00, 0x00, 0x1c, 0x70, 0x71, 0xc0, + 0x03, 0xb8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x38, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x1e, 0x70, 0x73, 0xc0, + 0x07, 0xbc, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x08, 0x38, 0x00, + 0x38, 0x0f, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x1e, 0xf0, 0x7b, 0xc0, + 0x0f, 0x1e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x0e, 0x78, 0x00, + 0x38, 0x07, 0x80, 0x00, 0x78, 0x03, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x3c, 0x01, 0xe0, 0x00, + 0x07, 0xbc, 0x00, 0x00, 0x0e, 0xe0, 0x3b, 0x80, + 0x0f, 0x1e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1e, 0x0f, 0xf0, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x78, 0x07, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x3c, 0x01, 0xe0, 0x00, + 0x03, 0xb8, 0x00, 0x00, 0x0e, 0xe0, 0x3b, 0x80, + 0x1e, 0x0f, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1f, 0x83, 0xe0, 0x00, + 0x38, 0x03, 0xc0, 0x00, 0x3e, 0x0f, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x1f, 0x07, 0xc0, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x0f, 0xe0, 0x3f, 0x80, + 0x3c, 0x07, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x0f, 0xe0, 0x3f, 0x80, + 0x38, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0xff, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf8, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, + 0x01, 0xf0, 0x00, 0x00, 0x07, 0xc0, 0x1f, 0x00, + 0x78, 0x03, 0xc0, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0xff, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x01, 0xff, 0x3c, 0x00, + 0x38, 0x00, 0xf0, 0x00, 0x07, 0xf8, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, + 0x01, 0xf0, 0x00, 0x00, 0x07, 0xc0, 0x1f, 0x00, + 0xf0, 0x01, 0xe0, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0xff, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, + 0x39, 0xf0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x0f, 0x9c, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, + 0x39, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x39, 0xf0, 0xf8, 0x00, + 0x39, 0xf0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3f, 0xfb, 0xfc, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x3e, 0x3c, 0x00, 0x00, 0x3c, 0x78, 0x00, 0x00, + 0x3c, 0x7c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x3e, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x1e, 0x00, + 0x3e, 0x3c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x38, 0x3c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x1e, 0x0e, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x1e, 0x00, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x78, 0x3c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3b, 0xc0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0x9c, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3b, 0xc0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x3c, 0x1e, 0x00, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x78, 0x3c, 0x00, 0x00, 0x78, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x3c, 0x00, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x38, 0x3c, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x7c, 0x00, 0x00, + 0x3e, 0x3c, 0x00, 0x00, 0x3c, 0x78, 0x00, 0x00, + 0x3c, 0x7c, 0x00, 0x00, 0x3e, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x8e, 0x00, 0x00, + 0x39, 0xf0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x0f, 0x9c, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7c, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x39, 0xf0, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, + 0x3b, 0xc0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0xe0, 0x38, 0x00, 0x01, 0xe0, 0x70, 0x3c, 0x00, + 0xe0, 0x38, 0x00, 0x00, 0xe0, 0x38, 0x00, 0x00, + 0x7f, 0xf8, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0xf0, 0x78, 0x00, 0x00, 0xe0, 0x70, 0x38, 0x00, + 0x70, 0x70, 0x00, 0x00, 0xf0, 0x78, 0x00, 0x00, + 0x7f, 0xf8, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3e, 0x3c, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x78, 0x78, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0xe0, 0xf8, 0x38, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x1f, 0x01, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x70, 0x38, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0xe0, 0xf8, 0x38, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x7f, 0xe3, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x38, 0x1e, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x70, 0xd8, 0x70, 0x00, + 0x1d, 0xc0, 0x00, 0x00, 0x78, 0xf0, 0x00, 0x00, + 0x01, 0xe0, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x7f, 0xff, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x71, 0xdc, 0x70, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x61, 0xff, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x71, 0x8c, 0x70, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x40, 0x7c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x31, 0x8c, 0x60, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x1d, 0xc0, 0x00, 0x00, 0x33, 0x8e, 0xe0, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x1d, 0xc0, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x1d, 0xc0, 0x00, 0x00, 0x3b, 0x06, 0xe0, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x1d, 0xc0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3c, 0x1e, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x0d, 0x80, 0x00, 0x00, 0x1b, 0x06, 0xe0, 0x00, + 0x1d, 0xc0, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x1f, 0x07, 0xc0, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3e, 0x3c, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x1e, 0x07, 0xc0, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x1e, 0x03, 0xc0, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x39, 0xe0, 0x00, 0x00, 0x07, 0x9c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x0e, 0x03, 0x80, 0x00, + 0xe0, 0x38, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, + 0x00, 0x00, 0x00, 0x27, 0x1a, 0x1a, 0x1a, 0x1a, + 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, + 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, + 0x1a, 0x1a, 0x1a, 0x1a, 0x0b, 0x15, 0x17, 0x13, + 0x1a, 0x13, 0x19, 0x13, 0x09, 0x0b, 0x0c, 0x13, + 0x13, 0x1e, 0x17, 0x06, 0x0b, 0x0b, 0x0d, 0x14, + 0x09, 0x0b, 0x09, 0x09, 0x13, 0x13, 0x13, 0x13, + 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x09, 0x09, + 0x14, 0x14, 0x14, 0x13, 0x23, 0x17, 0x17, 0x19, + 0x19, 0x17, 0x15, 0x1a, 0x19, 0x09, 0x11, 0x17, + 0x13, 0x1d, 0x19, 0x1a, 0x17, 0x1a, 0x19, 0x17, + 0x15, 0x19, 0x17, 0x22, 0x17, 0x15, 0x15, 0x09, + 0x09, 0x09, 0x11, 0x13, 0x0b, 0x12, 0x12, 0x11, + 0x12, 0x12, 0x0a, 0x12, 0x13, 0x07, 0x07, 0x11, + 0x07, 0x1b, 0x13, 0x12, 0x12, 0x12, 0x0b, 0x11, + 0x09, 0x13, 0x11, 0x17, 0x10, 0x11, 0x10, 0x0b, + 0x09, 0x0b, 0x14, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, + 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, + 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, + 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, + 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, + 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, + 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, + 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, + 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, + 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, + 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, + 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, + 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe3, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe3, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe3, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, + 0x03, 0xff, 0xf0, 0x00, 0x00, 0x07, 0x1c, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, + 0x1c, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, + 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, + 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, + 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, + 0x07, 0xe1, 0xf8, 0x00, 0x00, 0x07, 0x1c, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, + 0x1c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x07, 0x00, 0x00, 0x00, 0x00, 0xee, + 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, + 0x0f, 0x80, 0x7c, 0x00, 0x00, 0x07, 0x1c, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, + 0x1c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x01, 0xef, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x01, 0xc7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x03, 0xc7, + 0x80, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x03, 0xf0, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x0e, 0x00, 0x00, 0x00, 0x03, 0xc7, + 0x80, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xfc, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x0e, 0x00, 0x00, 0x00, 0x03, 0x83, + 0x80, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x1f, 0xfe, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x07, 0x83, + 0xc0, 0x00, 0x00, 0x78, 0x1f, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x3e, 0x1f, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x07, 0x01, + 0xc0, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x3c, 0x0f, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x0f, 0x01, + 0xe0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x78, 0x07, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x1f, 0x00, 0x00, 0x00, 0x0f, 0x01, + 0xe0, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x0f, 0x80, 0x00, 0x00, 0x0f, 0xff, + 0xe0, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, + 0x00, 0x1c, 0x07, 0xc0, 0x00, 0x00, 0x1f, 0xff, + 0xf0, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, + 0x00, 0x1c, 0x01, 0xe0, 0x00, 0x00, 0x1f, 0xff, + 0xf0, 0x00, 0x00, 0x3f, 0xf7, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x0f, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, 0x1c, 0x00, + 0x70, 0x00, 0x00, 0x7c, 0x07, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x3c, 0x00, + 0x78, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x20, 0x70, 0x00, 0x00, 0x38, 0x00, + 0x38, 0x00, 0x00, 0x70, 0x0f, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x78, 0x07, 0x80, + 0x00, 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x38, + 0x07, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0xf0, 0xf0, 0x00, 0x00, 0x78, 0x00, + 0x3c, 0x00, 0x00, 0x70, 0x1f, 0x00, 0x00, 0x00, + 0x0f, 0x80, 0x7c, 0x00, 0x00, 0x3c, 0x0f, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x78, 0x00, 0x00, 0x3c, + 0x07, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0xf9, 0xf0, 0x00, 0x00, 0x78, 0x00, + 0x3c, 0x00, 0x00, 0x7c, 0x3f, 0x00, 0x00, 0x00, + 0x07, 0xe1, 0xf8, 0x00, 0x00, 0x3e, 0x1f, 0x00, + 0x00, 0x00, 0x0f, 0xc1, 0xf8, 0x00, 0x00, 0x3e, + 0x1f, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x7f, 0xe0, 0x00, 0x00, 0x70, 0x00, + 0x1c, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, + 0x03, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xfe, 0x00, + 0x00, 0x00, 0x07, 0xff, 0xf0, 0x00, 0x00, 0x1f, + 0xff, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x3f, 0xc0, 0x00, 0x00, 0xf0, 0x00, + 0x1e, 0x00, 0x00, 0x3f, 0xf7, 0x80, 0x00, 0x00, + 0x01, 0xff, 0xe0, 0x00, 0x00, 0x0f, 0xfc, 0x00, + 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x1f, + 0xfb, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, + 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, + 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, + 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x1f, 0x80, 0x00, 0x00, 0xe0, 0x00, + 0x0e, 0x00, 0x00, 0x0f, 0xe3, 0x80, 0x00, 0x00, + 0x00, 0x7f, 0x80, 0x00, 0x00, 0x03, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x07, + 0xe3, 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, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x01, 0xc3, 0x80, 0x00, 0x00, + 0x07, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x0e, + 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x01, 0xc7, 0x80, 0x00, 0x00, + 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x1e, + 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x70, 0x1c, + 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x03, 0xc7, 0x00, 0x00, 0x00, + 0x3e, 0xde, 0x00, 0x00, 0x00, 0x3c, 0x78, 0x3c, + 0x00, 0x00, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x76, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x03, 0x87, 0x00, 0x00, 0x00, + 0x3c, 0xcf, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, + 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x03, 0x87, 0x00, 0x00, 0x00, + 0x38, 0xc7, 0x00, 0x00, 0x00, 0x38, 0x38, 0x78, + 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x03, 0x8f, 0x00, 0x00, 0x00, + 0x38, 0xc0, 0x00, 0x00, 0x00, 0x38, 0x38, 0x70, + 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, + 0x38, 0xc0, 0x00, 0x00, 0x00, 0x38, 0x38, 0xf0, + 0x00, 0x00, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x70, 0xc0, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, + 0x3c, 0xc0, 0x00, 0x00, 0x00, 0x38, 0x38, 0xe0, + 0x00, 0x00, 0x03, 0x9e, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x39, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, + 0x1e, 0xc0, 0x00, 0x00, 0x00, 0x3c, 0x79, 0xe0, + 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x19, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x1c, 0x71, 0xc0, + 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x1e, 0x00, 0x00, 0x00, + 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x1f, 0xe3, 0xc0, + 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x1e, 0x00, 0x00, 0x00, + 0x03, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xc3, 0x8f, + 0x80, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x07, 0xbf, + 0xc0, 0x00, 0x0f, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, + 0xe0, 0x00, 0x1e, 0x3c, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0xc7, 0x80, 0x00, 0x00, 0x00, 0x0f, 0x78, + 0xf0, 0x00, 0x3c, 0x1e, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0xc3, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x70, + 0x70, 0x00, 0x38, 0x1e, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0xc3, 0x80, 0x00, 0x00, 0x00, 0x1e, 0x70, + 0x70, 0x00, 0x38, 0x0f, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x38, 0x00, 0x00, 0x00, + 0x70, 0xc3, 0x80, 0x00, 0x00, 0x00, 0x1c, 0x70, + 0x70, 0x00, 0x38, 0x07, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00, 0x00, + 0x78, 0xc7, 0x80, 0x00, 0x00, 0x00, 0x3c, 0x70, + 0x70, 0x00, 0x3c, 0x03, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00, 0x00, + 0x78, 0xc7, 0x80, 0x00, 0x00, 0x00, 0x38, 0x70, + 0x70, 0x00, 0x3c, 0x07, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x78, 0x00, 0x00, 0x00, + 0x3e, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x70, 0x78, + 0xf0, 0x00, 0x1f, 0x1f, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x78, 0x00, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x70, 0x38, + 0xe0, 0x00, 0x0f, 0xff, 0x7c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x70, 0x00, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, + 0xc0, 0x00, 0x07, 0xfe, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, 0x00, + 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, + 0x80, 0x00, 0x03, 0xf8, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0xfc, + 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, + 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x7f, + 0xff, 0xc0, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xf8, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x0f, 0xfe, + 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, + 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, 0x7f, + 0xff, 0xc0, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, + 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, + 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00, 0x00, 0x7f, + 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xff, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, + 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x3e, 0x0f, + 0x80, 0x00, 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0x0f, 0x80, 0x00, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, + 0x00, 0x3e, 0x0f, 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, 0x1f, + 0x1f, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x78, 0x03, + 0xc0, 0x00, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x03, 0xc0, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x3c, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x07, 0x80, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x03, + 0xc0, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x01, 0xc0, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x78, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x03, 0x80, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x1f, 0x70, 0x00, 0x00, 0x00, 0x70, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x1e, 0x70, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x01, 0xee, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x03, 0xce, 0x00, 0x00, 0x00, 0x3b, 0xf8, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xfe, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, + 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xc0, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x03, 0xce, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, + 0x00, 0x00, 0x71, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, + 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xf8, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, + 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, + 0x07, 0x8e, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x00, + 0x00, 0x00, 0x77, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x00, 0x78, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, + 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, + 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x7c, 0x0f, 0x80, + 0x00, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, + 0x00, 0x78, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x01, 0xff, 0x80, 0x00, 0x00, + 0x1e, 0x0e, 0x00, 0x00, 0x00, 0x78, 0x03, 0x80, + 0x00, 0x00, 0x7e, 0x0f, 0x80, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x00, 0x3e, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, + 0x7c, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x1e, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, + 0x00, 0x00, 0x7c, 0x03, 0xc0, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0x80, 0x00, + 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x3c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, + 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, 0x00, 0x01, + 0xe0, 0x00, 0x00, 0x00, 0x78, 0x03, 0x80, 0x00, + 0x00, 0x0f, 0xfd, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x78, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, + 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x07, 0xf1, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xf8, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, + 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x01, + 0xe0, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x01, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xc0, + 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xfe, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, + 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xc0, + 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x03, + 0xc0, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0x80, 0x00, 0x00, 0x3f, 0xff, 0xc0, + 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, + 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x70, 0x01, 0xc0, + 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, + 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x70, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x78, 0x07, 0x80, + 0x00, 0x00, 0x3c, 0x03, 0x80, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x78, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x3e, 0x0f, 0x80, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0x00, + 0x00, 0x00, 0x1e, 0x0f, 0x80, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0x80, 0x00, + 0x00, 0x3c, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7f, 0xff, + 0xc0, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, + 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7f, 0xff, + 0xc0, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, + 0x00, 0x00, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7f, 0xff, + 0xc0, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, + 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00, + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x1f, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, + 0x1f, 0xff, 0x80, 0x00, 0x00, 0x1f, 0xff, 0xf0, + 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x7c, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x07, + 0xc0, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x1f, 0xff, + 0xc0, 0x00, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x00, + 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xf0, + 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x01, + 0xff, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0xf8, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x0f, + 0xc0, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x00, 0x01, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xe0, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, + 0xe0, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00, + 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xf0, + 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x03, + 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x0f, + 0xc0, 0x00, 0x1f, 0x00, 0x1c, 0x00, 0x00, 0x03, + 0xff, 0xf0, 0x00, 0x00, 0x00, 0xfe, 0x07, 0xf0, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x01, + 0xf0, 0x00, 0x00, 0x07, 0xc1, 0xf0, 0x00, 0x00, + 0x1c, 0x01, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, + 0xe0, 0xfc, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x03, 0xe0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x0f, + 0xc0, 0x00, 0x1f, 0x80, 0x1c, 0x00, 0x00, 0x07, + 0xe1, 0xf8, 0x00, 0x00, 0x01, 0xf0, 0x00, 0xf8, + 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x78, 0x00, 0x00, + 0x1c, 0x00, 0x78, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x80, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x07, 0xc0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x1f, + 0xc0, 0x00, 0x1f, 0x80, 0x1c, 0x00, 0x00, 0x0f, + 0x80, 0x7c, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x7c, + 0x00, 0x01, 0xef, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x70, 0x00, 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, + 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x0f, 0x80, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xc0, 0x1d, + 0xc0, 0x00, 0x1f, 0xc0, 0x1c, 0x00, 0x00, 0x1e, + 0x00, 0x1e, 0x00, 0x00, 0x07, 0x80, 0x00, 0x3c, + 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x70, 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, + 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x0f, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x1f, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xc0, 0x1d, + 0xc0, 0x00, 0x1d, 0xc0, 0x1c, 0x00, 0x00, 0x1e, + 0x00, 0x1e, 0x00, 0x00, 0x0f, 0x03, 0xe3, 0x9e, + 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x1c, 0x00, + 0x70, 0x00, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x00, + 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x06, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x3e, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xe0, 0x1d, + 0xc0, 0x00, 0x1c, 0xe0, 0x1c, 0x00, 0x00, 0x1c, + 0x00, 0x0e, 0x00, 0x00, 0x0f, 0x0f, 0xf7, 0x8e, + 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x1c, 0x00, + 0xf0, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x7c, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x39, + 0xc0, 0x00, 0x1c, 0xf0, 0x1c, 0x00, 0x00, 0x3c, + 0x00, 0x0f, 0x00, 0x00, 0x1e, 0x1f, 0xff, 0x8f, + 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x1c, 0x01, + 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0xf8, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x39, + 0xc0, 0x00, 0x1c, 0x70, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x3e, 0x3f, 0x0f, + 0x00, 0x07, 0x83, 0xc0, 0x00, 0x00, 0x1f, 0xff, + 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1d, 0xf0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xf0, 0x39, + 0xc0, 0x00, 0x1c, 0x78, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x3c, 0x1f, 0x07, + 0x00, 0x07, 0x01, 0xc0, 0x00, 0x00, 0x1f, 0xff, + 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, 0xe0, + 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xf0, 0x79, + 0xc0, 0x00, 0x1c, 0x3c, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x3c, 0x78, 0x0f, 0x07, + 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x1f, 0xff, + 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, 0xe0, + 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x38, + 0x03, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x70, 0x71, + 0xc0, 0x00, 0x1c, 0x1c, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x38, 0x70, 0x0f, 0x07, + 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x1c, 0x01, + 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, 0xe0, + 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x38, + 0x03, 0xff, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1f, 0x9c, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x70, 0x71, + 0xc0, 0x00, 0x1c, 0x1e, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x38, 0xf0, 0x0f, 0x07, + 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x1c, 0x00, + 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x03, 0xff, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1f, 0x1e, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x78, 0xf1, + 0xc0, 0x00, 0x1c, 0x0f, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x38, 0xe0, 0x0e, 0x07, + 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1c, 0x00, + 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x38, 0xe1, + 0xc0, 0x00, 0x1c, 0x07, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x38, 0xe0, 0x0e, 0x0f, + 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1c, 0x00, + 0x38, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x00, 0x00, + 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x07, 0x80, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x38, 0xe1, + 0xc0, 0x00, 0x1c, 0x07, 0x9c, 0x00, 0x00, 0x3c, + 0x00, 0x0f, 0x00, 0x00, 0x38, 0xe0, 0x1e, 0x0e, + 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x1c, 0x00, + 0x38, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, + 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x03, 0x80, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x3d, 0xe1, + 0xc0, 0x00, 0x1c, 0x03, 0x9c, 0x00, 0x00, 0x1c, + 0x00, 0x0e, 0x00, 0x00, 0x38, 0xe0, 0x1e, 0x1e, + 0x00, 0x3c, 0x00, 0x78, 0x00, 0x00, 0x1c, 0x00, + 0x38, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00, + 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x03, 0xc0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1d, 0xc1, + 0xc0, 0x00, 0x1c, 0x01, 0xdc, 0x00, 0x00, 0x1e, + 0x00, 0x1e, 0x00, 0x00, 0x38, 0xe0, 0x3c, 0x1c, + 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, + 0x78, 0x00, 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, + 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x01, 0xe0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1d, 0xc1, + 0xc0, 0x00, 0x1c, 0x01, 0xfc, 0x00, 0x00, 0x1e, + 0x00, 0x1e, 0x00, 0x00, 0x3c, 0xf0, 0x7c, 0x3c, + 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, + 0x78, 0x00, 0x00, 0x0f, 0x00, 0x7c, 0x00, 0x00, + 0x1c, 0x00, 0x78, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x80, 0x1f, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x3c, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1f, 0xc1, + 0xc0, 0x00, 0x1c, 0x00, 0xfc, 0x00, 0x00, 0x0f, + 0x80, 0x7c, 0x00, 0x00, 0x3c, 0x78, 0xfc, 0xf8, + 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x01, + 0xf0, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00, 0x00, + 0x1c, 0x01, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, + 0xe0, 0x7f, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x78, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1f, 0x81, + 0xc0, 0x00, 0x1c, 0x00, 0xfc, 0x00, 0x00, 0x07, + 0xe1, 0xf8, 0x00, 0x00, 0x1c, 0x7f, 0xff, 0xf0, + 0x00, 0x70, 0x00, 0x1c, 0x00, 0x00, 0x1f, 0xff, + 0xe0, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00, + 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xf8, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xff, 0xfc, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf8, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, + 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x1c, 0x0f, 0x81, + 0xc0, 0x00, 0x1c, 0x00, 0x7c, 0x00, 0x00, 0x03, + 0xff, 0xf0, 0x00, 0x00, 0x1e, 0x3f, 0xdf, 0xe0, + 0x00, 0xf0, 0x00, 0x1e, 0x00, 0x00, 0x1f, 0xff, + 0xc0, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, + 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xff, 0xf8, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf0, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, + 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x1c, 0x0f, 0x81, + 0xc0, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x01, + 0xff, 0xe0, 0x00, 0x00, 0x0f, 0x1f, 0x0f, 0x87, + 0x80, 0xe0, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, + 0x80, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, + 0x1f, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xf8, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, + 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x1c, 0x0f, 0x01, + 0xc0, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x7e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x01, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x1f, 0xff, + 0xc0, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, + 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0xe0, 0x00, 0x0e, 0x00, 0x00, 0xe0, + 0x03, 0xe0, 0x03, 0x80, 0x3c, 0x00, 0x78, 0x00, + 0x00, 0xf0, 0x00, 0x78, 0x00, 0x00, 0x1f, 0xff, + 0xe0, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, + 0x00, 0x01, 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xff, + 0xf0, 0x00, 0x00, 0x03, 0xff, 0x80, 0x00, 0x00, + 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0xf0, 0x00, 0x1e, 0x00, 0x00, 0xf0, + 0x03, 0xe0, 0x07, 0x80, 0x1e, 0x00, 0xf0, 0x00, + 0x00, 0x70, 0x00, 0x70, 0x00, 0x00, 0x1f, 0xff, + 0xe0, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, + 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, + 0xf8, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, 0x00, + 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0xf0, 0x00, 0x1e, 0x00, 0x00, 0xf0, + 0x07, 0xe0, 0x07, 0x80, 0x0e, 0x00, 0xe0, 0x00, + 0x00, 0x78, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0xff, + 0xe0, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, + 0x00, 0x07, 0xc1, 0xf0, 0x00, 0x00, 0x1c, 0x00, + 0xf8, 0x00, 0x00, 0x0f, 0x83, 0xe0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x70, + 0x07, 0xf0, 0x07, 0x00, 0x0f, 0x01, 0xe0, 0x00, + 0x00, 0x3c, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x01, + 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, + 0x00, 0x0f, 0x00, 0x78, 0x00, 0x00, 0x1c, 0x00, + 0x3c, 0x00, 0x00, 0x1e, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x70, + 0x07, 0x70, 0x07, 0x00, 0x07, 0x83, 0xc0, 0x00, + 0x00, 0x1c, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, + 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, + 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, + 0x1c, 0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x78, + 0x07, 0x70, 0x0f, 0x00, 0x03, 0x83, 0x80, 0x00, + 0x00, 0x1e, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, + 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, + 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x3c, 0x00, 0x78, 0x00, 0x00, 0x78, + 0x0f, 0x78, 0x0f, 0x00, 0x03, 0xc7, 0x80, 0x00, + 0x00, 0x0f, 0x07, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, + 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, + 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x3c, 0x00, 0x78, 0x00, 0x00, 0x38, + 0x0e, 0x38, 0x0e, 0x00, 0x01, 0xef, 0x00, 0x00, + 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, + 0x00, 0x3c, 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, + 0x3c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x38, + 0x0e, 0x38, 0x0e, 0x00, 0x00, 0xfe, 0x00, 0x00, + 0x00, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, + 0x3c, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x1e, 0x00, 0xf0, 0x00, 0x00, 0x3c, + 0x0e, 0x38, 0x1e, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x03, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, + 0xf8, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x1e, 0x00, 0xf0, 0x00, 0x00, 0x3c, + 0x1e, 0x3c, 0x1e, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x03, 0xde, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, + 0xf8, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x1c, + 0x1c, 0x1c, 0x1c, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, + 0xf0, 0x00, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x1c, + 0x1c, 0x1c, 0x1c, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, + 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x07, 0x01, 0xc0, 0x00, 0x00, 0x1e, + 0x3c, 0x1c, 0x3c, 0x00, 0x00, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x01, 0xe0, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x07, 0x83, 0xc0, 0x00, 0x00, 0x1e, + 0x3c, 0x1e, 0x3c, 0x00, 0x01, 0xef, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0xc0, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x07, + 0x80, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x07, 0x83, 0xc0, 0x00, 0x00, 0x0e, + 0x38, 0x0e, 0x38, 0x00, 0x01, 0xc7, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0xc0, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x3c, 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x07, + 0xc0, 0x00, 0x00, 0x38, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x0e, + 0x38, 0x0e, 0x38, 0x00, 0x03, 0xc7, 0x80, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x03, + 0xe0, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x0f, + 0x78, 0x0f, 0x78, 0x00, 0x07, 0x83, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x07, 0x3c, 0x00, 0x00, 0x1c, 0x01, + 0xf0, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x3c, + 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x0f, + 0x70, 0x07, 0x78, 0x00, 0x0f, 0x01, 0xe0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x07, 0xb8, 0x00, 0x00, 0x1c, 0x00, + 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x3c, + 0x00, 0x00, 0x01, 0xef, 0x00, 0x00, 0x00, 0x07, + 0x70, 0x07, 0x70, 0x00, 0x0e, 0x00, 0xe0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x07, 0xf8, 0x00, 0x00, 0x1c, 0x00, + 0x78, 0x00, 0x00, 0x1e, 0x00, 0xf8, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x78, + 0x00, 0x00, 0x01, 0xef, 0x00, 0x00, 0x00, 0x07, + 0xf0, 0x07, 0xf0, 0x00, 0x1e, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0xc1, 0xf0, 0x00, 0x00, 0x1c, 0x00, + 0x78, 0x00, 0x00, 0x0f, 0xc1, 0xf0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x0f, 0xc1, 0xf8, + 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x07, + 0xf0, 0x07, 0xf0, 0x00, 0x3c, 0x00, 0x78, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00, + 0x3c, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf0, + 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x07, + 0xe0, 0x03, 0xf0, 0x00, 0x38, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7f, 0xff, + 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xff, 0xfe, 0x00, 0x00, 0x1c, 0x00, + 0x3e, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, + 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x03, + 0xe0, 0x03, 0xe0, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7f, 0xff, + 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0x9f, 0x00, 0x00, 0x1c, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, + 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x03, + 0xe0, 0x03, 0xe0, 0x00, 0xf0, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7f, 0xff, + 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x39, 0xf8, + 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, + 0x07, 0xe7, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, + 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x07, + 0xe7, 0x00, 0x00, 0x00, 0x38, 0xfc, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x0f, 0x80, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x39, 0xf0, 0x7e, + 0x00, 0x00, 0x39, 0xfc, 0x00, 0x00, 0x00, 0x03, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x3b, 0xfc, + 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, + 0x0f, 0xf7, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, + 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x0f, + 0xf7, 0x00, 0x00, 0x00, 0x3b, 0xfe, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x1f, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xfc, 0xff, + 0x00, 0x00, 0x3b, 0xff, 0x00, 0x00, 0x00, 0x0f, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x3f, 0xfe, + 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, + 0x1f, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, + 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x1f, + 0xff, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x3e, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfd, 0xff, + 0x80, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x1f, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x1f, 0x00, 0x00, 0x00, 0x3f, 0x1f, + 0x00, 0x00, 0x00, 0x3e, 0x1e, 0x00, 0x00, 0x00, + 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x3e, 0x1f, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x3e, + 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x0f, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x1f, 0x8f, + 0x80, 0x00, 0x3f, 0x0f, 0x80, 0x00, 0x00, 0x3e, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x3e, 0x07, + 0x00, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, + 0x38, 0x1f, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x1f, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x1f, 0x07, + 0x80, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x3c, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x07, + 0x80, 0x00, 0x00, 0x78, 0x07, 0x00, 0x00, 0x00, + 0x78, 0x0f, 0x00, 0x00, 0x00, 0x78, 0x07, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, + 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0f, 0x03, + 0x80, 0x00, 0x3c, 0x03, 0x80, 0x00, 0x00, 0x78, + 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3b, 0xc0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0xf7, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7c, 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0xf0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x80, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x07, + 0x80, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, + 0x78, 0x0f, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, + 0x0f, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x78, + 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x1f, 0x00, 0x00, 0x00, 0x3c, 0x0f, + 0x00, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00, 0x00, + 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x0f, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x3c, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7c, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x1f, + 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00, 0x00, + 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x3e, + 0x3f, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x3e, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x3f, 0xfe, + 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, + 0x1f, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0xff, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x1f, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0xf7, 0x80, 0x00, 0x00, 0x3b, 0xfc, + 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, + 0x0f, 0xf7, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xff, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x0f, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xe3, 0x80, 0x00, 0x00, 0x39, 0xf8, + 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, + 0x07, 0xe7, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, + 0xe7, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x03, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x39, 0xf8, 0x00, 0x00, + 0x00, 0x07, 0xe7, 0x00, 0x00, 0x00, 0x39, 0xe0, + 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0xf0, 0x07, 0x80, 0x00, 0x01, 0xe0, + 0x38, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x7f, 0xfe, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3b, 0xfc, 0x00, 0x00, + 0x00, 0x0f, 0xf7, 0x00, 0x00, 0x00, 0x3b, 0xe0, + 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0xf0, 0x07, 0x80, 0x00, 0x00, 0xe0, + 0x3c, 0x0e, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, + 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 0x7f, 0xfe, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x3f, 0xe0, + 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0xf0, + 0x7c, 0x1e, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, + 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x7f, 0xfe, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3f, 0x1f, 0x00, 0x00, + 0x00, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x00, 0x00, 0x78, 0x3e, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 0xf0, + 0x7c, 0x1e, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3e, 0x0f, 0x00, 0x00, + 0x00, 0x38, 0x1f, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x70, + 0x7c, 0x1c, 0x00, 0x00, 0x1e, 0x38, 0x00, 0x00, + 0x00, 0x3c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0xc0, 0xc0, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x70, + 0xec, 0x1c, 0x00, 0x00, 0x0e, 0x78, 0x00, 0x00, + 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0xf1, 0xc0, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3c, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x3c, 0x1e, 0x00, 0x00, 0x00, 0x78, + 0xee, 0x3c, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, + 0x00, 0x1e, 0x1c, 0x00, 0x00, 0x00, 0x01, 0xf0, + 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x00, 0x00, 0x71, 0xff, 0xc0, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x38, + 0xee, 0x38, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x00, 0x1e, 0x1c, 0x00, 0x00, 0x00, 0x01, 0xe0, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, + 0x00, 0x00, 0x60, 0x7f, 0x80, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x1e, 0x3c, 0x00, 0x00, 0x00, 0x38, + 0xe6, 0x38, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, + 0x00, 0x0e, 0x38, 0x00, 0x00, 0x00, 0x03, 0xc0, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, 0x00, 0x3d, + 0xc6, 0x78, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x00, 0x0f, 0x38, 0x00, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, 0x00, 0x1d, + 0xc7, 0x70, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x00, 0x0f, 0x38, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x0f, 0x78, 0x00, 0x00, 0x00, 0x1d, + 0xc7, 0x70, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0x80, + 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x1d, + 0xc3, 0x70, 0x00, 0x00, 0x0f, 0x70, 0x00, 0x00, + 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, + 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x78, 0x07, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, + 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x0f, + 0x83, 0xe0, 0x00, 0x00, 0x1e, 0x78, 0x00, 0x00, + 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x7c, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3f, 0x1f, 0x00, 0x00, + 0x00, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x1f, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x1f, 0x80, + 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x0f, + 0x83, 0xe0, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, + 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x0f, + 0x83, 0xe0, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3b, 0xfc, 0x00, 0x00, + 0x00, 0x0f, 0xf7, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfb, 0x80, + 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x0f, + 0x03, 0xc0, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x39, 0xf0, 0x00, 0x00, + 0x00, 0x03, 0xe7, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe3, 0x80, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x07, + 0x01, 0xc0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, + 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0xf0, 0x24, 0x00, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x0c, 0x94, 0xea, 0xff, 0xfd, 0x70, + 0xea, 0x00, 0x00, 0x01, 0xe3, 0x5c, 0x00, 0xb7, + 0xa5, 0x9f, 0xf0, 0x04, 0xe0, 0x86, 0xc0, 0x0c, + 0xe5, 0x9f, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0x74, + 0x00, 0x00, 0x0c, 0x98, 0x00, 0x00, 0x00, 0x0f, + 0xf0, 0x24, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x0e, 0x4c, + 0xea, 0xff, 0xfd, 0x03, 0xea, 0x00, 0x00, 0x07, + 0xe5, 0x9f, 0xc0, 0x1c, 0xe5, 0x9c, 0x30, 0x00, + 0xe3, 0x83, 0x33, 0x33, 0xe1, 0x52, 0x00, 0x03, + 0x05, 0x9f, 0xc0, 0x10, 0x05, 0x9c, 0xc0, 0x00, + 0x03, 0x8c, 0x23, 0x33, 0xe5, 0x9f, 0xc0, 0x08, + 0xe5, 0x9f, 0xf0, 0x08, 0x66, 0x00, 0x00, 0x60, + 0x66, 0x00, 0x00, 0x5c, 0x66, 0x00, 0x00, 0x58, + 0x00, 0x00, 0x0e, 0x50, 0x00, 0x00, 0x00, 0x01, + 0xf0, 0x24, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x02, 0x6c, + 0xa0, 0x00, 0x0b, 0x38, 0x00, 0x00, 0x01, 0xc0, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x17, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1a, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x05, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x02, 0x02, 0x02, 0x02, 0x40, + 0xe5, 0x9f, 0xc0, 0x00, 0xe1, 0x2f, 0xff, 0x1c, + 0x2e, 0x01, 0xcf, 0x19, 0xe5, 0x9f, 0xc0, 0x00, + 0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x00, 0x5b, 0x17, + 0xe5, 0x9f, 0xc0, 0x00, 0xe1, 0x2f, 0xff, 0x1c, + 0x2e, 0x00, 0x5b, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x02, 0x37, 0x7c, + 0x2e, 0x02, 0x38, 0x94, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x02, 0x37, 0x7c, 0xff, 0x7f, 0x3f, 0x1f, + 0x0f, 0x07, 0x03, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x01, 0x00, 0x43, 0x6f, 0x70, 0x79, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x46, 0x75, + 0x6a, 0x69, 0x74, 0x73, 0x75, 0x20, 0x53, 0x69, + 0x65, 0x6d, 0x65, 0x6e, 0x73, 0x20, 0x26, 0x20, + 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x67, 0x65, + 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x57, 0x5e, 0x61, 0xa3, + 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x0c, + 0x6c, 0x00, 0x00, 0x24, 0x64, 0x00, 0x00, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x07, 0xd0, + 0x00, 0x00, 0x13, 0x88, 0x02, 0x02, 0x01, 0x00, + 0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x07, 0xd0, + 0x00, 0x00, 0x13, 0x88, 0x02, 0x02, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xd0, + 0x2e, 0x08, 0x05, 0xd0, 0x2e, 0x08, 0x05, 0xd8, + 0x2e, 0x08, 0x05, 0xd8, 0x2e, 0x08, 0x05, 0xe0, + 0x2e, 0x08, 0x05, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, + 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, + 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, + 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, + 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, + 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, + 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, + 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, + 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, + 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, + 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, + 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, + 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, + 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, + 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, + 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, + 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e, + 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, + 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, + 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, + 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, + 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, + 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, + 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0xfe, + 0x6c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, + 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, + 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, + 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, + 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, + 0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, + 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, + 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, + 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, + 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xd6, 0xd6, + 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, + 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, + 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, + 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, + 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, + 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, + 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, + 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, + 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, + 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, + 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, + 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde, + 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, + 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, + 0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, + 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, + 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, + 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, + 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, + 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, + 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, + 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, + 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, + 0xd6, 0xfe, 0xee, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x7c, 0x38, 0x38, + 0x7c, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc6, 0x86, 0x0c, 0x18, 0x30, + 0x60, 0xc2, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, + 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, + 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, + 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, + 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x36, 0x32, 0x30, 0x78, 0x30, + 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, + 0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, + 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, + 0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, + 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6, + 0xd6, 0xd6, 0xd6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, + 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, + 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, + 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6, + 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38, + 0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, + 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, + 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, + 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, + 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc2, 0x66, 0x3c, 0x18, 0x70, 0x00, 0x00, + 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, + 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, + 0xc0, 0xc0, 0xc6, 0x7c, 0x18, 0x70, 0x00, 0x00, + 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, + 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe, + 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, + 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, + 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x6c, 0x38, 0x10, 0x38, 0x6c, 0xc6, 0xfe, + 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x18, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, + 0x68, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x36, 0x36, + 0x7e, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, + 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, + 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x18, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, + 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, + 0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, + 0x7e, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xcc, 0xcc, 0xf8, 0xc4, 0xcc, 0xde, + 0xcc, 0xcc, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, + 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, + 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, + 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, + 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0xe0, 0x62, 0x66, 0x6c, 0x18, 0x30, + 0x60, 0xdc, 0x86, 0x0c, 0x18, 0x3e, 0x00, 0x00, + 0x00, 0x60, 0xe0, 0x62, 0x66, 0x6c, 0x18, 0x30, + 0x66, 0xce, 0x9a, 0x3f, 0x06, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, + 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, + 0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, + 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, + 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, + 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, + 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, + 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, + 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, + 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, + 0xc6, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c, + 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x18, + 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, + 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, + 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, + 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, + 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, + 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, + 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, + 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, + 0x18, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, + 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, + 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x7e, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, + 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, + 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6c, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3c, 0x66, 0x0c, 0x18, 0x32, 0x7e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x65, 0xd0, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, + 0x2e, 0x08, 0x07, 0xa4, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x17, + 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf7, + 0x11, 0x38, 0x06, 0x53, 0x2e, 0x08, 0x17, 0xe4, + 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x21, + 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x39, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x21, + 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xb9, + 0x0e, 0xa6, 0x06, 0x53, 0x2e, 0x08, 0x19, 0x14, + 0x2e, 0x08, 0x1a, 0x38, 0x2e, 0x08, 0x19, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x8b, 0x98, 0x00, 0x44, 0x45, 0x55, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x64, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x80, 0x10, 0x80, 0x00, 0x80, 0xda, 0x80, + 0x00, 0x5a, 0x51, 0xf0, 0x00, 0x36, 0x91, 0x22, + 0x00, 0xf0, 0x29, 0x6e, 0x00, 0x10, 0xd2, 0x92, + 0x00, 0xca, 0x6a, 0xde, 0x00, 0xa6, 0xaa, 0x10, + 0x00, 0x80, 0x3b, 0x80, 0x00, 0x80, 0xbc, 0x80, + 0x00, 0x80, 0x7e, 0x80, 0x00, 0xcf, 0x22, 0x73, + 0x00, 0x93, 0x48, 0x5d, 0x00, 0xa2, 0x73, 0x93, + 0x00, 0x25, 0xae, 0xad, 0x00, 0xa7, 0x9f, 0x60, + 0x00, 0x10, 0x10, 0x10, 0x00, 0x59, 0x10, 0x10, + 0x00, 0xa2, 0x10, 0x10, 0x00, 0xeb, 0x10, 0x10, + 0x00, 0x10, 0x10, 0x59, 0x00, 0x59, 0x10, 0x59, + 0x00, 0xa2, 0x10, 0x59, 0x00, 0xeb, 0x10, 0x59, + 0x00, 0x10, 0x10, 0xa2, 0x00, 0x59, 0x10, 0xa2, + 0x00, 0xa2, 0x10, 0xa2, 0x00, 0xeb, 0x10, 0xa2, + 0x00, 0x10, 0x10, 0xeb, 0x00, 0x59, 0x10, 0xeb, + 0x00, 0xa2, 0x10, 0xeb, 0x00, 0xeb, 0x10, 0xeb, + 0x00, 0x10, 0x2f, 0x10, 0x00, 0x59, 0x2f, 0x10, + 0x00, 0xa2, 0x2f, 0x10, 0x00, 0xeb, 0x2f, 0x10, + 0x00, 0x10, 0x2f, 0x59, 0x00, 0x59, 0x2f, 0x59, + 0x00, 0xa2, 0x2f, 0x59, 0x00, 0xeb, 0x2f, 0x59, + 0x00, 0x10, 0x2f, 0xa2, 0x00, 0x59, 0x2f, 0xa2, + 0x00, 0xa2, 0x2f, 0xa2, 0x00, 0xeb, 0x2f, 0xa2, + 0x00, 0x10, 0x2f, 0xeb, 0x00, 0x59, 0x2f, 0xeb, + 0x00, 0xa2, 0x2f, 0xeb, 0x00, 0xeb, 0x2f, 0xeb, + 0x00, 0x10, 0x4e, 0x10, 0x00, 0x59, 0x4e, 0x10, + 0x00, 0xa2, 0x4e, 0x10, 0x00, 0xeb, 0x4e, 0x10, + 0x00, 0x10, 0x4e, 0x59, 0x00, 0x59, 0x4e, 0x59, + 0x00, 0xa2, 0x4e, 0x59, 0x00, 0xeb, 0x4e, 0x59, + 0x00, 0x10, 0x4e, 0xa2, 0x00, 0x59, 0x4e, 0xa2, + 0x00, 0xa2, 0x4e, 0xa2, 0x00, 0xeb, 0x4e, 0xa2, + 0x00, 0x10, 0x4e, 0xeb, 0x00, 0x59, 0x4e, 0xeb, + 0x00, 0xa2, 0x4e, 0xeb, 0x00, 0xeb, 0x4e, 0xeb, + 0x00, 0x10, 0x6d, 0x10, 0x00, 0x59, 0x6d, 0x10, + 0x00, 0xa2, 0x6d, 0x10, 0x00, 0xeb, 0x6d, 0x10, + 0x00, 0x10, 0x6d, 0x59, 0x00, 0x59, 0x6d, 0x59, + 0x00, 0xa2, 0x6d, 0x59, 0x00, 0xeb, 0x6d, 0x59, + 0x00, 0x10, 0x6d, 0xa2, 0x00, 0x59, 0x6d, 0xa2, + 0x00, 0xa2, 0x6d, 0xa2, 0x00, 0xeb, 0x6d, 0xa2, + 0x00, 0x10, 0x6d, 0xeb, 0x00, 0x59, 0x6d, 0xeb, + 0x00, 0xa2, 0x6d, 0xeb, 0x00, 0xeb, 0x6d, 0xeb, + 0x00, 0x10, 0x8c, 0x10, 0x00, 0x59, 0x8c, 0x10, + 0x00, 0xa2, 0x8c, 0x10, 0x00, 0xeb, 0x8c, 0x10, + 0x00, 0x10, 0x8c, 0x59, 0x00, 0x59, 0x8c, 0x59, + 0x00, 0xa2, 0x8c, 0x59, 0x00, 0xeb, 0x8c, 0x59, + 0x00, 0x10, 0x8c, 0xa2, 0x00, 0x59, 0x8c, 0xa2, + 0x00, 0xa2, 0x8c, 0xa2, 0x00, 0xeb, 0x8c, 0xa2, + 0x00, 0x10, 0x8c, 0xeb, 0x00, 0x59, 0x8c, 0xeb, + 0x00, 0xa2, 0x8c, 0xeb, 0x00, 0xeb, 0x8c, 0xeb, + 0x00, 0x10, 0xab, 0x10, 0x00, 0x59, 0xab, 0x10, + 0x00, 0xa2, 0xab, 0x10, 0x00, 0xeb, 0xab, 0x10, + 0x00, 0x10, 0xab, 0x59, 0x00, 0x59, 0xab, 0x59, + 0x00, 0xa2, 0xab, 0x59, 0x00, 0xeb, 0xab, 0x59, + 0x00, 0x10, 0xab, 0xa2, 0x00, 0x59, 0xab, 0xa2, + 0x00, 0xa2, 0xab, 0xa2, 0x00, 0xeb, 0xab, 0xa2, + 0x00, 0x10, 0xab, 0xeb, 0x00, 0x59, 0xab, 0xeb, + 0x00, 0xa2, 0xab, 0xeb, 0x00, 0xeb, 0xab, 0xeb, + 0x00, 0x10, 0xca, 0x10, 0x00, 0x59, 0xca, 0x10, + 0x00, 0xa2, 0xca, 0x10, 0x00, 0xeb, 0xca, 0x10, + 0x00, 0x10, 0xca, 0x59, 0x00, 0x59, 0xca, 0x59, + 0x00, 0xa2, 0xca, 0x59, 0x00, 0xeb, 0xca, 0x59, + 0x00, 0x10, 0xca, 0xa2, 0x00, 0x59, 0xca, 0xa2, + 0x00, 0xa2, 0xca, 0xa2, 0x00, 0xeb, 0xca, 0xa2, + 0x00, 0x10, 0xca, 0xeb, 0x00, 0x59, 0xca, 0xeb, + 0x00, 0xa2, 0xca, 0xeb, 0x00, 0xeb, 0xca, 0xeb, + 0x00, 0x10, 0xe9, 0x10, 0x00, 0x59, 0xe9, 0x10, + 0x00, 0xa2, 0xe9, 0x10, 0x00, 0xeb, 0xe9, 0x10, + 0x00, 0x10, 0xe9, 0x59, 0x00, 0x59, 0xe9, 0x59, + 0x00, 0xa2, 0xe9, 0x59, 0x00, 0xeb, 0xe9, 0x59, + 0x00, 0x10, 0xe9, 0xa2, 0x00, 0x59, 0xe9, 0xa2, + 0x00, 0xa2, 0xe9, 0xa2, 0x00, 0xeb, 0xe9, 0xa2, + 0x00, 0x10, 0xe9, 0xeb, 0x00, 0x59, 0xe9, 0xeb, + 0x00, 0xa2, 0xe9, 0xeb, 0x00, 0xeb, 0xe9, 0xeb, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x24, 0xc0, + 0xc1, 0x11, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x6d, 0xbb, 0xeb, 0x8e, 0x01, 0xea, 0x25, + 0x04, 0xd0, 0x82, 0x49, 0xed, 0x4c, 0x8f, 0xc2, + 0x66, 0x0b, 0x65, 0xc5, 0x0c, 0xc2, 0x41, 0x19, + 0x07, 0xa8, 0x94, 0x13, 0x42, 0x09, 0x27, 0xb5, + 0x32, 0x3f, 0x09, 0x98, 0x2d, 0x97, 0x14, 0x33, + 0x09, 0x04, 0x64, 0x00, 0xff, 0xff, 0x24, 0xc0, + 0xe0, 0x11, 0x21, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x13, 0x8e, 0xf7, 0xe7, 0x6e, 0x9c, 0x0c, 0xc3, + 0xd2, 0xb4, 0x05, 0x16, 0x3c, 0x8e, 0x82, 0xd4, + 0x16, 0x5e, 0x9c, 0x0c, 0xc3, 0xd2, 0xb4, 0x05, + 0x16, 0x3c, 0x8e, 0x82, 0xd4, 0x16, 0x5e, 0x9c, + 0x0c, 0xc3, 0xd2, 0xb4, 0x05, 0x16, 0x3c, 0x8e, + 0x82, 0xd4, 0x16, 0x50, 0xff, 0xff, 0x24, 0xc0, + 0xd4, 0x11, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0d, 0x4d, 0xf8, 0xd5, 0x9e, 0x7f, 0x02, 0x22, + 0x08, 0xa3, 0xbd, 0x94, 0x53, 0x16, 0x79, 0xfc, + 0x08, 0x88, 0x22, 0x8e, 0xf6, 0x51, 0x4c, 0x59, + 0xe7, 0xf0, 0x22, 0x20, 0x8a, 0x3b, 0xd9, 0x45, + 0x31, 0x67, 0x9f, 0xc0, 0x88, 0x82, 0x28, 0xef, + 0x65, 0x14, 0xc4, 0x00, 0xff, 0xff, 0x24, 0xc0, + 0xe8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x6d, 0xfb, 0x1d, 0x77, 0xc1, 0x38, 0x81, + 0xfb, 0xb1, 0xd7, 0x7c, 0x13, 0x88, 0x1f, 0xbb, + 0x1d, 0x77, 0xc1, 0x38, 0x81, 0xfb, 0xb1, 0xd7, + 0x7c, 0x13, 0x88, 0x1f, 0xbb, 0x1d, 0x77, 0xc1, + 0x38, 0x81, 0xfb, 0xb1, 0xd7, 0x7c, 0x13, 0x88, + 0x1f, 0x80, 0x00, 0x00, 0xff, 0xff, 0x24, 0xc0, + 0x9b, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x3d, 0x75, 0xf7, 0x14, 0x0a, 0xc3, 0x29, + 0x9f, 0x51, 0xbc, 0xfb, 0xdc, 0x7b, 0x8a, 0x05, + 0x61, 0x94, 0xcf, 0xa8, 0xde, 0x7d, 0xee, 0x3d, + 0xc5, 0x02, 0xb0, 0xca, 0x67, 0xd4, 0x6f, 0x3e, + 0xf7, 0x1e, 0xe2, 0x81, 0x58, 0x65, 0x33, 0xea, + 0x37, 0x9f, 0x7b, 0x80, 0xff, 0xff, 0x24, 0xc0, + 0x12, 0xe0, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xeb, 0x50, 0xfb, 0xe7, 0x78, 0x1f, 0xde, 0xa1, + 0x62, 0x99, 0x11, 0x36, 0x02, 0x00, 0x97, 0xd6, + 0x69, 0x98, 0x1f, 0xde, 0xa1, 0x62, 0x99, 0x11, + 0x36, 0x02, 0x00, 0x97, 0xd6, 0x69, 0x98, 0x1f, + 0xde, 0xa1, 0x62, 0x99, 0x11, 0x36, 0x02, 0x00, + 0x97, 0xd6, 0x69, 0x90, 0xff, 0xff, 0x24, 0xc0, + 0x11, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdf, 0x95, 0x03, 0xa1, 0x49, 0xc5, 0x45, 0xe7, + 0x96, 0xe6, 0x1d, 0xdc, 0x0d, 0x50, 0xa4, 0xe2, + 0xa2, 0xf3, 0xcb, 0x73, 0x0e, 0xee, 0x06, 0xa8, + 0x52, 0x71, 0x51, 0x79, 0xe5, 0xb9, 0x87, 0x77, + 0x03, 0x54, 0x29, 0x38, 0xa8, 0xbc, 0xf2, 0xdc, + 0xc3, 0xbb, 0x81, 0xa0, 0xff, 0xff, 0x24, 0xc0, + 0x11, 0x21, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe7, 0xae, 0x35, 0x0d, 0x42, 0x14, 0xc2, 0xf9, + 0x4a, 0x13, 0x55, 0xa6, 0x6e, 0xf4, 0x88, 0x53, + 0x0b, 0xe5, 0x28, 0x4d, 0x56, 0x99, 0xbb, 0xd2, + 0x21, 0x4c, 0x2f, 0x94, 0xa1, 0x35, 0x5a, 0x66, + 0xef, 0x48, 0x85, 0x30, 0xbe, 0x52, 0x84, 0xd5, + 0x69, 0x9b, 0xbd, 0x20, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x1f, 0xc8, 0x2e, 0x08, 0x1f, 0xcc, + 0x2e, 0x08, 0x1f, 0xd0, 0x2e, 0x08, 0x1f, 0xd8, + 0x2e, 0x08, 0x1f, 0xdc, 0x2e, 0x08, 0x1f, 0xe0, + 0x6e, 0x00, 0x01, 0x00, 0x6e, 0x00, 0x01, 0x00, + 0x6e, 0x00, 0x01, 0x08, 0x6e, 0x00, 0x01, 0x0c, + 0x6e, 0x00, 0x01, 0x04, 0x6e, 0x00, 0x01, 0x10, + 0x6e, 0x00, 0x01, 0x14, 0x2e, 0x08, 0x9d, 0xc4, + 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x25, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x68, 0x00, 0x0d, 0x00, 0x2e, 0x08, 0x20, 0x2c, + 0x2e, 0x08, 0x20, 0x30, 0x2e, 0x08, 0x20, 0x34, + 0x2e, 0x08, 0x20, 0x38, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x04, 0x70, 0x00, 0x00, 0x08, + 0x70, 0x00, 0x00, 0x0c, 0x70, 0x00, 0x00, 0x10, + 0x70, 0x00, 0x00, 0x30, 0x2e, 0x02, 0x3a, 0x7d, + 0x2e, 0x02, 0x3a, 0x0d, 0x2e, 0x02, 0x39, 0x85, + 0x2e, 0x02, 0x39, 0x7d, 0x2e, 0x02, 0x3a, 0xb5, + 0x2e, 0x02, 0x3a, 0x45, 0x2e, 0x02, 0x3a, 0xf9, + 0x2e, 0x02, 0x3a, 0xf1, 0x00, 0x00, 0x00, 0x00, + 0x9e, 0x00, 0x09, 0x80, 0x80, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, + 0xff, 0xf0, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, + 0xff, 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, + 0xff, 0xff, 0xc0, 0x00, 0xff, 0xff, 0xe0, 0x00, + 0xff, 0xff, 0xf0, 0x00, 0xff, 0xff, 0xf8, 0x00, + 0xff, 0xff, 0xfc, 0x00, 0xff, 0xff, 0xfe, 0x00, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xc0, 0xe0, 0xf0, + 0xf8, 0xfc, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x03, 0xa9, 0x18, + 0x2e, 0x03, 0xa9, 0x1a, 0x2e, 0x03, 0xa9, 0x1b, + 0x2e, 0x03, 0xa9, 0x1c, 0x2e, 0x03, 0xa9, 0x1d, + 0x2e, 0x03, 0xa9, 0x1e, 0x2e, 0x03, 0xa9, 0x1f, + 0x2e, 0x03, 0xa9, 0x20, 0x2e, 0x03, 0xa9, 0x21, + 0x2e, 0x03, 0xa9, 0x22, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, +}; + diff --git a/drivers/media/dvb/av7110/av7110_ir.c b/drivers/media/dvb/av7110/av7110_ir.c new file mode 100644 index 000000000000..096fa0c62716 --- /dev/null +++ b/drivers/media/dvb/av7110/av7110_ir.c @@ -0,0 +1,171 @@ +#include <asm/types.h> +#include <asm/bitops.h> +#include <linux/init.h> +#include <linux/module.h> +#include <linux/input.h> +#include <linux/proc_fs.h> + +#include "av7110.h" + + +#define UP_TIMEOUT (HZ/2) + +static int av7110_ir_debug = 0; + +#define dprintk(x...) do { if (av7110_ir_debug) printk (x); } while (0) + + +static struct input_dev input_dev; + + +static +u16 key_map [256] = { + KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, + KEY_8, KEY_9, KEY_LAST, 0, KEY_POWER, KEY_MUTE, 0, KEY_INFO, + KEY_VOLUMEUP, KEY_VOLUMEDOWN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + KEY_CHANNELUP, KEY_CHANNELDOWN, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, KEY_TEXT, 0, 0, KEY_TV, 0, 0, 0, 0, 0, KEY_SETUP, 0, 0, + 0, 0, 0, KEY_SUBTITLE, 0, 0, KEY_LANGUAGE, 0, + KEY_RADIO, 0, 0, 0, 0, KEY_EXIT, 0, 0, + KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_OK, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_RED, KEY_GREEN, KEY_YELLOW, + KEY_BLUE, 0, 0, 0, 0, 0, 0, 0, KEY_MENU, KEY_LIST, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, KEY_UP, KEY_UP, KEY_DOWN, KEY_DOWN, + 0, 0, 0, 0, KEY_EPG, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_MHP +}; + + +static +void av7110_emit_keyup (unsigned long data) +{ + if (!data || !test_bit (data, input_dev.key)) + return; + + input_event (&input_dev, EV_KEY, data, !!0); +} + + +static +struct timer_list keyup_timer = { function: av7110_emit_keyup }; + + +static +void av7110_emit_key (u32 ircom) +{ + int down = ircom & (0x80000000); + u16 keycode = key_map[ircom & 0xff]; + + dprintk ("#########%08x######### key %02x %s (keycode %i)\n", + ircom, ircom & 0xff, down ? "pressed" : "released", keycode); + + if (!keycode) { + printk ("%s: unknown key 0x%02x!!\n", + __FUNCTION__, ircom & 0xff); + return; + } + + if (timer_pending (&keyup_timer)) { + del_timer (&keyup_timer); + if (keyup_timer.data != keycode) + input_event (&input_dev, EV_KEY, keyup_timer.data, !!0); + } + + clear_bit (keycode, input_dev.key); + + input_event (&input_dev, EV_KEY, keycode, !0); + + keyup_timer.expires = jiffies + UP_TIMEOUT; + keyup_timer.data = keycode; + + add_timer (&keyup_timer); +} + +static +void input_register_keys (void) +{ + int i; + + memset (input_dev.keybit, 0, sizeof(input_dev.keybit)); + + for (i=0; i<sizeof(key_map)/sizeof(key_map[0]); i++) { + if (key_map[i] > KEY_MAX) + key_map[i] = 0; + else if (key_map[i] > KEY_RESERVED) + set_bit (key_map[i], input_dev.keybit); + } +} + + +static +int av7110_ir_write_proc (struct file *file, const char *buffer, + unsigned long count, void *data) +{ + u32 ir_config; + + if (count < 4 + 256 * sizeof(u16)) + return -EINVAL; + + memcpy (&ir_config, buffer, 4); + memcpy (&key_map, buffer + 4, 256 * sizeof(u16)); + + av7110_setup_irc_config (NULL, ir_config); + + input_register_keys (); + + return count; +} + + +int __init av7110_ir_init (void) +{ + static struct proc_dir_entry *e; + + init_timer (&keyup_timer); + keyup_timer.data = 0; + + input_dev.name = "DVB on-card IR receiver"; + + /** + * enable keys + */ + set_bit (EV_KEY, input_dev.evbit); + + input_register_keys (); + + input_register_device(&input_dev); + + av7110_setup_irc_config (NULL, 0x0001); + av7110_register_irc_handler (av7110_emit_key); + + e = create_proc_entry ("av7110_ir", S_IFREG | S_IRUGO | S_IWUSR, NULL); + + if (e) { + e->write_proc = av7110_ir_write_proc; + e->size = 4 + 256 * sizeof(u16); + } + + return 0; +} + + +void __exit av7110_ir_exit (void) +{ + remove_proc_entry ("av7110_ir", NULL); + av7110_unregister_irc_handler (av7110_emit_key); + input_unregister_device(&input_dev); +} + +//MODULE_AUTHOR("Holger Waechtler <holger@convergence.de>"); +//MODULE_LICENSE("GPL"); + +MODULE_PARM(av7110_ir_debug,"i"); +MODULE_PARM_DESC(av7110_ir_debug, "enable AV7110 IR receiver debug messages"); + diff --git a/drivers/media/dvb/av7110/saa7146.c b/drivers/media/dvb/av7110/saa7146.c new file mode 100644 index 000000000000..d0ef805dda34 --- /dev/null +++ b/drivers/media/dvb/av7110/saa7146.c @@ -0,0 +1,1662 @@ +/* + the api- and os-independet parts of the saa7146 device driver + + Copyright (C) 1998,1999 Michael Hunold <michael@mihu.de> + + 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 "saa7146_defs.h" + +#define TRUNC(val,max) ((val) < (max) ? (val) : (max)) + +#ifdef __COMPILE_SAA7146__ + +struct saa7146_modes_constants + modes_constants[] = { + { V_OFFSET_PAL, V_FIELD_PAL, V_ACTIVE_LINES_PAL, + H_OFFSET_PAL, H_PIXELS_PAL, H_PIXELS_PAL+1, + V_ACTIVE_LINES_PAL, 1024 }, /* PAL values */ + { V_OFFSET_NTSC, V_FIELD_NTSC, V_ACTIVE_LINES_NTSC, + H_OFFSET_NTSC, H_PIXELS_NTSC, H_PIXELS_NTSC+1, + V_ACTIVE_LINES_NTSC, 1024 }, /* NTSC values */ + { 0,0,0,0,0,0,0,0 }, /* secam values */ + { 0,288,576, + 0,188*4,188*4+1, + 288,188*4 } /* TS values */ +}; + +/* ----------------------------------------------------------------------------------------- + helper functions for the calculation of the horizontal- and vertical scaling registers, + clip-format-register etc ... + these functions take pointers to the (most-likely read-out original-values) and manipulate + them according to the requested new scaling parameters. + ----------------------------------------------------------------------------------------- */ + +/* hps_coeff used for CXY and CXUV; scale 1/1 -> scale 1/64 */ +struct { + u16 hps_coeff; + u16 weight_sum; +} hps_h_coeff_tab [] = { + {0x00, 2}, {0x02, 4}, {0x00, 4}, {0x06, 8}, {0x02, 8}, + {0x08, 8}, {0x00, 8}, {0x1E, 16}, {0x0E, 8}, {0x26, 8}, + {0x06, 8}, {0x42, 8}, {0x02, 8}, {0x80, 8}, {0x00, 8}, + {0xFE, 16}, {0xFE, 8}, {0x7E, 8}, {0x7E, 8}, {0x3E, 8}, + {0x3E, 8}, {0x1E, 8}, {0x1E, 8}, {0x0E, 8}, {0x0E, 8}, + {0x06, 8}, {0x06, 8}, {0x02, 8}, {0x02, 8}, {0x00, 8}, + {0x00, 8}, {0xFE, 16}, {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, + {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, + {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, + {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, {0x7E, 8}, + {0x7E, 8}, {0x3E, 8}, {0x3E, 8}, {0x1E, 8}, {0x1E, 8}, + {0x0E, 8}, {0x0E, 8}, {0x06, 8}, {0x06, 8}, {0x02, 8}, + {0x02, 8}, {0x00, 8}, {0x00, 8}, {0xFE, 16} +}; + +/* table of attenuation values for horizontal scaling */ +u8 h_attenuation[] = { 1, 2, 4, 8, 2, 4, 8, 16, 0}; + +int calculate_h_scale_registers(struct saa7146* saa, u32 in_x, u32 out_x, int flip_lr, u32* hps_ctrl, u32* hps_v_gain, u32* hps_h_prescale, u32* hps_h_scale) +{ + /* horizontal prescaler */ + u32 dcgx = 0, xpsc = 0, xacm = 0, cxy = 0, cxuv = 0; + /* horizontal scaler */ + u32 xim = 0, xp = 0, xsci =0; + /* vertical scale & gain */ + u32 pfuv = 0; + /* helper variables */ + u32 h_atten = 0, i = 0; + + if ( 0 == out_x ) { + printk("saa7146: ==> calculate_h_scale_registers: invalid value (=0).\n"); + return -EINVAL; + } + + /* mask out vanity-bit */ + *hps_ctrl &= ~MASK_29; + + /* calculate prescale-(xspc)-value: [n .. 1/2) : 1 + [1/2 .. 1/3) : 2 + [1/3 .. 1/4) : 3 + ... */ + if (in_x > out_x) { + xpsc = in_x / out_x; + } else { + /* zooming */ + xpsc = 1; + } + + /* if flip_lr-bit is set, number of pixels after horizontal prescaling must be < 384 */ + if ( 0 != flip_lr ) { + /* set vanity bit */ + *hps_ctrl |= MASK_29; + + while (in_x / xpsc >= 384 ) + xpsc++; + } + /* if zooming is wanted, number of pixels after horizontal prescaling must be < 768 */ + else { + while ( in_x / xpsc >= 768 ) + xpsc++; + } + + /* maximum prescale is 64 (p.69) */ + if ( xpsc > 64 ) + xpsc = 64; + + /* keep xacm clear*/ + xacm = 0; + + /* set horizontal filter parameters (CXY = CXUV) */ + cxy = hps_h_coeff_tab[TRUNC(xpsc - 1, 63)].hps_coeff; + cxuv = cxy; + + /* calculate and set horizontal fine scale (xsci) */ + + /* bypass the horizontal scaler ? */ + if ( (in_x == out_x) && ( 1 == xpsc ) ) + xsci = 0x400; + else + xsci = ( (1024 * in_x) / (out_x * xpsc) ) + xpsc; + + /* set start phase for horizontal fine scale (xp) to 0 */ + xp = 0; + + /* set xim, if we bypass the horizontal scaler */ + if ( 0x400 == xsci ) + xim = 1; + else + xim = 0; + + /* if the prescaler is bypassed, enable horizontal accumulation mode (xacm) + and clear dcgx */ + if( 1 == xpsc ) { + xacm = 1; + dcgx = 0; + } else { + xacm = 0; + /* get best match in the table of attenuations for horizontal scaling */ + h_atten = hps_h_coeff_tab[TRUNC(xpsc - 1, 63)].weight_sum; + + for (i = 0; h_attenuation[i] != 0; i++) { + if (h_attenuation[i] >= h_atten) + break; + } + + dcgx = i; + } + + /* the horizontal scaling increment controls the UV filter to reduce the bandwith to + improve the display quality, so set it ... */ + if ( xsci == 0x400) + pfuv = 0x00; + else if ( xsci < 0x600) + pfuv = 0x01; + else if ( xsci < 0x680) + pfuv = 0x11; + else if ( xsci < 0x700) + pfuv = 0x22; + else + pfuv = 0x33; + + + *hps_v_gain &= MASK_W0|MASK_B2; + *hps_v_gain |= (pfuv << 24); + + *hps_h_scale &= ~(MASK_W1 | 0xf000); + *hps_h_scale |= (xim << 31) | (xp << 24) | (xsci << 12); + + *hps_h_prescale |= (dcgx << 27) | ((xpsc-1) << 18) | (xacm << 17) | (cxy << 8) | (cxuv << 0); + + return 0; +} + +struct { + u16 hps_coeff; + u16 weight_sum; +} hps_v_coeff_tab [] = { + {0x0100, 2}, {0x0102, 4}, {0x0300, 4}, {0x0106, 8}, + {0x0502, 8}, {0x0708, 8}, {0x0F00, 8}, {0x011E, 16}, + {0x110E, 16}, {0x1926, 16}, {0x3906, 16}, {0x3D42, 16}, + {0x7D02, 16}, {0x7F80, 16}, {0xFF00, 16}, {0x01FE, 32}, + {0x01FE, 32}, {0x817E, 32}, {0x817E, 32}, {0xC13E, 32}, + {0xC13E, 32}, {0xE11E, 32}, {0xE11E, 32}, {0xF10E, 32}, + {0xF10E, 32}, {0xF906, 32}, {0xF906, 32}, {0xFD02, 32}, + {0xFD02, 32}, {0xFF00, 32}, {0xFF00, 32}, {0x01FE, 64}, + {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, + {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, + {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, + {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, + {0x01FE, 64}, {0x817E, 64}, {0x817E, 64}, {0xC13E, 64}, + {0xC13E, 64}, {0xE11E, 64}, {0xE11E, 64}, {0xF10E, 64}, + {0xF10E, 64}, {0xF906, 64}, {0xF906, 64}, {0xFD02, 64}, + {0xFD02, 64}, {0xFF00, 64}, {0xFF00, 64}, {0x01FE, 128} +}; + +/* table of attenuation values for vertical scaling */ +u16 v_attenuation[] = { 2, 4, 8, 16, 32, 64, 128, 256, 0}; + +int calculate_v_scale_registers(struct saa7146* saa, u32 in_y, u32 out_y, u32* hps_v_scale, u32* hps_v_gain) +{ + u32 yacm = 0, ysci = 0, yacl = 0, ypo = 0, ype = 0; /* vertical scaling */ + u32 dcgy = 0, cya_cyb = 0; /* vertical scale & gain */ + + u32 v_atten = 0, i = 0; /* helper variables */ + + /* error, if vertical zooming */ + if ( in_y < out_y ) { + printk("saa7146: ==> calculate_v_scale_registers: we cannot do vertical zooming.\n"); + return -EINVAL; + } + + /* linear phase interpolation may be used if scaling is between 1 and 1/2 + or scaling is between 1/2 and 1/4 (if interlace is set; see below) */ + if( ((2*out_y) >= in_y) || (((4*out_y) >= in_y) && saa->interlace != 0)) { + + /* convention: if scaling is between 1/2 and 1/4 we only use + the even lines, the odd lines get discarded (see function move_to) + if interlace is set */ + if( saa->interlace != 0 && (out_y*4) >= in_y && (out_y*2) <= in_y) + out_y *= 2; + + yacm = 0; + yacl = 0; + cya_cyb = 0x00ff; + + /* calculate scaling increment */ + if ( in_y > out_y ) + ysci = ((1024 * in_y) / (out_y + 1)) - 1024; + else + ysci = 0; + + dcgy = 0; + + /* calculate ype and ypo */ + if (saa->interlace !=0) { + + /* Special case for interlaced input */ + + /* See Philips SAA7146A Product Spec (page 75): */ + /* "For interlaced input, ype and ypo is defiend as */ + /* YPeven= 3/2 x YPodd (line 1 = odd)" */ + /* */ + /* It looks like the spec is wrong! */ + /* The ad hoc values below works fine for a target */ + /* window height of 480 (vertical scale = 1/1) NTSC. */ + /* PLI: December 27, 2000. */ + ypo=64; + ype=0; + } else { + ype = ysci / 16; + ypo = ype + (ysci / 64); + } + } + else { + yacm = 1; + + /* calculate scaling increment */ + ysci = (((10 * 1024 * (in_y - out_y - 1)) / in_y) + 9) / 10; + + /* calculate ype and ypo */ + ypo = ype = ((ysci + 15) / 16); + + /* the sequence length interval (yacl) has to be set according + to the prescale value, e.g. [n .. 1/2) : 0 + [1/2 .. 1/3) : 1 + [1/3 .. 1/4) : 2 + ... */ + if ( ysci < 512) { + yacl = 0; + } + else { + yacl = ( ysci / (1024 - ysci) ); + } + + /* get filter coefficients for cya, cyb from table hps_v_coeff_tab */ + cya_cyb = hps_v_coeff_tab[TRUNC(yacl, 63)].hps_coeff; + + /* get best match in the table of attenuations for vertical scaling */ + v_atten = hps_v_coeff_tab[TRUNC(yacl, 63)].weight_sum; + + for (i = 0; v_attenuation[i] != 0; i++) { + if (v_attenuation[i] >= v_atten) + break; + } + + dcgy = i; + } + + /* ypo and ype swapped in spec ? */ + *hps_v_scale |= (yacm << 31) | (ysci << 21) | (yacl << 15) | (ypo << 8 ) | (ype << 1); + + *hps_v_gain &= ~(MASK_W0|MASK_B2); + *hps_v_gain |= (dcgy << 16) | (cya_cyb << 0); + + return 0; +} + +void calculate_hxo_hyo_and_sources(struct saa7146* saa, int port_sel, int sync_sel, u32* hps_h_scale, u32* hps_ctrl) +{ + u32 hyo = 0, hxo = 0; + + hyo = modes_constants[saa->mode].v_offset; + hxo = modes_constants[saa->mode].h_offset; + + *hps_h_scale &= ~(MASK_B0 | 0xf00); + *hps_ctrl &= ~(MASK_W0 | MASK_B2 | MASK_30 | MASK_31 | MASK_28); + + *hps_h_scale |= (hxo << 0); + *hps_ctrl |= (hyo << 12); + + *hps_ctrl |= ( port_sel == 0 ? 0x0 : MASK_30); + *hps_ctrl |= ( sync_sel == 0 ? 0x0 : MASK_28); +} + +void calculate_output_format_register(struct saa7146* saa, u16 palette, u32* clip_format) +{ + /* clear out the necessary bits */ + *clip_format &= 0x0000ffff; + /* set these bits new */ + *clip_format |= (( ((palette&0xf00)>>8) << 30) | ((palette&0x00f) << 24) | (((palette&0x0f0)>>4) << 16)); +} + +void calculate_bcs_ctrl_register(struct saa7146 *saa, u32 brightness, u32 contrast, u32 colour, u32 *bcs_ctrl) +{ + *bcs_ctrl = ((brightness << 24) | (contrast << 16) | (colour << 0)); +} + + +int calculate_video_dma1_grab(struct saa7146* saa, int frame, struct saa7146_video_dma* vdma1) +{ + int depth = 0; + + switch(saa->grab_format[frame]) { + case YUV422_COMPOSED: + case RGB15_COMPOSED: + case RGB16_COMPOSED: + depth = 2; + break; + case RGB24_COMPOSED: + depth = 3; + break; + default: + depth = 4; + break; + } + + vdma1->pitch = saa->grab_width[frame]*depth*2; + vdma1->base_even = 0; + vdma1->base_odd = vdma1->base_even + (vdma1->pitch/2); + vdma1->prot_addr = (saa->grab_width[frame]*saa->grab_height[frame]*depth)-1; + vdma1->num_line_byte = ((modes_constants[saa->mode].v_field<<16) + modes_constants[saa->mode].h_pixels); + vdma1->base_page = virt_to_bus(saa->page_table[frame]) | ME1; + + /* convention: if scaling is between 1/2 and 1/4 we only use + the even lines, the odd lines get discarded (see vertical scaling) */ + if( saa->interlace != 0 && saa->grab_height[frame]*4 >= modes_constants[saa->mode].v_calc && saa->grab_height[frame]*2 <= modes_constants[saa->mode].v_calc) { + vdma1->base_odd = vdma1->prot_addr; + vdma1->pitch /= 2; + } + + return 0; +} + +/* ---------------------------------------------*/ +/* position of overlay-window */ +/* ---------------------------------------------*/ + +/* calculate the new memory offsets for a desired position */ +int move_to(struct saa7146* saa, int w_x, int w_y, int w_height, int b_width, int b_depth, int b_bpl, u32 base, int td_flip) +{ + struct saa7146_video_dma vdma1; + + if( w_y < 0 || w_height <= 0 || b_depth <= 0 || b_bpl <= 0 || base == 0 ) { + printk("saa7146: ==> calculate_video_dma1_overlay: illegal values: y: %d h: %d d: %d b: %d base: %d\n",w_y ,w_height,b_depth,b_bpl,base); + return -EINVAL; + } + + /* calculate memory offsets for picture, look if we shall top-down-flip */ + vdma1.pitch = 2*b_bpl; + if ( 0 == td_flip ) { + vdma1.prot_addr = (u32)base + ((w_height+w_y+1)*b_width*(b_depth/4)); + vdma1.base_even = (u32)base + (w_y * (vdma1.pitch/2)) + (w_x * (b_depth / 8)); + vdma1.base_odd = vdma1.base_even + (vdma1.pitch / 2); + } + else { + vdma1.prot_addr = (u32)base + (w_y * (vdma1.pitch/2)); + vdma1.base_even = (u32)base + ((w_y+w_height) * (vdma1.pitch/2)) + (w_x * (b_depth / 8)); + vdma1.base_odd = vdma1.base_even + (vdma1.pitch / 2); + vdma1.pitch *= -1; + } + + /* convention: if scaling is between 1/2 and 1/4 we only use + the even lines, the odd lines get discarded (see vertical scaling) */ + if( saa->interlace != 0 && w_height*4 >= modes_constants[saa->mode].v_calc && w_height*2 <= modes_constants[saa->mode].v_calc) { + vdma1.base_odd = vdma1.prot_addr; + vdma1.pitch /= 2; + } + + vdma1.base_page = 0; + vdma1.num_line_byte = (modes_constants[saa->mode].v_field<<16)+modes_constants[saa->mode].h_pixels; + + saa7146_write(saa->mem, BASE_EVEN1, vdma1.base_even); + saa7146_write(saa->mem, BASE_ODD1, vdma1.base_odd); + saa7146_write(saa->mem, PROT_ADDR1, vdma1.prot_addr); + saa7146_write(saa->mem, BASE_PAGE1, vdma1.base_page); + saa7146_write(saa->mem, PITCH1, vdma1.pitch); + saa7146_write(saa->mem, NUM_LINE_BYTE1, vdma1.num_line_byte); + + /* update the video dma 1 registers */ + saa7146_write(saa->mem, MC2, (MASK_02 | MASK_18)); + + return 0; + +} + +/* ---------------------------------------------*/ +/* size of window (overlay) */ +/* ---------------------------------------------*/ + +int set_window(struct saa7146* saa, int width, int height, int flip_lr, int port_sel, int sync_sel) +{ + u32 hps_v_scale = 0, hps_v_gain = 0, hps_ctrl = 0, hps_h_prescale = 0, hps_h_scale = 0; + + /* set vertical scale according to selected mode: 0 = PAL, 1 = NTSC */ + hps_v_scale = 0; /* all bits get set by the function-call */ + hps_v_gain = 0; /* fixme: saa7146_read(saa->mem, HPS_V_GAIN);*/ + calculate_v_scale_registers(saa, modes_constants[saa->mode].v_calc, height, &hps_v_scale, &hps_v_gain); + + /* set horizontal scale according to selected mode: 0 = PAL, 1 = NTSC */ + hps_ctrl = 0; + hps_h_prescale = 0; /* all bits get set in the function */ + hps_h_scale = 0; + calculate_h_scale_registers(saa, modes_constants[saa->mode].h_calc, width, 0, &hps_ctrl, &hps_v_gain, &hps_h_prescale, &hps_h_scale); + + /* set hyo and hxo */ + calculate_hxo_hyo_and_sources(saa, port_sel, sync_sel, &hps_h_scale, &hps_ctrl); + + /* write out new register contents */ + saa7146_write(saa->mem, HPS_V_SCALE, hps_v_scale); + saa7146_write(saa->mem, HPS_V_GAIN, hps_v_gain); + saa7146_write(saa->mem, HPS_CTRL, hps_ctrl); + saa7146_write(saa->mem, HPS_H_PRESCALE,hps_h_prescale); + saa7146_write(saa->mem, HPS_H_SCALE, hps_h_scale); + + /* upload shadow-ram registers */ + saa7146_write( saa->mem, MC2, (MASK_05 | MASK_06 | MASK_21 | MASK_22) ); + +/* + printk("w:%d,h:%d\n",width,height); +*/ + return 0; + +} + +void set_output_format(struct saa7146* saa, u16 palette) +{ + u32 clip_format = saa7146_read(saa->mem, CLIP_FORMAT_CTRL); + + dprintk("saa7146: ==> set_output_format: pal:0x%03x\n",palette); + + /* call helper function */ + calculate_output_format_register(saa,palette,&clip_format); + dprintk("saa7146: ==> set_output_format: 0x%08x\n",clip_format); + + /* update the hps registers */ + saa7146_write(saa->mem, CLIP_FORMAT_CTRL, clip_format); + saa7146_write(saa->mem, MC2, (MASK_05 | MASK_21)); +} + +void set_picture_prop(struct saa7146 *saa, u32 brightness, u32 contrast, u32 colour) +{ + u32 bcs_ctrl = 0; + + calculate_bcs_ctrl_register(saa, brightness, contrast, colour, &bcs_ctrl); + saa7146_write(saa->mem, BCS_CTRL, bcs_ctrl); + + /* update the bcs register */ + saa7146_write(saa->mem, MC2, (MASK_06 | MASK_22)); +} + +/* ---------------------------------------------*/ +/* overlay enable/disable */ +/* ---------------------------------------------*/ + +/* enable(1) / disable(0) video */ +void video_setmode(struct saa7146* saa, int v) +{ + hprintk("saa7146: ==> video_setmode; m:%d\n",v); + + /* disable ? */ + if(v==0) { + /* disable video dma1 */ + saa7146_write(saa->mem, MC1, MASK_22); + } else {/* or enable ? */ + /* fixme: enable video */ + saa7146_write(saa->mem, MC1, (MASK_06 | MASK_22)); + } +} + +/* ----------------------------------------------------- + common grabbing-functions. if you have some simple + saa7146-based frame-grabber you can most likely call + these. they do all the revision-dependend stuff and + do rps/irq-based grabbing for you. + -----------------------------------------------------*/ + +/* this function initializes the rps for the next grab for any "old" + saa7146s (= revision 0). it assumes that the rps is *not* running + when it gets called. */ +int init_rps0_rev0(struct saa7146* saa, int frame, int irq_call) +{ + struct saa7146_video_dma vdma1; + u32 hps_v_scale = 0, hps_v_gain = 0, hps_ctrl = 0, hps_h_prescale = 0, hps_h_scale = 0; + u32 clip_format = 0; /* this can be 0, since we don't do clipping */ + u32 bcs_ctrl = 0; + + int count = 0; + +/* these static values are used to remember the last "programming" of the rps. + if the height, width and format of the grab has not changed (which is very likely + when some streaming capture is done) the reprogramming overhead can be minimized */ +static int last_height = 0; +static int last_width = 0; +static int last_format = 0; +static int last_port = 0; +static int last_frame = -1; + + /* write the address of the rps-program */ + saa7146_write(saa->mem, RPS_ADDR0, virt_to_bus(&saa->rps0[ 0])); + + /* let's check if we can re-use something of the last grabbing process */ + if ( saa->grab_height[frame] != last_height + || saa->grab_width[frame] != last_width + || saa->grab_port[frame] != last_port + || saa->grab_format[frame] != last_format ) { + + /* nope, we have to start from the beginning */ + calculate_video_dma1_grab(saa, frame, &vdma1); + calculate_v_scale_registers(saa, modes_constants[saa->mode].v_calc, saa->grab_height[frame], &hps_v_scale, &hps_v_gain); + calculate_h_scale_registers(saa, modes_constants[saa->mode].h_calc, saa->grab_width[frame], 0, &hps_ctrl, &hps_v_gain, &hps_h_prescale, &hps_h_scale); + calculate_hxo_hyo_and_sources(saa, saa->grab_port[frame], saa->grab_port[frame], &hps_h_scale, &hps_ctrl); + calculate_output_format_register(saa,saa->grab_format[frame],&clip_format); + calculate_bcs_ctrl_register(saa, 0x80, 0x40, 0x40, &bcs_ctrl); + + count = 0; + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4)); /* turn off video-dma1 and dma2 (clipping)*/ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22 | MASK_05 | MASK_21); /* => mask */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_22 | MASK_21); /* => values */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[frame] == 0 ? MASK_12 : MASK_14)); /* wait for o_fid_a/b */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[frame] == 0 ? MASK_11 : MASK_13)); /* wait for e_fid_a/b */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (6 << 8) | HPS_CTRL/4); /* upload hps-registers for next grab */ + saa->rps0[ count++ ] = cpu_to_le32(hps_ctrl); + saa->rps0[ count++ ] = cpu_to_le32(hps_v_scale); + saa->rps0[ count++ ] = cpu_to_le32(hps_v_gain); + saa->rps0[ count++ ] = cpu_to_le32(hps_h_prescale); + saa->rps0[ count++ ] = cpu_to_le32(hps_h_scale); + saa->rps0[ count++ ] = cpu_to_le32(bcs_ctrl); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (1 << 8) | CLIP_FORMAT_CTRL/4);/* upload hps-registers for next grab */ + saa->rps0[ count++ ] = cpu_to_le32(clip_format); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_UPLOAD | MASK_05 | MASK_06); /* upload hps1/2 */ + + /* upload video-dma1 registers for next grab */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (6 << 8) | BASE_ODD1/4); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_odd); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_even); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.prot_addr); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.pitch); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_page); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.num_line_byte); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_UPLOAD | MASK_02); /* upload video-dma1 */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4)); /* turn on video-dma1 */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22); /* => mask */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22); /* => values */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (1 << 8) | (MC2/4)); /* Write MC2 */ + saa->rps0[ count++ ] = cpu_to_le32((1 << (27+frame)) | (1 << (11+frame))); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[frame] == 0 ? MASK_12 : MASK_14)); /* wait for o_fid_a/b */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[frame] == 0 ? MASK_11 : MASK_13)); /* wait for e_fid_a/b */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4)); /* turn off video-dma1 */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22); /* => mask */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_22); /* => values */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_INTERRUPT); /* generate interrupt */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_STOP); /* stop processing */ + } else { + + /* the height, width, ... have not changed. check if the user wants to grab to + another *buffer* */ + if( frame != last_frame ) { + + /* ok, we want to grab to another buffer, but with the same programming. + it is sufficient to adjust the video_dma1-registers and the rps-signal stuff. */ + saa->rps0[ 20 ] = cpu_to_le32(virt_to_bus(saa->page_table[frame]) | ME1); + saa->rps0[ 27 ] = cpu_to_le32((1 << (27+frame)) | (1 << (11+frame))); + + } + } + + /* if we are called from within the irq-handler, the hps is at the beginning of a + new frame. the rps does not need to wait the new frame, and so we tweak the + starting address a little bit and so we can directly start grabbing again. + note: for large video-sizes and slow computers this can cause jaggy pictures + because the whole process is not in sync. perhaps one should be able to + disable this. (please remember that this whole stuff only belongs to + "old" saa7146s (= revision 0), newer saa7146s don´t have any hardware-bugs + and capture works fine. (see below) */ + if( 1 == irq_call ) { + saa7146_write(saa->mem, RPS_ADDR0, virt_to_bus(&saa->rps0[15])); + } + + /* turn on rps */ + saa7146_write(saa->mem, MC1, (MASK_12 | MASK_28)); + + /* store the values for the last grab */ + last_height = saa->grab_height[frame]; + last_width = saa->grab_width[frame]; + last_format = saa->grab_format[frame]; + last_port = saa->grab_port[frame]; + last_frame = frame; + + return 0; +} + +int init_rps0_rev1(struct saa7146* saa, int frame) { + +static int old_width[SAA7146_MAX_BUF]; /* pixel width of grabs */ +static int old_height[SAA7146_MAX_BUF]; /* pixel height of grabs */ +static int old_format[SAA7146_MAX_BUF]; /* video format of grabs */ +static int old_port[SAA7146_MAX_BUF]; /* video port for grab */ + +static int buf_stat[SAA7146_MAX_BUF]; + + struct saa7146_video_dma vdma1; + u32 hps_v_scale = 0, hps_v_gain = 0, hps_ctrl = 0, hps_h_prescale = 0, hps_h_scale = 0; + u32 clip_format = 0; /* this can be 0, since we don't do clipping */ + u32 bcs_ctrl = 0; + + int i = 0, count = 0; + + /* check if something has changed since the last grab for this buffer */ + if ( saa->grab_height[frame] == old_height[frame] + && saa->grab_width[frame] == old_width[frame] + && saa->grab_port[frame] == old_port[frame] + && saa->grab_format[frame] == old_format[frame] ) { + + /* nope, nothing to be done here */ + return 0; + } + + /* re-program the rps0 completely */ + + /* indicate that the user has requested re-programming of the 'frame'-buffer */ + buf_stat[frame] = 1; + + /* turn off rps */ + saa7146_write(saa->mem, MC1, MASK_28); + + + /* write beginning of rps-program */ + count = 0; + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | MASK_12); /* wait for o_fid_a */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | MASK_11); /* wait for e_fid_a */ + for(i = 0; i < saa->buffers; i++) { + saa->rps0[ count++ ] = cpu_to_le32(CMD_JUMP | (1 << (21+i))); /* check signal x, jump if set */ + saa->rps0[ count++ ] = cpu_to_le32(virt_to_bus(&saa->rps0[40*(i+1)])); + } + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | MASK_12); /* wait for o_fid_a */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | MASK_11); /* wait for e_fid_a */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_JUMP); /* jump to the beginning */ + saa->rps0[ count++ ] = cpu_to_le32(virt_to_bus(&saa->rps0[2])); + + for(i = 0; i < saa->buffers; i++) { + + /* we only re-program the i-th buffer if the user had set some values for it earlier. + otherwise the calculation-functions may fail. */ + if( buf_stat[i] == 0) + continue; + + count = 40*(i+1); + + calculate_video_dma1_grab(saa, i, &vdma1); + calculate_v_scale_registers(saa, modes_constants[saa->mode].v_calc, saa->grab_height[i], &hps_v_scale, &hps_v_gain); + calculate_h_scale_registers(saa, modes_constants[saa->mode].h_calc, saa->grab_width[i], 0, &hps_ctrl, &hps_v_gain, &hps_h_prescale, &hps_h_scale); + calculate_hxo_hyo_and_sources(saa, saa->grab_port[i], saa->grab_port[i], &hps_h_scale, &hps_ctrl); + calculate_output_format_register(saa,saa->grab_format[i],&clip_format); + calculate_bcs_ctrl_register(saa, 0x80, 0x40, 0x40, &bcs_ctrl); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (6 << 8) | HPS_CTRL/4); /* upload hps-registers for next grab */ + saa->rps0[ count++ ] = cpu_to_le32(hps_ctrl); + saa->rps0[ count++ ] = cpu_to_le32(hps_v_scale); + saa->rps0[ count++ ] = cpu_to_le32(hps_v_gain); + saa->rps0[ count++ ] = cpu_to_le32(hps_h_prescale); + saa->rps0[ count++ ] = cpu_to_le32(hps_h_scale); + saa->rps0[ count++ ] = cpu_to_le32(bcs_ctrl); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (1 << 8) | CLIP_FORMAT_CTRL/4);/* upload hps-registers for next grab */ + saa->rps0[ count++ ] = cpu_to_le32(clip_format); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_UPLOAD | MASK_05 | MASK_06); /* upload hps1/2 */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (6 << 8) | BASE_ODD1/4); /* upload video-dma1 registers for next grab */ + saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_odd); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_even); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.prot_addr); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.pitch); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_page); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.num_line_byte); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_UPLOAD | MASK_02); /* upload video-dma1 */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4)); /* turn on video-dma1 */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22); /* => mask */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22); /* => values */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[i] == 0 ? MASK_12 : MASK_14)); /* wait for o_fid_a/b */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[i] == 0 ? MASK_11 : MASK_13)); /* wait for e_fid_a/b */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4)); /* turn off video-dma1 and dma2 (clipping)*/ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22 | MASK_05 | MASK_21); /* => mask */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_22 | MASK_21); /* => values */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (1 << 8) | (MC2/4)); /* Write MC2 */ + saa->rps0[ count++ ] = cpu_to_le32((1 << (27+i))); + saa->rps0[ count++ ] = cpu_to_le32(CMD_INTERRUPT); /* generate interrupt */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_JUMP); /* jump to the beginning */ + saa->rps0[ count++ ] = cpu_to_le32(virt_to_bus(&saa->rps0[2])); + + old_height[frame] = saa->grab_height[frame]; + old_width[frame] = saa->grab_width[frame]; + old_port[frame] = saa->grab_port[frame]; + old_format[frame] = saa->grab_format[frame]; + } + + /* write the address of the rps-program */ + saa7146_write(saa->mem, RPS_ADDR0, virt_to_bus(&saa->rps0[ 0])); + /* turn on rps again */ + saa7146_write(saa->mem, MC1, (MASK_12 | MASK_28)); + + return 0; +} + +/* this funtion is called whenever a new grab is requested. if possible (that + means: if the rps is not running) it re-programs the rps, otherwise it relys on + the irq-handler to do that */ +int set_up_grabbing(struct saa7146* saa, int frame) +{ + u32 mc1 = 0; + + if( 0 == saa->revision ) { + + /* check if the rps is currently in use */ + mc1 = saa7146_read(saa->mem, MC1); + + /* the rps is not running ... */ + if( 0 == ( mc1 & MASK_12) ) { + + /* we can completly re-program the rps now */ + dprintk("saa7146_v4l.o: ==> set_up_grabbing: start new rps.\n"); + init_rps0_rev0(saa,frame,0); + } else { + + /* the rps is running. in this case, the irq-handler is responsible for + re-programming the rps and nothing can be done right now */ + dprintk("saa7146_v4l.o: ==> set_up_grabbing: no new rps started.\n"); + } + } else { + /* check if something has changed, reprogram if necessary */ + init_rps0_rev1(saa,frame); + /* set rps-signal-bit to start grabbing */ + saa7146_write(saa->mem, MC2, (1 << (27+frame)) | (1 << (11+frame))); + } + + return 0; +} + + +void saa7146_std_grab_irq_callback_rps0(struct saa7146* saa, u32 isr, void* data) +{ + u32 mc2 = 0; + int i = 0; + + hprintk("saa7146_v4l.o: ==> saa7146_v4l_irq_callback_rps0\n"); + + /* check for revision: old revision */ + if( 0 == saa->revision ) { + + /* look what buffer has been grabbed, set the ´done´-flag and clear the signal */ + mc2 = saa7146_read(saa->mem, MC2); + for( i = 0; i < saa->buffers; i++ ) { + + if ((0 != (mc2 & (1 << (11+i)))) && (GBUFFER_GRABBING == saa->frame_stat[i])) { + saa->frame_stat[i] = GBUFFER_DONE; + saa7146_write(saa->mem, MC2, (1<<(27+i))); + } + } + + /* look if there is another buffer we can grab to */ + for( i = 0; i < saa->buffers; i++ ) { + if ( GBUFFER_GRABBING == saa->frame_stat[i] ) + break; + } + + /* yes, then set up the rps again */ + if( saa->buffers != i) { + init_rps0_rev0(saa,i,1); + } + } else { + /* new revisions */ + + /* look what buffer has been grabbed, set the ´done´-flag */ + mc2 = saa7146_read(saa->mem, MC2); + for( i = 0; i < saa->buffers; i++ ) { + + if ((0 == (mc2 & (1 << (11+i)))) && (GBUFFER_GRABBING == saa->frame_stat[i])) { + saa->frame_stat[i] = GBUFFER_DONE; + } + } + + } + /* notify any pending process */ + wake_up_interruptible(&saa->rps0_wq); + return; +} + +/* ---------------------------------------------*/ +/* mask-clipping */ +/* ---------------------------------------------*/ +int calculate_clipping_registers_mask(struct saa7146* saa, u32 width, u32 height, struct saa7146_video_dma* vdma2, u32* clip_format, u32* arbtr_ctrl) +{ + u32 clip_addr = 0, clip_pitch = 0; + + dprintk("saa7146: ==> calculate_clipping_registers_mask\n"); + + /* adjust arbitration control register */ + *arbtr_ctrl &= 0xffff00ff; + *arbtr_ctrl |= 0x00001000; + + clip_addr = virt_to_bus(saa->clipping); + clip_pitch = ((width+31)/32)*4; + + vdma2->base_even = clip_addr; + vdma2->base_page = 0x04; /* enable read - operation */ + vdma2->prot_addr = clip_addr + (clip_pitch*height); + + /* convention: if scaling is between 1/2 and 1/4 we only use + the even lines, the odd lines get discarded (see vertical scaling) */ + if( saa->interlace != 0 && height*4 >= modes_constants[saa->mode].v_calc && height*2 <= modes_constants[saa->mode].v_calc) { + vdma2->base_odd = vdma2->prot_addr; + vdma2->pitch = clip_pitch; + vdma2->num_line_byte = (((height)-1) << 16) | (clip_pitch-1); + } else { + vdma2->base_odd = clip_addr+clip_pitch; + vdma2->pitch = clip_pitch*2; + vdma2->num_line_byte = (((height/2)-1) << 16) | (clip_pitch-1); + } + + *clip_format &= 0xfffffff7; + + return 0; +} + +/* helper functions for emulate rect-clipping via mask-clipping. + note: these are extremely inefficient, but for clipping with less than 16 + windows rect-clipping should be done anyway... +*/ + +/* clear one pixel of the clipping memory at position (x,y) */ +void set_pixel(s32 x, s32 y, s32 window_width, u32* mem) { + + u32 mem_per_row = 0; + u32 adr = 0; + u32 shift = 0; + u32 bit = 0; + + mem_per_row = (window_width + 31 )/ 32 ; + adr = y * mem_per_row + (x / 32); + shift = 31 - (x % 32); + bit = (1 << shift); + + mem[adr] |= bit; +} + +/* clear a box out of the clipping memory, beginning at (x,y) with "width" and "height" */ +void set_box(s32 x, s32 y, s32 width, s32 height, s32 window_width, s32 window_height, u32* mem) +{ + s32 ty = 0; + s32 tx = 0; + + /* the video_clip-struct may contain negative values to indicate that a window + doesn't lay completly over the video window. Thus, we correct the values */ + + if( width < 0) { + x += width; width = -width; + } + if( height < 0) { + y += height; height = -height; + } + + if( x < 0) { + width += x; x = 0; + } + if( y < 0) { + height += y; y = 0; + } + + if( width <= 0 || height <= 0) { + printk("saa7146: ==> set_box: sanity error!\n"); + return; + } + + if(x + width > window_width) + width -= (x + width) - window_width; + if(y + height > window_height) + height -= (y + height) - window_height; + + /* Now, set a '1' in the memory, where no video picture should appear */ + for(ty = y; ty < y+height; ty++) { + for(tx = x; tx < x+width; tx++) { + set_pixel(tx, ty, window_width, mem); + } + } +} + +int emulate_rect_clipping(struct saa7146 *saa, u16 clipcount, int x[], int y[], int w[], int h[], u32 w_width, u32 w_height) +{ + int i = 0; + + /* clear out clipping mem */ + memset(saa->clipping, 0x0, CLIPPING_MEM_SIZE*sizeof(u32)); + + /* go through list of clipping-windows, clear out rectangular-regions in the clipping memory */ + for(i = 0; i < clipcount; i++) { + set_box(x[i], y[i], w[i], h[i], w_width, w_height, saa->clipping); + } + + return 0; +} + +/* ---------------------------------------------*/ +/* rectangle-clipping */ +/* ---------------------------------------------*/ + +#define MIN(x,y) ( ((x) < (y)) ? (x) : (y) ) +#define MAX(x,y) ( ((x) > (y)) ? (x) : (y) ) + +/* simple double-sort algorithm with duplicate elimination */ +int sort_and_eliminate(u32* values, int* count) +{ + int low = 0, high = 0, top = 0, temp = 0; + int cur = 0, next = 0; + + /* sanity checks */ + if( (0 > *count) || (NULL == values) ) { + printk("saa7146: ==> sort_and_eliminate: internal error #1\n"); + return -EINVAL; + } + + /* bubble sort the first ´count´ items of the array ´values´ */ + for( top = *count; top > 0; top--) { + for( low = 0, high = 1; high < top; low++, high++) { + if( values[low] > values[high] ) { + temp = values[low]; + values[low] = values[high]; + values[high] = temp; + } + } + } + + /* remove duplicate items */ + for( cur = 0, next = 1; next < *count; next++) { + if( values[cur] != values[next]) + values[++cur] = values[next]; + } + + *count = cur + 1; + + return 0; +} + +int calculate_clipping_registers_rect(struct saa7146 *saa, int clipcount, int x[], int y[], int w[], int h[], u32 width, u32 height, struct saa7146_video_dma* vdma2, u32* clip_format, u32* arbtr_ctrl) +{ + u32 line_list[32]; + u32 pixel_list[32]; + u32 numdwords = 0; + + int i = 0, j = 0; + int l = 0, r = 0, t = 0, b = 0; + int cnt_line = 0, cnt_pixel = 0; + + dprintk("saa7146: ==> calculate_clipping_registers_clip\n"); + + /* clear out memory */ + memset(&line_list[0], 0x00, sizeof(u32)*32); + memset(&pixel_list[0], 0x00, sizeof(u32)*32); + memset(saa->clipping, 0x00, sizeof(u32)*CLIPPING_MEM_SIZE); + + /* fill the line and pixel-lists */ + for(i = 0; i < clipcount; i++) { + + /* calculate values for l(eft), r(ight), t(op), b(ottom) */ + l = x[i]; + r = x[i]+w[i]; + t = y[i]; + b = y[i]+h[i]; + + /* insert left/right coordinates */ + pixel_list[ 2*i ] = MIN(l, width); + pixel_list[(2*i)+1] = MIN(r, width); + /* insert top/bottom coordinates */ + line_list[ 2*i ] = MIN(t, height); + line_list[(2*i)+1] = MIN(b, height); + } + + /* sort and eliminate lists */ + cnt_line = cnt_pixel = 2*clipcount; + sort_and_eliminate( &pixel_list[0], &cnt_pixel ); + sort_and_eliminate( &line_list[0], &cnt_line ); + + /* calculate the number of used u32s */ + numdwords = MAX( (cnt_line+1), (cnt_pixel+1))*2; + numdwords = MAX(4, numdwords); + numdwords = MIN(64, numdwords); + + /* fill up cliptable */ + for(i = 0; i < cnt_pixel; i++) { + saa->clipping[2*i] |= (pixel_list[i] << 16); + } + for(i = 0; i < cnt_line; i++) { + saa->clipping[(2*i)+1] |= (line_list[i] << 16); + } + + /* fill up cliptable with the display infos */ + for(j = 0; j < clipcount; j++) { + + for(i = 0; i < cnt_pixel; i++) { + + if( x[j] < 0) + x[j] = 0; + + if( pixel_list[i] < (x[j] + w[j])) { + + if ( pixel_list[i] >= x[j] ) { + saa->clipping[2*i] |= (1 << j); + } + } + } + for(i = 0; i < cnt_line; i++) { + + if( y[j] < 0) + y[j] = 0; + + if( line_list[i] < (y[j] + h[j]) ) { + + if( line_list[i] >= y[j] ) { + saa->clipping[(2*i)+1] |= (1 << j); + } + } + } + } + + /* adjust arbitration control register */ + *arbtr_ctrl &= 0xffff00ff; + *arbtr_ctrl |= 0x00001c00; + + vdma2->base_even = virt_to_bus(saa->clipping); + vdma2->base_odd = virt_to_bus(saa->clipping); + vdma2->prot_addr = virt_to_bus(saa->clipping)+((sizeof(u32))*(numdwords)); + vdma2->base_page = 0x04; + vdma2->pitch = 0x00; + vdma2->num_line_byte = (0 << 16 | (sizeof(u32))*(numdwords-1) ); + + /* set clipping-mode. please note again, that for sizes below 1/2, we only use the + even-field. because of this, we have to specify ´recinterl´ correctly (specs, p. 97)*/ + *clip_format &= 0xfffffff7; + + if( saa->interlace != 0 && height*4 >= modes_constants[saa->mode].v_calc && height*2 <= modes_constants[saa->mode].v_calc) { + *clip_format |= 0x00000000; + } else { + *clip_format |= 0x00000008; + } + return 0; +} + + +/* ---------------------------------------------*/ +/* main function for clipping */ +/* ---------------------------------------------*/ +/* arguments: + type = see ´saa7146.h´ + width = width of the video-window + height = height of the video-window + *mask = pointer to mask memory (only needed for mask-clipping) + *clips = pointer to clip-window-list (only needed for rect-clipping) + clipcount = # of clip-windows (only needed for rect-clipping) +*/ +int clip_windows(struct saa7146* saa, u32 type, u32 width, u32 height, u32* mask, u16 clipcount, int x[], int y[], int w[], int h[]) +{ + struct saa7146_video_dma vdma2; + + u32 clip_format = saa7146_read(saa->mem, CLIP_FORMAT_CTRL); + u32 arbtr_ctrl = saa7146_read(saa->mem, PCI_BT_V1); + + hprintk("saa7146: ==> clip_windows\n"); + + /* some sanity checks first */ + if ( width <= 0 || height <= 0 ) { + printk("saa7146: ==> clip_windows: sanity error #1!\n"); + return -EINVAL; + } + + /* check if anything to do here, disable clipping if == 0 */ + if( clipcount == 0 ) { + + /* mask out relevant bits (=lower word)*/ + clip_format &= MASK_W1; + + /* upload clipping-registers*/ + saa7146_write(saa->mem, CLIP_FORMAT_CTRL,clip_format); + saa7146_write(saa->mem, MC2, (MASK_05 | MASK_21)); + + /* disable video dma2 */ + saa7146_write(saa->mem, MC1, (MASK_21)); + + return 0; + } + + switch(type) { + + case SAA7146_CLIPPING_MASK_INVERTED: + case SAA7146_CLIPPING_MASK: + { + printk("mask\n"); + /* sanity check */ + if( NULL == mask ) { + printk("saa7146: ==> clip_windows: sanity error #1!\n"); + return -EINVAL; + } + + /* copy the clipping mask to structure */ + memmove(saa->clipping, mask, CLIPPING_MEM_SIZE*sizeof(u32)); + /* set clipping registers */ + calculate_clipping_registers_mask(saa,width,height,&vdma2,&clip_format,&arbtr_ctrl); + + break; + } + + case SAA7146_CLIPPING_RECT_INVERTED: + case SAA7146_CLIPPING_RECT: + { + /* see if we have anything to do */ + if ( 0 == clipcount ) { + return 0; + } + + /* sanity check */ + if( NULL == x || NULL == y || NULL == w || NULL == h ) { + printk("saa7146: ==> clip_windows: sanity error #2!\n"); + return -EINVAL; + } + + /* rectangle clipping can only handle 16 overlay windows; if we + have more, we have do emulate the whole thing with mask-clipping */ + if (1) { //clipcount > > 16 ) { + //printk("emulate\n"); + emulate_rect_clipping(saa, clipcount, x,y,w,h, width, height); + calculate_clipping_registers_mask(saa,width,height,&vdma2,&clip_format,&arbtr_ctrl); + if( SAA7146_CLIPPING_RECT == type ) + type = SAA7146_CLIPPING_MASK; + else + type = SAA7146_CLIPPING_MASK_INVERTED; + + } + else { + calculate_clipping_registers_rect(saa,clipcount,x,y,w,h,width,height,&vdma2,&clip_format,&arbtr_ctrl); + } + + break; + } + + default: + { + printk("saa7146: ==> clip_windows: internal error #1!\n"); + return -EINVAL; + } + + } + + /* set clipping format */ + clip_format &= 0xffff0008; + clip_format |= (type << 4); + + saa7146_write(saa->mem, BASE_EVEN2, vdma2.base_even); + saa7146_write(saa->mem, BASE_ODD2, vdma2.base_odd); + saa7146_write(saa->mem, PROT_ADDR2, vdma2.prot_addr); + saa7146_write(saa->mem, BASE_PAGE2, vdma2.base_page); + saa7146_write(saa->mem, PITCH2, vdma2.pitch); + saa7146_write(saa->mem, NUM_LINE_BYTE2, vdma2.num_line_byte); + + saa7146_write(saa->mem, CLIP_FORMAT_CTRL,clip_format); + saa7146_write(saa->mem, PCI_BT_V1, arbtr_ctrl); + + /* upload clip_control-register, clipping-registers, enable video dma2 */ + saa7146_write(saa->mem, MC2, (MASK_05 | MASK_21 | MASK_03 | MASK_19)); + saa7146_write(saa->mem, MC1, (MASK_05 | MASK_21)); +/* + printk("ARBTR_CTRL: 0x%08x\n",saa7146_read(saa->mem, PCI_BT_V1)); + printk("CLIP_FORMAT: 0x%08x\n",saa7146_read(saa->mem, CLIP_FORMAT_CTRL)); + printk("BASE_ODD1: 0x%08x\n",saa7146_read(saa->mem, BASE_ODD1)); + printk("BASE_EVEN1: 0x%08x\n",saa7146_read(saa->mem, BASE_EVEN1)); + printk("PROT_ADDR1: 0x%08x\n",saa7146_read(saa->mem, PROT_ADDR1)); + printk("PITCH1: 0x%08x\n",saa7146_read(saa->mem, PITCH1)); + printk("BASE_PAGE1: 0x%08x\n",saa7146_read(saa->mem, BASE_PAGE1)); + printk("NUM_LINE_BYTE1: 0x%08x\n",saa7146_read(saa->mem, NUM_LINE_BYTE1)); + printk("BASE_ODD2: 0x%08x\n",saa7146_read(saa->mem, BASE_ODD2)); + printk("BASE_EVEN2: 0x%08x\n",saa7146_read(saa->mem, BASE_EVEN2)); + printk("PROT_ADDR2: 0x%08x\n",saa7146_read(saa->mem, PROT_ADDR2)); + printk("PITCH2: 0x%08x\n",saa7146_read(saa->mem, PITCH2)); + printk("BASE_PAGE2: 0x%08x\n",saa7146_read(saa->mem, BASE_PAGE2)); + printk("NUM_LINE_BYTE2: 0x%08x\n",saa7146_read(saa->mem, NUM_LINE_BYTE2)); +*/ + return 0; + +} +#endif + +#ifdef __COMPILE_SAA7146_I2C__ + +/* ---------------------------------------------*/ +/* i2c-helper functions */ +/* ---------------------------------------------*/ + +/* this functions gets the status from the saa7146 at address 'addr' + and returns it */ +u32 i2c_status_check(struct saa7146* saa) +{ + u32 iicsta = 0; + + iicsta = saa7146_read(saa->mem, I2C_STATUS ); + hprintk("saa7146: ==> i2c_status_check:0x%08x\n",iicsta); + + return iicsta; +} + +/* this function should be called after an i2c-command has been written. + if we are debugging, it checks, if the busy flags rises and falls correctly + and reports a timeout (-1) or the error-bits set like in described in the specs, + p.123, table 110 */ +int i2c_busy_rise_and_fall(struct saa7146* saa, int timeout) +{ + int i = 0; + u32 status = 0; + + hprintk("saa7146: ==> i2c_busy_rise_and_fall\n"); + + /* wait until busy-flag rises */ + for (i = 5; i > 0; i--) { + + hprintk("saa7146: i2c_busy_rise_and_fall; rise wait %d\n",i); + + status = i2c_status_check(saa); + + /* check busy flag */ + if ( 0 != (status & SAA7146_I2C_BUSY)) + break; + + /* see if anything can be done while we're waiting */ + cond_resched (); + mdelay(1); + } + + /* we don't check the i-value, since it does not matter + if we missed the rise of the busy flag or the fall or + whatever. we just have to wait some undefined time + after an i2c-command has been written out */ + + /* wait until busy-flag is inactive or error is reported */ + for (i = timeout; i > 0; i--) { + + hprintk("saa7146: i2c_busy_rise_and_fall; fall wait %d\n",i); + + status = i2c_status_check(saa); + + /* check busy flag */ + if ( 0 == (status & SAA7146_I2C_BUSY)) + break; + + /* check error flag */ + if ( 0 != (status & SAA7146_I2C_ERR)) + break; + + /* see if anything can be done while we're waiting */ + cond_resched (); + + mdelay(1); + } + + /* did a timeout occur ? */ + if ( 0 == i ) { + hprintk("saa7146: i2c_busy_rise_and_fall: timeout #2\n"); + return -1; + } + + /* report every error pending */ + switch( status & 0xfc ) { + + case SAA7146_I2C_SPERR: + hprintk("saa7146: i2c_busy_rise_and_fall: error due to invalid start/stop condition\n"); + break; + + case SAA7146_I2C_APERR: + hprintk("saa7146: i2c_busy_rise_and_fall: error in address phase\n"); + break; + + case SAA7146_I2C_DTERR: + hprintk("saa7146: i2c_busy_rise_and_fall: error in data transmission\n"); + break; + + case SAA7146_I2C_DRERR: + hprintk("saa7146: i2c_busy_rise_and_fall: error when receiving data\n"); + break; + + case SAA7146_I2C_AL: + hprintk("saa7146: i2c_busy_rise_and_fall: error because arbitration lost\n"); + break; + } + + return status; + +} + +/* this functions resets the saa7146 at address 'addr' + and returns 0 if everything was fine, otherwise -1 */ +int i2c_reset(struct saa7146* saa) +{ + u32 status = 0; + + hprintk("saa7146: ==> i2c_reset\n"); + + status = i2c_status_check(saa); + + /* clear data-byte for sure */ + saa7146_write(saa->mem, I2C_TRANSFER, 0x00); + + /* check if any operation is still in progress */ + if ( 0 != ( status & SAA7146_I2C_BUSY) ) { + + /* Yes, kill ongoing operation */ + hprintk("saa7146: i2c_reset: busy_state detected\n"); + + /* set ABORT-OPERATION-bit */ + saa7146_write(saa->mem, I2C_STATUS, ( SAA7146_I2C_BBR | MASK_07)); + saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16)); + mdelay( SAA7146_I2C_DELAY ); + + /* clear all error-bits pending; this is needed because p.123, note 1 */ + saa7146_write(saa->mem, I2C_STATUS, SAA7146_I2C_BBR ); + saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16)); + mdelay( SAA7146_I2C_DELAY ); + } + + /* check if any other error is still present */ + if ( SAA7146_I2C_BBR != (status = i2c_status_check(saa)) ) { + + /* yes, try to kick it */ + hprintk("saa7146: i2c_reset: error_state detected, status:0x%08x\n",status); + + /* clear all error-bits pending */ + saa7146_write(saa->mem, I2C_STATUS, SAA7146_I2C_BBR ); + saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16)); + mdelay( SAA7146_I2C_DELAY ); + /* the data sheet says it might be necessary to clear the status + twice after an abort */ + saa7146_write(saa->mem, I2C_STATUS, SAA7146_I2C_BBR ); + saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16)); + } + + /* if any error is still present, a fatal error has occured ... */ + if ( SAA7146_I2C_BBR != (status = i2c_status_check(saa)) ) { + hprintk("saa7146: i2c_reset: fatal error, status:0x%08x\n",status); + return -1; + } + + return 0; +} + +/* this functions writes out the data-bytes at 'data' to the saa7146 + at address 'addr' regarding the 'timeout' and 'retries' values; + it returns 0 if ok, -1 if the transfer failed, -2 if the transfer + failed badly (e.g. address error) */ +int i2c_write_out(struct saa7146* saa, u32* data, int timeout) +{ + int status = 0; + + hprintk("saa7146: ==> writeout: 0x%08x (before) (to:%d)\n",*data,timeout); + + /* write out i2c-command */ + saa7146_write(saa->mem, I2C_TRANSFER, *data); + saa7146_write(saa->mem, I2C_STATUS, SAA7146_I2C_BBR); + saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16)); + + /* after writing out an i2c-command we have to wait for a while; + because we do not know, how long we have to wait, we simply look + what the busy-flag is doing, before doing something else */ + + /* reason: while fiddling around with the i2c-routines, I noticed + that after writing out an i2c-command, one may not read out the + status immediately after that. you *must* wait some time, before + even the busy-flag gets set */ + + status = i2c_busy_rise_and_fall(saa,timeout); + + if ( -1 == status ) { + hprintk("saa7146: i2c_write_out; timeout\n"); + return -ETIMEDOUT; + } + + /* we only handle address-errors here */ + if ( 0 != (status & SAA7146_I2C_APERR)) { + hprintk("saa7146: i2c_write_out; error in address phase\n"); + return -EREMOTEIO; + } + + /* check for some other mysterious error; we don't handle this here */ + if ( 0 != ( status & 0xff)) { + hprintk("saa7146: i2c_write_out: some error has occured\n"); + return -EIO; + } + + /* read back data, just in case we were reading ... */ + *data = saa7146_read(saa->mem, I2C_TRANSFER); + + hprintk("saa7146: writeout: 0x%08x (after)\n",*data); + + return 0; +} + +int clean_up(struct i2c_msg m[], int num, u32 *op) +{ + u16 i, j; + u16 op_count = 0; + + /* loop through all messages */ + for(i = 0; i < num; i++) { + op_count++; + /* loop throgh all bytes of message i */ + for(j = 0; j < m[i].len; j++) { + /* write back all bytes that could have been read */ + m[i].buf[j] = (op[op_count/3] >> ((3-(op_count%3))*8)); + op_count++; + } + } + + return 0; +} + +int prepare(struct i2c_msg m[], int num, u32 *op) +{ + u16 h1, h2; + u16 i, j, addr; + u16 mem = 0, op_count = 0; + +//for (i=0; i<num; i++) { printk ("\n%02x (%s): ", m[i].addr, m[i].flags & I2C_M_RD ? "R" : "W"); for (j=0; j<m[i].len; j++) { m[i].buf[j] &= 0xff; printk (" %02x ", (u8) m[i].buf[j]); } } printk ("\n"); + /* determine size of needed memory */ + for(i = 0; i < num; i++) + mem += m[i].len + 1; + + /* we need one u32 for three bytes to be send plus + one byte to address the device */ + mem = 1 + ((mem-1) / 3); + + if ( mem > I2C_MEM_SIZE ) { + hprintk("saa7146: prepare: i2c-message to big\n"); + return -1; + } + + /* be careful: clear out the i2c-mem first */ + memset(op,0,sizeof(u32)*mem); + + for(i = 0; i < num; i++) { + /* insert the address of the i2c-slave. + * note: we get 7-bit-i2c-addresses, + * so we have to perform a translation + */ + addr = (m[i].addr << 1) | ((m[i].flags & I2C_M_RD) ? 1 : 0); + h1 = op_count/3; h2 = op_count%3; + op[h1] |= ((u8)addr << ((3-h2)*8)); + op[h1] |= (SAA7146_I2C_START << ((3-h2)*2)); + op_count++; + /* loop through all bytes of message i */ + for(j = 0; j < m[i].len; j++) { + /* insert the data bytes */ + h1 = op_count/3; h2 = op_count%3; + op[h1] |= ((u8)m[i].buf[j] << ((3-h2)*8)); + op[h1] |= (SAA7146_I2C_CONT << ((3-h2)*2)); + op_count++; + } + } + + /* have a look at the last byte inserted: + * if it was: ...CONT change it to ...STOP + */ + h1 = (op_count-1)/3; h2 = (op_count-1)%3; + if ( SAA7146_I2C_CONT == (0x3 & ((op[h1]) >> ((3-h2)*2))) ) { + op[h1] &= ~(0x2 << ((3-h2)*2)); + op[h1] |= (SAA7146_I2C_STOP << ((3-h2)*2)); + } + + return mem; +} +#endif + + +#ifdef __COMPILE_SAA7146_DEBI__ + +/* functions for accessing the debi-port. note: we currently don't support + * page-table-transfers. + */ + +#define MY_DEBI_TIMEOUT_MS 5 + +int debi_transfer(struct saa7146* saa, struct saa7146_debi_transfer* dt) +{ + u32 debi_config = 0, debi_command = 0, debi_page = 0, debi_ad = 0; + u32 timeout = MY_DEBI_TIMEOUT_MS; + + /* sanity checks */ + if(dt->direction > 1 || dt->timeout > 15 || dt->swap > 3 || dt->slave16 > 2 || dt->intel > 1 || dt->increment > 1 || dt->tien > 1 ) + return -EINVAL; + + debi_page = 0; + /* keep bits 31,30,28 clear */ + debi_config = (dt->timeout << 22) | (dt->swap << 20) | (dt->slave16 << 19) | (dt->increment << 18) | (dt->intel << 17) | (dt->tien << 16); + debi_command = (dt->num_bytes << 17) | (dt->direction << 16) | (dt->address << 0); + debi_ad = dt->mem; + + saa7146_write(saa->mem, DEBI_PAGE, debi_page); + saa7146_write(saa->mem, DEBI_CONFIG, debi_config); + saa7146_write(saa->mem, DEBI_COMMAND, debi_command); + saa7146_write(saa->mem, DEBI_AD, debi_ad); + + /* upload debi-registers */ + saa7146_write(saa->mem, MC2, (MASK_01|MASK_17)); + + /* wait for DEBI upload to complete */ + while (! (saa7146_read(saa->mem, MC2) & 0x2)); + + while( --timeout ) { + /* check, if DEBI still active */ + u32 psr = saa7146_read(saa->mem, PSR); + if (0 != (psr & SPCI_DEBI_S)) { + /* check, if error occured */ +/* if ( 0 != (saa7146_read(saa->mem, SSR) & (MASK_23|MASK_22))) { */ + if ( 0 != (saa7146_read(saa->mem, SSR) & (MASK_22))) { + /* clear error status and indicate error */ + saa7146_write(saa->mem, ISR, SPCI_DEBI_E); + return -1; + } + } + else { + /* Clear status bit */ + saa7146_write(saa->mem, ISR, SPCI_DEBI_S); + break; + } + /* I don´t know how we should actually wait for the debi to have finished. + we simply wait 1ms here and then check in a loop for max. MY_DEBI_TIMEOUT_MS */ + mdelay(1); + } + + /* check for timeout */ + if( 0 == timeout ) { + return -1; + } + + /* read back data if we did immediate read-transfer */ + if(dt->num_bytes <= 4 && dt->direction == 1) { + dt->mem = saa7146_read(saa->mem, DEBI_AD); + switch(dt->num_bytes) { + case 1: + dt->mem &= 0x000000ff; + break; + case 2: + dt->mem &= 0x0000ffff; + break; + case 3: + dt->mem &= 0x00ffffff; + break; + } + } + + return 0; +} +#endif + +#ifdef __COMPILE_SAA7146_STUFF__ +/* ---------------------------------------------*/ +/* helper-function: set gpio-pins */ +/* ---------------------------------------------*/ +void gpio_set(struct saa7146* saa, u8 pin, u8 data) +{ + u32 value = 0; + + /* sanity check */ + if(pin > 3) + return; + + /* read old register contents */ + value = saa7146_read(saa->mem, GPIO_CTRL ); + + value &= ~(0xff << (8*pin)); + value |= (data << (8*pin)); + + saa7146_write(saa->mem, GPIO_CTRL, value); +} + +void select_input(struct saa7146* saa, int p) +{ + u32 hps_ctrl = 0; + + /* sanity check */ + if( p < 0 || p > 1 ) + return; + + /* read old state */ + hps_ctrl = saa7146_read(saa->mem, HPS_CTRL); + + /* mask out relevant bits */ + hps_ctrl &= ~( MASK_31 | MASK_30 | MASK_28 ); + + /* set bits for input b */ + if( 1 == p ) { + hps_ctrl |= ( (1 << 30) | (1 << 28) ); + } + + /* write back & upload register */ + saa7146_write(saa->mem, HPS_CTRL, hps_ctrl); + saa7146_write(saa->mem, MC2, (MASK_05 | MASK_21)); +} + +#endif + diff --git a/drivers/media/dvb/av7110/saa7146_core.c b/drivers/media/dvb/av7110/saa7146_core.c new file mode 100644 index 000000000000..0ba82f9d18e8 --- /dev/null +++ b/drivers/media/dvb/av7110/saa7146_core.c @@ -0,0 +1,968 @@ +/* + saa7146_core.c - core-functions + i2c driver for the saa7146 by + Philips Semiconductors. + + Copyright (C) 1998,1999 Michael Hunold <michael@mihu.de> + + 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 <linux/module.h> /* for module-version */ +#include <linux/delay.h> /* for delay-stuff */ +#include <linux/slab.h> /* for kmalloc/kfree */ +#include <linux/pci.h> /* for pci-config-stuff, vendor ids etc. */ +#include <linux/wrapper.h> /* for mem_map_reserve */ +#include <linux/init.h> +#include <asm/io.h> /* for accessing the pci-device */ +#include <linux/vmalloc.h> /* for module-version */ + +#include "saa7146_defs.h" +#include "saa7146_core.h" +#include "saa7146_v4l.h" +#include "av7110.h" +#include "../dvb-core/compat.h" +#include "../dvb-core/dvb_i2c.h" + +/* insmod parameter: here you can specify the number of video-buffers + to be allocated. for simple capturing 2 buffers (double-buffering) + should suffice. but if you plan to do 25fps grabbing, you should + set this to 4(=maximum), in order to be able to catch up from + temporarily delays */ +static int buffers = 2; + +/* insmod parameter: some programs (e.g. ´vic´) do not allow to + specify the used video-mode, so you have to tell this to the + modules by hand, 0 = PAL, 1 = NTSC */ +static int mode = 0; + +/* debug levels: 0 -- no debugging outputs + 1 -- prints out entering (and exiting if useful) of functions + 2 -- prints out very, very detailed informations of what is going on + 3 -- both of the above */ +int saa7146_debug = 0; /* insmod parameter */ + +#define dprintk if (saa7146_debug & 1) printk +#define hprintk if (saa7146_debug & 2) printk + +/* ---------------------------------------------*/ +/* memory functions - taken from bttv.c */ +/* ---------------------------------------------*/ + +static inline unsigned long kvirt_to_pa(unsigned long adr) +{ + unsigned long kva; + + kva = (unsigned long) page_address(vmalloc_to_page((void *)adr)); + kva |= adr & (PAGE_SIZE-1); /* restore the offset */ + + return __pa(kva); +} + + +static LIST_HEAD(saa7146_list); + +static int saa7146_extension_count = 0; +static struct saa7146_extension* saa7146_ext[SAA7146_MAX_EXTENSIONS]; + +#define SAA7146_I2C_TIMEOUT 100 /* in ms */ +#define SAA7146_I2C_RETRIES 6 + +static u32 SAA7146_I2C_BBR = SAA7146_I2C_BUS_BIT_RATE_3200; + +#define __COMPILE_SAA7146_I2C__ +#define __COMPILE_SAA7146_DEBI__ +#include "saa7146.c" +#undef __COMPILE_SAA7146_I2C__ + +/* ---------------------------------------------*/ +/* memory functions designed for saa7146 */ +/* ---------------------------------------------*/ + +/* rvmalloc allocates the memory and builds up + the page-tables for ´quant´-number of buffers */ +static void* rvmalloc(int quant, u32* pt[]) +{ + void* mem; + + unsigned long adr = 0; + unsigned long count = 0; + + u32* ptp = 0; + int i = 0, j = 0; + + dprintk(KERN_ERR "saa7146: rvmalloc called, quant:%d\n",quant); + + if(!quant) + return NULL; + + /* get grabbing memory */ + mem = vmalloc_32(quant*GRABBING_MEM_SIZE); + + if(!mem) + return NULL; + + dprintk(KERN_ERR "saa7146: alloc page tables\n"); + + /* alloc one page for a page-table for ´quant´ buffers */ + for(i = 0; i < quant; i++) { + pt[i] = (u32*)kmalloc(PAGE_SIZE,GFP_KERNEL); + + /* error: memory could not be allocated */ + if(!pt[i]) { + dprintk(KERN_ERR "saa7146: failed, free tables\n"); + for(j = (i-1); j >= 0; j--) + kfree(pt[j]); + dprintk(KERN_ERR "saa7146: free buffer memory\n"); + vfree(mem); + dprintk(KERN_ERR "saa7146: return 0 address for buffer\n"); + return NULL; + } + memset(pt[i], 0x00, PAGE_SIZE); + } + + dprintk(KERN_ERR "saa7146: clear RAM\n"); + + /* clear the ram out, no junk to the user + note: 0x7f gives a nice grey field + in RGB and YUV as well */ + memset(mem, 0x7f, quant*GRABBING_MEM_SIZE); + + dprintk(KERN_ERR "saa7146: build page tables\n"); + adr = (unsigned long)mem; + /* walk through the grabbing-memory and build up the page-tables */ + for(i = 0; i < quant; i++) { + + for (count=0; count<GRABBING_MEM_SIZE; count+=PAGE_SIZE) + mem_map_reserve(virt_to_page(__va(kvirt_to_pa(adr+count)))); + /* separate loop for SAA MMU, PAGE_SIZE can be !=4096 */ + ptp = pt[i]; + for (count=0; count<GRABBING_MEM_SIZE; count+=4096, adr+=4096) + *(ptp++) = cpu_to_le32(kvirt_to_pa(adr)); + } + dprintk(KERN_ERR "saa7146: page tables built\n"); + return mem; +} + +static void rvfree(void* mem, int quant, u32* pt[]) +{ + unsigned long adr, page; + unsigned long size = 0; + + int i = 0; + + dprintk(KERN_ERR "saa7146: rvfree called\n"); + + if (!quant) + return; + + if (mem) { + adr = (unsigned long)mem; + size = quant * GRABBING_MEM_SIZE; + + while (size > 0) { + page = kvirt_to_pa(adr); + mem_map_unreserve(virt_to_page(__va(page))); + adr += PAGE_SIZE; + size -= PAGE_SIZE; + } + + /* release the grabbing memory */ + vfree(mem); + } + /* free the page tables */ + for(i = 0; i < quant; i++) { + kfree(pt[i]); + } +} + + +/* ---------------------------------------------*/ +/* i2c-functions */ +/* ---------------------------------------------*/ + +static +int do_master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num) +{ + struct saa7146 *a = i2c->data; + int result, count; + int i = 0; + + dprintk(KERN_ERR "saa7146_core.o: master_xfer called, num:%d\n",num); + + /* prepare the message(s), get number of u32s to transfer */ + count = prepare(msgs, num, a->i2c); + if ( 0 > count ) { + hprintk(KERN_ERR "saa7146_core.o: master_xfer: could not prepare i2c-message\n"); + return -EIO; + } + + /* reset the i2c-device if necessary */ + result = i2c_reset( a ); + if ( 0 > result ) { + hprintk(KERN_ERR "saa7146_core.o: master_xfer: could not reset i2c-bus\n"); + return result; + } + + for(i = 0; i < count; i++) { + /* see how many u32 have to be transferred; + * if there is only 1, + * we do not start the whole rps1-engine... + */ + + result = i2c_write_out( a, &a->i2c[i], + SAA7146_I2C_TIMEOUT ); + + if ( 0 != result) { + /* if address-error occured, don't retry */ + if ( result == -EREMOTEIO ) + { + hprintk(KERN_ERR "saa7146_core.o: master_xfer: error in address phase\n"); + return result; + } + hprintk(KERN_ERR "saa7146_core.o: master_xfer: error transferring, trying again\n"); + break; + } + } + + /* see if an error occured & the last retry failed */ + if (0 != result) { + hprintk(KERN_ERR "saa7146_core.o: master_xfer: could not transfer i2c-message\n"); + return -EIO; + } + + /* if any things had to be read, get the results */ + result = clean_up(msgs, num, a->i2c); + if ( 0 > result ) { + hprintk(KERN_ERR "saa7146_core.o: master_xfer: could not cleanup\n"); + return -EIO; + } + + /* return the number of delivered messages */ + return num; +} + + + +static +int master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num) +{ + int retries = SAA7146_I2C_RETRIES; + int ret; + + do { + ret = do_master_xfer (i2c, msgs, num); + } while (ret != num && retries--); + + return ret; +} + + +/* registering functions to load algorithms at runtime */ +int i2c_saa7146_add_bus (struct saa7146 *saa) +{ + /* enable i2c-port pins */ + saa7146_write (saa->mem, MC1, (MASK_08 | MASK_24)); + + sprintf(saa->name, "saa7146(%d)", saa->dvb_adapter->num); + + saa->i2c_bus = dvb_register_i2c_bus (master_xfer, saa, + saa->dvb_adapter, 0); + if (!saa->i2c_bus) + return -ENOMEM; + + return 0; +} + + +void i2c_saa7146_del_bus (struct saa7146 *saa) +{ + dvb_unregister_i2c_bus (master_xfer, + saa->i2c_bus->adapter, saa->i2c_bus->id); + + dvb_unregister_adapter (saa->dvb_adapter); +} + +/* ---------------------------------------------*/ +/* debug-helper function: dump-registers */ +/* ---------------------------------------------*/ + +void dump_registers(unsigned char* mem) { + + u16 j = 0; + + for( j = 0x0; j < 0x1fe; j+=0x4 ) { + printk("0x%03x: 0x%08x\n",j,saa7146_read(mem,j)); + } + +} + +/* -----------------------------------------------------*/ +/* dispatcher-function for handling external commands */ +/* -----------------------------------------------------*/ + +static int saa7146_core_command (struct dvb_i2c_bus *i2c, unsigned int cmd, void *arg) +{ + int i = 0, result = -ENOIOCTLCMD; + struct saa7146* saa = i2c->data; + + dprintk("saa7146_core.o: ==> saa7146_core_command\n"); + + if( NULL == saa) + return -EINVAL; + + /* first let the extensions handle the command */ + for (i = 0; i < SAA7146_MAX_EXTENSIONS; i++) { + if (NULL != saa7146_ext[i]) { + if( -ENOIOCTLCMD != (result = saa7146_ext[i]->command(saa, saa->data[i], cmd, arg))) { + break; + } + } + } + + /* if command has not been handled by an extension, handle it now */ + if( result == -ENOIOCTLCMD ) { + + switch(cmd) { + case SAA7146_DUMP_REGISTERS: + { + dump_registers(saa->mem); + break; + } + case SAA7146_SET_DD1: + { + u32 *i = arg; + + dprintk(KERN_ERR "saa7146_core.o: SAA7146_SET_DD1 to 0x%08x\n",*i); + + /* set dd1 port register */ + saa7146_write(saa->mem, DD1_INIT, *i); + + /* write out init-values */ + saa7146_write(saa->mem,MC2, (MASK_09 | MASK_10 | MASK_26 | MASK_26)); + + break; + } + case SAA7146_DO_MMAP: + { + struct vm_area_struct *vma = arg; + unsigned long size = vma->vm_end - vma->vm_start; + unsigned long start = vma->vm_start; + unsigned long page,pos; + + dprintk(KERN_ERR "saa7146_core.o: SAA7146_DO_MMAP.\n"); + + if (size > saa->buffers * GRABBING_MEM_SIZE) + return -EINVAL; + + if ( NULL == saa->grabbing ) + return -EINVAL; + + pos=(unsigned long)saa->grabbing; + + while (size > 0) + { + page = kvirt_to_pa(pos); + if (remap_page_range(vma, start, page, + PAGE_SIZE, PAGE_SHARED)) + return -EAGAIN; + start += PAGE_SIZE; + pos += PAGE_SIZE; + size -= PAGE_SIZE; + } + + break; + } + case SAA7146_DEBI_TRANSFER: { + + struct saa7146_debi_transfer *dt = arg; + + printk("saa7146_core.o: SAA7146_DEBI_TRANSFER\n"); + printk("saa7146_core.o: timeout:%d, swap:%d, slave16:%d, increment:%d, intel:%d, tien:%d\n", dt->timeout, dt->swap, dt->slave16, dt->increment, dt->intel, dt->tien); + printk("saa7146_core.o: address:0x%04x, num_bytes:%d, direction:%d, mem:0x%08x\n",dt->address,dt->address,dt->direction,dt->mem); + + debi_transfer(saa, dt); + break; + } + + default: { + return -ENOIOCTLCMD; + } + } + } + + return 0; +} + +/* -----------------------------------------------------*/ +/* dispatcher-function for handling irq-events */ +/* -----------------------------------------------------*/ + +/* irq-handler function */ +static void saa7146_irq(int irq, void *dev_id, struct pt_regs * regs) +{ + struct saa7146 *saa = (struct saa7146 *)dev_id; + u32 isr = 0; + int i; + int count = 0; + + /* process all interrupts */ + while (1) { + + /* read out the primary status register */ + isr = saa7146_read(saa->mem, ISR); + /* clear all IRQs */ + saa7146_write(saa->mem, ISR, isr); + + /* is anything to do? */ + if ( 0 == isr ) + return; + + dprintk("%s: irq-call: isr:0x%08x\n",saa->name,isr); + + /* first let the extensions handle the interrupt */ + for (i = 0; i < SAA7146_MAX_EXTENSIONS; i++) + if (saa7146_ext[i] && + (isr&saa7146_ext[i]->handles_irqs)) { + saa7146_ext[i]->irq_handler(saa, isr, saa->data[i]); + //saa7146_write(saa->mem, ISR, saa7146_ext[i]->handles_irqs); + } + + //printk(KERN_ERR "%s: unhandled interrupt: 0x%08x\n", saa->name, isr); + + /* see if we are in a hard interrupt loop */ + ++count; + if (count > 10) + printk (KERN_WARNING "%s: irq loop %d\n", saa->name, count); + if (count > 20) { + saa7146_write(saa->mem, IER, 0x00000000); + printk(KERN_ERR "%s: IRQ lockup, cleared int mask\n", saa->name); + break; + } + } +} + +/* ----------------------------------------------------- + functions for finding any saa7146s in the system, + inserting/removing module for kernel, etc. + -----------------------------------------------------*/ + +int configure_saa7146 (struct saa7146 *saa) +{ + u32 rev = 0; + int result = 0; + + hprintk("saa7146_core.o: ==> configure_saa7146\n"); + + /* check module-parameters for sanity */ + + /* check if wanted number of video-buffers is valid, otherwise fix it */ + //if (buffers < 2) + // buffers = 2; + + if ( buffers > SAA7146_MAX_BUF ) + buffers = SAA7146_MAX_BUF; + + /* check if mode is supported */ + switch( mode ) { + /* 0 = pal, 1 = ntsc */ + case 0: + case 1: + { + break; + } + /* default to pal */ + default: + { + mode = 0; + break; + } + } + + /* get chip-revision; this is needed to enable bug-fixes */ + if( 0 > pci_read_config_dword(saa->device, 0x08, &rev)) { + printk (KERN_ERR + "saa7146_core.o: cannot read from pci-device!\n"); + return -1; + } + + saa->revision = (rev & 0xf); + + /* remap the memory from virtual to physical adress */ + saa->mem = ioremap ((saa->device->resource[0].start) + &PCI_BASE_ADDRESS_MEM_MASK, 0x1000); + + if ( !saa->mem ) { + printk(KERN_ERR "saa7146_core.o: cannot map pci-address!\n"); + return -EFAULT; + } + + /* get clipping memory */ + saa->clipping = (u32*) kmalloc (CLIPPING_MEM_SIZE*sizeof(u32),GFP_KERNEL); + + if ( !saa->clipping ) { + printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for clipping!\n"); + return -ENOMEM; + } + + memset(saa->clipping, 0x0, CLIPPING_MEM_SIZE*sizeof(u32)); + + /* get i2c memory */ + saa->i2c = (u32*) kmalloc (I2C_MEM_SIZE*sizeof(u32),GFP_KERNEL); /*64*/ + + if ( !saa->i2c ) { + printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for i2c!\n"); + kfree(saa->clipping); + return -ENOMEM; + } + + memset(saa->i2c, 0x0, I2C_MEM_SIZE*sizeof(u32)); + + /* get grabbing memory */ + saa->grabbing = (u32*) rvmalloc (buffers, &saa->page_table[0]); + + if ( !saa->grabbing ) { + printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for grabbing_mem!\n"); + kfree(saa->i2c); + kfree(saa->clipping); + return -ENOMEM; + } + + /* get rps0 memory */ + saa->rps0 = (u32*) kmalloc (RPS_MEM_SIZE*sizeof(u32),GFP_KERNEL); + + if ( !saa->rps0 ) { + printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for rps0_mem!\n"); + kfree(saa->i2c); + kfree(saa->clipping); + rvfree(saa->grabbing, buffers, &saa->page_table[0]); + return -ENOMEM; + } + + memset(saa->rps0, 0x0, RPS_MEM_SIZE*sizeof(u32)); + + /* get rps1 memory */ + saa->rps1 = (u32*) kmalloc (RPS_MEM_SIZE*sizeof(u32),GFP_KERNEL); + if ( !saa->rps1 ) { + printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for rps1_mem!\n"); + kfree(saa->rps0); + kfree(saa->i2c); + kfree(saa->clipping); + rvfree(saa->grabbing, buffers, &saa->page_table[0]); + return -1; + } + + memset(saa->rps1, 0x0, RPS_MEM_SIZE*sizeof(u32)); + + /* get debi memory (32kB) */ + saa->debi = (u32*) kmalloc (8192*sizeof(u32),GFP_KERNEL); + + if ( !saa->debi ) { + printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for debi_mem!\n"); + kfree(saa->rps1); + kfree(saa->rps0); + kfree(saa->i2c); + kfree(saa->clipping); + rvfree(saa->grabbing, buffers, &saa->page_table[0]); + return -1; + } + + memset(saa->debi, 0x0, 8192*sizeof(u32)); + + + /* clear out memory for grabbing information */ + memset(&saa->grab_width[0], 0x0, sizeof(int)*SAA7146_MAX_BUF); + memset(&saa->grab_height[0], 0x0, sizeof(int)*SAA7146_MAX_BUF); + memset(&saa->grab_format[0], 0x0, sizeof(int)*SAA7146_MAX_BUF); + memset(&saa->grab_port[0], 0x0, sizeof(int)*SAA7146_MAX_BUF); + + /* init the frame-status array */ + memset(&saa->frame_stat[0], GBUFFER_UNUSED, sizeof(int)*SAA7146_MAX_BUF); + + /* clear out all wait queues */ + init_waitqueue_head(&saa->rps0_wq); + init_waitqueue_head(&saa->rps1_wq); + + + /* request an interrupt for the saa7146 */ + result = request_irq (saa->device->irq, saa7146_irq, + SA_SHIRQ | SA_INTERRUPT, saa->name, (void *) saa); + + switch(result) { + case -EINVAL: + { + printk(KERN_ERR "saa7146_core.o: Bad irq number or handler\n"); + return -EINVAL; + } + case -EBUSY: + { + printk(KERN_ERR "saa7146_core.o: IRQ %d busy, change your PnP config in BIOS\n", saa->device->irq); + return -EBUSY; + } + case 0: + { + break; + } + default: + { + return result; + } + } + + /* print status message */ + printk(KERN_ERR "saa7146_core.o: %s: bus:%d, rev:%d, mem:0x%08x.\n", saa->name, saa->device->bus->number, saa->revision, (unsigned int) saa->mem); + + /* enable bus-mastering */ + pci_set_master( saa->device ); + + /* disable everything on the saa7146, perform a software-reset */ + saa7146_write(saa->mem, MC1, 0xbfff0000); + mdelay(2); +#if 0 + { + int j; + + /* clear all registers */ + for( j = 0x0; j < 0xfc; j+=0x4 ) { + saa7146_write(saa->mem,j, 0x0000000); + } + for( j = 0x104; j < 0x1fc; j+=0x4 ) { + saa7146_write(saa->mem,j, 0x0000000); + } + } +#endif + /* clear out any rps-signals pending */ + saa7146_write(saa->mem, MC2, 0xf8000000); + + /* enable video-port-pins*/ + saa7146_write(saa->mem,MC1, (MASK_10 | MASK_26)); + + /* disable all interrupt-conditions, only enable RPS interrupts */ + saa7146_write(saa->mem, ISR, 0xffffffff); + saa7146_write(saa->mem, IER, (MASK_27 | MASK_28)); +/* + printk("main: 0x114: 0x%08x\n",saa7146_read(saa->mem, 0x114)); + printk("main: 0x0e4: 0x%08x\n",saa7146_read(saa->mem, 0x0e4)); + printk("PSR: 0x%08x\n",saa7146_read(saa->mem, PSR)); + printk("SSR: 0x%08x\n",saa7146_read(saa->mem, SSR)); + printk("IER: 0x%08x\n",saa7146_read(saa->mem, IER)); + printk("ISR: 0x%08x\n",saa7146_read(saa->mem, ISR)); +*/ + + saa7146_write(saa->mem,PCI_BT_V1, 0x1c00101f); + saa7146_write(saa->mem,BCS_CTRL, 0x80400040); + + /* set dd1 stream a & b */ + saa7146_write(saa->mem, DD1_STREAM_B, 0x00000000); + saa7146_write(saa->mem, DD1_INIT, 0x02000000); + saa7146_write(saa->mem, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); + + saa7146_write(saa->mem, MC2, 0x077c077c); + + /* the Siemens DVB needs this if you want to have the i2c chips + get recognized before the main driver is loaded + */ + saa7146_write(saa->mem, GPIO_CTRL, 0x500000); + + saa->command = &saa7146_core_command; + saa->buffers = buffers; + saa->mode = mode; + saa->interlace = 1; + + i2c_saa7146_add_bus (saa); + + saa7146_write(saa->mem, GPIO_CTRL, 0x000000); + return 0; +} + + +void saa7146_foreach (void (*callback) (struct saa7146* saa, void *data), + void *data) +{ + struct list_head *entry; + + list_for_each (entry, &saa7146_list) { + struct saa7146* saa; + + saa = list_entry (entry, struct saa7146, list_head); + callback (saa, data); + } +} + + +static +void saa7146_attach_extension (struct saa7146* saa, void *data) +{ + int ext_id = (int) data; + saa7146_ext[ext_id]->attach (saa, &saa->data[ext_id]); +} + + +static +void saa7146_detach_extension (struct saa7146* saa, void *data) +{ + int ext_id = (int) data; + saa7146_ext[ext_id]->detach (saa, &saa->data[ext_id]); +} + + +int saa7146_add_extension(struct saa7146_extension* ext) +{ + int ext_id = 0; + + for (ext_id = 0; ext_id < SAA7146_MAX_EXTENSIONS; ext_id++) { + if (NULL == saa7146_ext[ext_id]) + break; + if (SAA7146_MAX_EXTENSIONS == ext_id) { + printk(KERN_WARNING "saa7146.o: attach_extension(%s) - " + "enlarge SAA7146_MAX_EXTENSIONS.\n",ext->name); + return -ENOMEM; + } + } + + saa7146_ext[ext_id] = ext; + saa7146_extension_count++; + + if (ext->attach) + saa7146_foreach (saa7146_attach_extension, (void*) ext_id); + + return 0; +} + + +int saa7146_del_extension(struct saa7146_extension* ext) +{ + int ext_id = 0; + + for (ext_id = 0; ext_id < SAA7146_MAX_EXTENSIONS; ext_id++) + if (ext == saa7146_ext[ext_id]) + break; + + if (SAA7146_MAX_EXTENSIONS == ext_id) { + printk("%s: detach_extension extension [%s] not found.\n", + __FUNCTION__, ext->name); + return -ENODEV; + } + + if (ext->detach) + saa7146_foreach (saa7146_detach_extension, (void*) ext_id); + + saa7146_ext[ext_id] = NULL; + saa7146_extension_count--; + + return 0; +} + + +static +void remove_saa7146(struct saa7146 *saa) +{ + i2c_saa7146_del_bus (saa); + + /* shut down all dma transfers */ + saa7146_write(saa->mem, MC1, 0xbfff0000); + + dprintk("free irqs\n"); + /* disable alle irqs, release irq-routine */ + saa7146_write(saa->mem, IER, 0x00); + saa7146_write(saa->mem, ISR, 0xffffffff); + free_irq(saa->device->irq, (void *)saa); + dprintk("unmap memory\n"); + /* unmap the memory, if necessary */ + if (saa->mem) + iounmap((unsigned char *)((unsigned int)saa->mem)); + + dprintk("release grabbing memory\n"); + /* release grabbing memory */ + if(saa->grabbing) + rvfree(saa->grabbing, buffers, &saa->page_table[0]); + + dprintk("release other memory\n"); + /* release clipping, i2c, rps0 memory */ + kfree(saa->clipping); + kfree(saa->i2c); + kfree(saa->rps0); + kfree(saa->rps1); + kfree(saa->debi); +} + + +static int saa7146_suspend(struct pci_dev *pdev, u32 state) +{ + printk("saa7146_suspend()\n"); + saa7146_core_command(((struct saa7146 *) pdev->driver_data)->i2c_bus, + SAA7146_SUSPEND, 0); + return 0; +} + +static int +saa7146_resume(struct pci_dev *pdev) +{ + printk("saa7146_resume()\n"); + saa7146_core_command(((struct saa7146 *) pdev->driver_data)->i2c_bus, + SAA7146_RESUME, 0); + return 0; +} + + +struct card_info { + int type; + char *name; +}; + + +static +int __devinit saa7146_init_one (struct pci_dev *pdev, + const struct pci_device_id *ent) +{ + struct dvb_adapter_s *adap; + struct saa7146 *saa; + int card_type; + struct card_info *cinfo= (struct card_info *) ent->driver_data; + + dprintk("saa7146_init_one()\n"); + + card_type = cinfo->type; + dvb_register_adapter(&adap, cinfo->name); + + if (!(saa = kmalloc (sizeof (struct saa7146), GFP_KERNEL))) { + printk ("%s: out of memory!\n", __FUNCTION__); + return -ENOMEM; + } + + memset (saa, 0, sizeof (struct saa7146)); + + saa->device = pdev; + saa->device->driver_data = saa; + saa->card_type = card_type; + saa->dvb_adapter = adap; + + pci_enable_device (saa->device); + + configure_saa7146 (saa); + + list_add_tail (&saa->list_head, &saa7146_list); + + return 0; +} + +static +void __devexit saa7146_remove_one (struct pci_dev *pdev) +{ + struct saa7146 *saa = pdev->driver_data; + + dprintk("saa7146_remove_one()\n"); + + list_del (&saa->list_head); + pci_disable_device(pdev); + remove_saa7146 (saa); +} + + +static struct card_info fs_1_5 = { DVB_CARD_TT_SIEMENS, "Siemens cable card PCI rev1.5" }; +static struct card_info fs_1_3 = { DVB_CARD_TT_SIEMENS, "Siemens/Technotrend/Hauppauge PCI rev1.3" }; +static struct card_info ttbs = { DVB_CARD_TT_BUDGET, "TT-Budget/WinTV-NOVA-S PCI" }; +static struct card_info ttbc = { DVB_CARD_TT_BUDGET, "TT-Budget/WinTV-NOVA-C PCI" }; +static struct card_info ttbt = { DVB_CARD_TT_BUDGET, "TT-Budget/WinTV-NOVA-T PCI" }; +static struct card_info ttbci = { DVB_CARD_TT_BUDGET_CI, "TT-Budget/WinTV-NOVA-CI PCI" }; +static struct card_info satel = { DVB_CARD_TT_BUDGET, "SATELCO Multimedia PCI"}; +static struct card_info unkwn = { DVB_CARD_TT_SIEMENS, "Technotrend/Hauppauge PCI rev?(unknown0)?"}; +static struct card_info tt_1_6 = { DVB_CARD_TT_SIEMENS, "Technotrend/Hauppauge PCI rev1.3 or 1.6" }; +static struct card_info tt_2_1 = { DVB_CARD_TT_SIEMENS, "Technotrend/Hauppauge PCI rev2.1" }; +static struct card_info tt_t = { DVB_CARD_TT_SIEMENS, "Technotrend/Hauppauge PCI DVB-T" }; +static struct card_info knc1 = { DVB_CARD_KNC1, "KNC1 DVB-S" }; + +#define PHILIPS_SAA7146 PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA7146 +#define CARD_INFO driver_data: (unsigned long) & + +static struct pci_device_id saa7146_pci_tbl[] __devinitdata = { + { PHILIPS_SAA7146, 0x110a, 0xffff, CARD_INFO fs_1_5 }, + { PHILIPS_SAA7146, 0x110a, 0x0000, CARD_INFO fs_1_5 }, + { PHILIPS_SAA7146, 0x13c2, 0x1003, CARD_INFO ttbs }, + { PHILIPS_SAA7146, 0x13c2, 0x1004, CARD_INFO ttbc }, + { PHILIPS_SAA7146, 0x13c2, 0x1005, CARD_INFO ttbt }, + { PHILIPS_SAA7146, 0x13c2, 0x100c, CARD_INFO ttbci }, + { PHILIPS_SAA7146, 0x13c2, 0x1013, CARD_INFO satel }, + { PHILIPS_SAA7146, 0x13c2, 0x0000, CARD_INFO fs_1_3 }, + { PHILIPS_SAA7146, 0x13c2, 0x1002, CARD_INFO unkwn }, + { PHILIPS_SAA7146, 0x13c2, 0x0001, CARD_INFO tt_1_6 }, + { PHILIPS_SAA7146, 0x13c2, 0x0002, CARD_INFO tt_2_1 }, + { PHILIPS_SAA7146, 0x13c2, 0x0003, CARD_INFO tt_2_1 }, + { PHILIPS_SAA7146, 0x13c2, 0x0004, CARD_INFO tt_2_1 }, + { PHILIPS_SAA7146, 0x13c2, 0x0006, CARD_INFO tt_1_6 }, + { PHILIPS_SAA7146, 0x13c2, 0x0008, CARD_INFO tt_t }, + { PHILIPS_SAA7146, 0xffc2, 0x0000, CARD_INFO unkwn }, + { PHILIPS_SAA7146, 0x1131, 0x4f56, CARD_INFO knc1 }, + { 0,}, +}; + +MODULE_DEVICE_TABLE(pci, saa7146_pci_tbl); + +static struct pci_driver saa7146_driver = { + name: "saa7146", + id_table: saa7146_pci_tbl, + probe: saa7146_init_one, + remove: saa7146_remove_one, + suspend: saa7146_suspend, + resume: saa7146_resume, +}; + + +static +int __init saa7146_init_module(void) +{ + int err; + + dprintk("saa7146_init_module\n"); + + if ((err = pci_module_init(&saa7146_driver))) + return err; + + if ((err = saa7146_v4l_init ())) + return err; + + if ((err = av7110_init ())) + return err; + + if ((err = av7110_ir_init ())) + return err; + + return 0; +} + +static +void __exit saa7146_cleanup_module(void) +{ + av7110_ir_exit (); + av7110_exit (); + saa7146_v4l_exit (); + pci_unregister_driver(&saa7146_driver); +} + +module_init(saa7146_init_module); +module_exit(saa7146_cleanup_module); + +MODULE_AUTHOR("Michael Hunold <michael@mihu.de>, " + "Christian Theiss <mistert@rz.fh-augsburg.de>, " + "Ralph Metzler <rjkm@convergence.de>, " + "Marcus Metzler <mocm@convergence.de>, " + "Holger Waechtler <holger@convergence.de> and others"); + +MODULE_DESCRIPTION("driver for saa7146/av7110 based DVB PCI cards"); +MODULE_LICENSE("GPL"); +MODULE_PARM(mode,"i"); +MODULE_PARM(saa7146_debug,"i"); +MODULE_PARM(buffers,"i"); + diff --git a/drivers/media/dvb/av7110/saa7146_core.h b/drivers/media/dvb/av7110/saa7146_core.h new file mode 100644 index 000000000000..ec3bd7598a49 --- /dev/null +++ b/drivers/media/dvb/av7110/saa7146_core.h @@ -0,0 +1,116 @@ +#ifndef __SAA7146_CORE__ +#define __SAA7146_CORE__ + +#include <asm/io.h> /* definitions of u32 etc. */ +#include "../dvb-core/dvbdev.h" + +#if LINUX_VERSION_CODE < 0x020300 +#define DECLARE_MUTEX(foo) struct semaphore foo = MUTEX +#define DECLARE_MUTEX_LOCKED(foo) struct semaphore foo = MUTEX_LOCKED +#define WAIT_QUEUE struct wait_queue* +#define init_waitqueue_head(wq) *(wq) = NULL; +#else +#define WAIT_QUEUE wait_queue_head_t +#endif + +/* maximum number of capture frames we support */ +#define SAA7146_MAX_BUF 5 +/* maximum number of extensions we support */ +#define SAA7146_MAX_EXTENSIONS 4 + +/* stuff for writing to saa7146 */ +#define saa7146_write(mem,adr,dat) writel((dat),(mem+(adr))) +#define saa7146_read(mem,adr) readl(mem+(adr)) + + +#define DVB_CARD_TT_SIEMENS 0 +#define DVB_CARD_TT_BUDGET 1 +#define DVB_CARD_TT_BUDGET_CI 2 +#define DVB_CARD_KNC1 3 + + +/* this struct contains some constants needed for horizontal and vertical scaling. + currently we only support PAL (mode=0)and NTSC (mode=1). */ + +struct saa7146 { + + char name[32]; /* give it a nice name */ + + struct list_head list_head; + + dvb_adapter_t *dvb_adapter; + struct dvb_i2c_bus *i2c_bus; + struct pci_dev *device; + int card_type; + + void* data[SAA7146_MAX_EXTENSIONS]; /* data hooks for extensions */ + + int (*command) (struct dvb_i2c_bus *i, unsigned int cmd, void *arg); + + unsigned char* mem; /* pointer to mapped IO memory */ + int revision; /* chip revision; needed for bug-workarounds*/ + + int interlace; + int mode; + + u32* i2c; /* i2c memory */ + u32* grabbing; /* grabbing memory */ + u32* clipping; /* clipping memory for mask or rectangle clipping*/ + u32* rps0; /* memory for rps0-program */ + u32* rps1; /* memory for rps1-program */ + u32* debi; /* memory for debi-transfers */ + + int buffers; /* number of grabbing-buffers */ + + u32* page_table[SAA7146_MAX_BUF]; /* page_tables for buffers*/ + int frame_stat[SAA7146_MAX_BUF]; /* status of grabbing buffers */ + + int grab_width[SAA7146_MAX_BUF]; /* pixel width of grabs */ + int grab_height[SAA7146_MAX_BUF]; /* pixel height of grabs */ + int grab_format[SAA7146_MAX_BUF]; /* video format of grabs */ + int grab_port[SAA7146_MAX_BUF]; /* video port for grab */ + + WAIT_QUEUE rps0_wq; /* rps0 interrupt queue (=> capture) */ + WAIT_QUEUE rps1_wq; /* rps1 interrupt queue (=> i2c, ...) */ +}; + +#define SAA7146_IRQ_RPS0 +#define SAA7146_IRQ_RPS1 + +struct saa7146_extension { + char name[32]; + u32 handles_irqs; + + void (*irq_handler)(struct saa7146*, u32, void*); + + int (*command)(struct saa7146*, void*, unsigned int cmd, void *arg); + + int (*attach)(struct saa7146*, void**); + int (*detach)(struct saa7146*, void**); + + void (*inc_use)(struct saa7146*); + void (*dec_use)(struct saa7146*); +}; + +extern int saa7146_add_extension(struct saa7146_extension* ext); +extern int saa7146_del_extension(struct saa7146_extension* ext); + + +/* external grabbing states */ +#define GBUFFER_UNUSED 0x000 +#define GBUFFER_GRABBING 0x001 +#define GBUFFER_DONE 0x002 + +#define SAA7146_CORE_BASE 200 + +#define SAA7146_DO_MMAP _IOW('d', (SAA7146_CORE_BASE+11), struct vm_area_struct *) +#define SAA7146_SET_DD1 _IOW('d', (SAA7146_CORE_BASE+12), u32) +#define SAA7146_DUMP_REGISTERS _IOW('d', (SAA7146_CORE_BASE+13), u32) +#define SAA7146_DEBI_TRANSFER _IOW('d', (SAA7146_CORE_BASE+14), struct saa7146_debi_transfer) + + +#define SAA7146_SUSPEND _IOW('d', (SAA7146_CORE_BASE+32), u32) +#define SAA7146_RESUME _IOW('d', (SAA7146_CORE_BASE+33), u32) + +#endif + diff --git a/drivers/media/dvb/av7110/saa7146_defs.h b/drivers/media/dvb/av7110/saa7146_defs.h new file mode 100644 index 000000000000..db19ee302d12 --- /dev/null +++ b/drivers/media/dvb/av7110/saa7146_defs.h @@ -0,0 +1,382 @@ +#ifndef __INCLUDED_SAA7146__ +#define __INCLUDED_SAA7146__ + +struct saa7146_video_dma { + u32 base_odd; + u32 base_even; + u32 prot_addr; + u32 pitch; + u32 base_page; + u32 num_line_byte; +}; + +struct saa7146_debi_transfer { + + u8 timeout; /* have a look at the specs for reasonable values, p.110 ff */ + u8 swap; + u8 slave16; + u8 increment; /* only for block transfers */ + u8 intel; + u8 tien; + + u16 address; + u16 num_bytes; + u8 direction; + u32 mem; /* either a "pointer" (actually the physical address) of the debi-memory (block-transfer, use virt_to_bus to supply it) or 4 bytes (as one u32-value) for immediate transfer */ +}; + +struct saa7146_modes_constants { + u8 v_offset; + u16 v_field; + u16 v_calc; + + u8 h_offset; + u16 h_pixels; + u16 h_calc; + + u16 v_max_out; + u16 h_max_out; +}; + +struct saa7146_mmap_struct +{ + const char *adr; + unsigned long size; +}; + +#define SAA7146_PAL 0 +#define SAA7146_NTSC 1 +#define SAA7146_SECAM 2 + +#define SAA7146_HPS_SOURCE_PORT_A 0x00 +#define SAA7146_HPS_SOURCE_PORT_B 0x01 +#define SAA7146_HPS_SOURCE_YPB_CPA 0x02 +#define SAA7146_HPS_SOURCE_YPA_CPB 0x03 + +#define SAA7146_HPS_SYNC_PORT_A 0x00 +#define SAA7146_HPS_SYNC_PORT_B 0x01 + + +/* Number of vertical active lines */ +#define V_ACTIVE_LINES_PAL 576 +#define V_ACTIVE_LINES_NTSC 480 +#define V_ACTIVE_LINES_SECAM 576 + +/* Number of lines in a field for HPS to process */ +#define V_FIELD_PAL 288 +#define V_FIELD_NTSC 240 +#define V_FIELD_SECAM 288 + +/* Number of lines of vertical offset before processing */ +#define V_OFFSET_NTSC 0x10 /* PLI */ +#define V_OFFSET_PAL 0x15 +#define V_OFFSET_SECAM 0x14 + +/* Number of horizontal pixels to process */ +#define H_PIXELS_NTSC 708 +#define H_PIXELS_PAL 720 +#define H_PIXELS_SECAM 720 + +/* Horizontal offset of processing window */ +#define H_OFFSET_NTSC 0x40 /* PLI Try 0x3f and find all red colors turning into blue !!?? */ +#define H_OFFSET_PAL 0x3a +#define H_OFFSET_SECAM 0x14 + +/* some memory-sizes */ +#define GRABBING_MEM_SIZE 0x240000 /* 1024 * 576 * 4*/ +#define CLIPPING_MEM_SIZE 20000 /* 1024 * 625 / 32 */ +#define I2C_MEM_SIZE 0x000800 /* 2048 */ +#define RPS_MEM_SIZE 0x000800 /* 2048 */ + +/************************************************************************/ +/* UNSORTED */ +/************************************************************************/ + +#define ME1 0x0000000800 +#define PV1 0x0000000008 + +/************************************************************************/ +/* CLIPPING */ +/************************************************************************/ + +/* some defines for the various clipping-modes */ +#define SAA7146_CLIPPING_RECT 0x4 +#define SAA7146_CLIPPING_RECT_INVERTED 0x5 +#define SAA7146_CLIPPING_MASK 0x6 +#define SAA7146_CLIPPING_MASK_INVERTED 0x7 + +/************************************************************************/ +/* RPS */ +/************************************************************************/ + +#define CMD_NOP 0x00000000 /* No operation */ +#define CMD_CLR_EVENT 0x00000000 /* Clear event */ +#define CMD_SET_EVENT 0x10000000 /* Set signal event */ +#define CMD_PAUSE 0x20000000 /* Pause */ +#define CMD_CHECK_LATE 0x30000000 /* Check late */ +#define CMD_UPLOAD 0x40000000 /* Upload */ +#define CMD_STOP 0x50000000 /* Stop */ +#define CMD_INTERRUPT 0x60000000 /* Interrupt */ +#define CMD_JUMP 0x80000000 /* Jump */ +#define CMD_WR_REG 0x90000000 /* Write (load) register */ +#define CMD_RD_REG 0xa0000000 /* Read (store) register */ +#define CMD_WR_REG_MASK 0xc0000000 /* Write register with mask */ + +/************************************************************************/ +/* OUTPUT FORMATS */ +/************************************************************************/ + +/* output formats; each entry holds three types of information */ +/* composed is used in the sense of "not-planar" */ + +#define RGB15_COMPOSED 0x213 +/* this means: yuv2rgb-conversation-mode=2, dither=yes(=1), format-mode = 3 */ +#define RGB16_COMPOSED 0x210 +#define RGB24_COMPOSED 0x201 +#define RGB32_COMPOSED 0x202 + +#define YUV411_COMPOSED 0x003 +/* this means: yuv2rgb-conversation-mode=0, dither=no(=0), format-mode = 3 */ +#define YUV422_COMPOSED 0x000 +#define YUV411_DECOMPOSED 0x00b +#define YUV422_DECOMPOSED 0x009 +#define YUV420_DECOMPOSED 0x00a + +/************************************************************************/ +/* MISC */ +/************************************************************************/ + +/* Bit mask constants */ +#define MASK_00 0x00000001 /* Mask value for bit 0 */ +#define MASK_01 0x00000002 /* Mask value for bit 1 */ +#define MASK_02 0x00000004 /* Mask value for bit 2 */ +#define MASK_03 0x00000008 /* Mask value for bit 3 */ +#define MASK_04 0x00000010 /* Mask value for bit 4 */ +#define MASK_05 0x00000020 /* Mask value for bit 5 */ +#define MASK_06 0x00000040 /* Mask value for bit 6 */ +#define MASK_07 0x00000080 /* Mask value for bit 7 */ +#define MASK_08 0x00000100 /* Mask value for bit 8 */ +#define MASK_09 0x00000200 /* Mask value for bit 9 */ +#define MASK_10 0x00000400 /* Mask value for bit 10 */ +#define MASK_11 0x00000800 /* Mask value for bit 11 */ +#define MASK_12 0x00001000 /* Mask value for bit 12 */ +#define MASK_13 0x00002000 /* Mask value for bit 13 */ +#define MASK_14 0x00004000 /* Mask value for bit 14 */ +#define MASK_15 0x00008000 /* Mask value for bit 15 */ +#define MASK_16 0x00010000 /* Mask value for bit 16 */ +#define MASK_17 0x00020000 /* Mask value for bit 17 */ +#define MASK_18 0x00040000 /* Mask value for bit 18 */ +#define MASK_19 0x00080000 /* Mask value for bit 19 */ +#define MASK_20 0x00100000 /* Mask value for bit 20 */ +#define MASK_21 0x00200000 /* Mask value for bit 21 */ +#define MASK_22 0x00400000 /* Mask value for bit 22 */ +#define MASK_23 0x00800000 /* Mask value for bit 23 */ +#define MASK_24 0x01000000 /* Mask value for bit 24 */ +#define MASK_25 0x02000000 /* Mask value for bit 25 */ +#define MASK_26 0x04000000 /* Mask value for bit 26 */ +#define MASK_27 0x08000000 /* Mask value for bit 27 */ +#define MASK_28 0x10000000 /* Mask value for bit 28 */ +#define MASK_29 0x20000000 /* Mask value for bit 29 */ +#define MASK_30 0x40000000 /* Mask value for bit 30 */ +#define MASK_31 0x80000000 /* Mask value for bit 31 */ + +#define MASK_B0 0x000000ff /* Mask value for byte 0 */ +#define MASK_B1 0x0000ff00 /* Mask value for byte 1 */ +#define MASK_B2 0x00ff0000 /* Mask value for byte 2 */ +#define MASK_B3 0xff000000 /* Mask value for byte 3 */ + +#define MASK_W0 0x0000ffff /* Mask value for word 0 */ +#define MASK_W1 0xffff0000 /* Mask value for word 1 */ + +#define MASK_PA 0xfffffffc /* Mask value for physical address */ +#define MASK_PR 0xfffffffe /* Mask value for protection register */ +#define MASK_ER 0xffffffff /* Mask value for the entire register */ + +#define MASK_NONE 0x00000000 /* No mask */ + +/************************************************************************/ +/* REGISTERS */ +/************************************************************************/ + +#define BASE_ODD1 0x00 /* Video DMA 1 registers */ +#define BASE_EVEN1 0x04 +#define PROT_ADDR1 0x08 +#define PITCH1 0x0C +#define BASE_PAGE1 0x10 /* Video DMA 1 base page */ +#define NUM_LINE_BYTE1 0x14 + +#define BASE_ODD2 0x18 /* Video DMA 2 registers */ +#define BASE_EVEN2 0x1C +#define PROT_ADDR2 0x20 +#define PITCH2 0x24 +#define BASE_PAGE2 0x28 /* Video DMA 2 base page */ +#define NUM_LINE_BYTE2 0x2C + +#define BASE_ODD3 0x30 /* Video DMA 3 registers */ +#define BASE_EVEN3 0x34 +#define PROT_ADDR3 0x38 +#define PITCH3 0x3C +#define BASE_PAGE3 0x40 /* Video DMA 3 base page */ +#define NUM_LINE_BYTE3 0x44 + +#define PCI_BT_V1 0x48 /* Video/FIFO 1 */ +#define PCI_BT_V2 0x49 /* Video/FIFO 2 */ +#define PCI_BT_V3 0x4A /* Video/FIFO 3 */ +#define PCI_BT_DEBI 0x4B /* DEBI */ +#define PCI_BT_A 0x4C /* Audio */ + +#define DD1_INIT 0x50 /* Init setting of DD1 interface */ + +#define DD1_STREAM_B 0x54 /* DD1 B video data stream handling */ +#define DD1_STREAM_A 0x56 /* DD1 A video data stream handling */ + +#define BRS_CTRL 0x58 /* BRS control register */ +#define HPS_CTRL 0x5C /* HPS control register */ +#define HPS_V_SCALE 0x60 /* HPS vertical scale */ +#define HPS_V_GAIN 0x64 /* HPS vertical ACL and gain */ +#define HPS_H_PRESCALE 0x68 /* HPS horizontal prescale */ +#define HPS_H_SCALE 0x6C /* HPS horizontal scale */ +#define BCS_CTRL 0x70 /* BCS control */ +#define CHROMA_KEY_RANGE 0x74 +#define CLIP_FORMAT_CTRL 0x78 /* HPS outputs formats & clipping */ + +#define DEBI_CONFIG 0x7C +#define DEBI_COMMAND 0x80 +#define DEBI_PAGE 0x84 +#define DEBI_AD 0x88 + +#define I2C_TRANSFER 0x8C +#define I2C_STATUS 0x90 + +#define BASE_A1_IN 0x94 /* Audio 1 input DMA */ +#define PROT_A1_IN 0x98 +#define PAGE_A1_IN 0x9C + +#define BASE_A1_OUT 0xA0 /* Audio 1 output DMA */ +#define PROT_A1_OUT 0xA4 +#define PAGE_A1_OUT 0xA8 + +#define BASE_A2_IN 0xAC /* Audio 2 input DMA */ +#define PROT_A2_IN 0xB0 +#define PAGE_A2_IN 0xB4 + +#define BASE_A2_OUT 0xB8 /* Audio 2 output DMA */ +#define PROT_A2_OUT 0xBC +#define PAGE_A2_OUT 0xC0 + +#define RPS_PAGE0 0xC4 /* RPS task 0 page register */ +#define RPS_PAGE1 0xC8 /* RPS task 1 page register */ + +#define RPS_THRESH0 0xCC /* HBI threshold for task 0 */ +#define RPS_THRESH1 0xD0 /* HBI threshold for task 1 */ + +#define RPS_TOV0 0xD4 /* RPS timeout for task 0 */ +#define RPS_TOV1 0xD8 /* RPS timeout for task 1 */ + +#define IER 0xDC /* Interrupt enable register */ + +#define GPIO_CTRL 0xE0 /* GPIO 0-3 register */ + +#define EC1SSR 0xE4 /* Event cnt set 1 source select */ +#define EC2SSR 0xE8 /* Event cnt set 2 source select */ +#define ECT1R 0xEC /* Event cnt set 1 thresholds */ +#define ECT2R 0xF0 /* Event cnt set 2 thresholds */ + +#define ACON1 0xF4 +#define ACON2 0xF8 + +#define MC1 0xFC /* Main control register 1 */ +#define MC2 0x100 /* Main control register 2 */ + +#define RPS_ADDR0 0x104 /* RPS task 0 address register */ +#define RPS_ADDR1 0x108 /* RPS task 1 address register */ + +#define ISR 0x10C /* Interrupt status register */ +#define PSR 0x110 /* Primary status register */ +#define SSR 0x114 /* Secondary status register */ + +#define EC1R 0x118 /* Event counter set 1 register */ +#define EC2R 0x11C /* Event counter set 2 register */ + +#define PCI_VDP1 0x120 /* Video DMA pointer of FIFO 1 */ +#define PCI_VDP2 0x124 /* Video DMA pointer of FIFO 2 */ +#define PCI_VDP3 0x128 /* Video DMA pointer of FIFO 3 */ +#define PCI_ADP1 0x12C /* Audio DMA pointer of audio out 1 */ +#define PCI_ADP2 0x130 /* Audio DMA pointer of audio in 1 */ +#define PCI_ADP3 0x134 /* Audio DMA pointer of audio out 2 */ +#define PCI_ADP4 0x138 /* Audio DMA pointer of audio in 2 */ +#define PCI_DMA_DDP 0x13C /* DEBI DMA pointer */ + +#define LEVEL_REP 0x140, +#define A_TIME_SLOT1 0x180, /* from 180 - 1BC */ +#define A_TIME_SLOT2 0x1C0, /* from 1C0 - 1FC */ + +/************************************************************************/ +/* ISR-MASKS */ +/************************************************************************/ + +#define SPCI_PPEF 0x80000000 /* PCI parity error */ +#define SPCI_PABO 0x40000000 /* PCI access error (target or master abort) */ +#define SPCI_PPED 0x20000000 /* PCI parity error on 'real time data' */ +#define SPCI_RPS_I1 0x10000000 /* Interrupt issued by RPS1 */ +#define SPCI_RPS_I0 0x08000000 /* Interrupt issued by RPS0 */ +#define SPCI_RPS_LATE1 0x04000000 /* RPS task 1 is late */ +#define SPCI_RPS_LATE0 0x02000000 /* RPS task 0 is late */ +#define SPCI_RPS_E1 0x01000000 /* RPS error from task 1 */ +#define SPCI_RPS_E0 0x00800000 /* RPS error from task 0 */ +#define SPCI_RPS_TO1 0x00400000 /* RPS timeout task 1 */ +#define SPCI_RPS_TO0 0x00200000 /* RPS timeout task 0 */ +#define SPCI_UPLD 0x00100000 /* RPS in upload */ +#define SPCI_DEBI_S 0x00080000 /* DEBI status */ +#define SPCI_DEBI_E 0x00040000 /* DEBI error */ +#define SPCI_IIC_S 0x00020000 /* I2C status */ +#define SPCI_IIC_E 0x00010000 /* I2C error */ +#define SPCI_A2_IN 0x00008000 /* Audio 2 input DMA protection / limit */ +#define SPCI_A2_OUT 0x00004000 /* Audio 2 output DMA protection / limit */ +#define SPCI_A1_IN 0x00002000 /* Audio 1 input DMA protection / limit */ +#define SPCI_A1_OUT 0x00001000 /* Audio 1 output DMA protection / limit */ +#define SPCI_AFOU 0x00000800 /* Audio FIFO over- / underflow */ +#define SPCI_V_PE 0x00000400 /* Video protection address */ +#define SPCI_VFOU 0x00000200 /* Video FIFO over- / underflow */ +#define SPCI_FIDA 0x00000100 /* Field ID video port A */ +#define SPCI_FIDB 0x00000080 /* Field ID video port B */ +#define SPCI_PIN3 0x00000040 /* GPIO pin 3 */ +#define SPCI_PIN2 0x00000020 /* GPIO pin 2 */ +#define SPCI_PIN1 0x00000010 /* GPIO pin 1 */ +#define SPCI_PIN0 0x00000008 /* GPIO pin 0 */ +#define SPCI_ECS 0x00000004 /* Event counter 1, 2, 4, 5 */ +#define SPCI_EC3S 0x00000002 /* Event counter 3 */ +#define SPCI_EC0S 0x00000001 /* Event counter 0 */ + +/************************************************************************/ +/* I2C */ +/************************************************************************/ + +/* time we wait after certain i2c-operations */ +#define SAA7146_I2C_DELAY 10 + +#define SAA7146_I2C_ABORT (1<<7) +#define SAA7146_I2C_SPERR (1<<6) +#define SAA7146_I2C_APERR (1<<5) +#define SAA7146_I2C_DTERR (1<<4) +#define SAA7146_I2C_DRERR (1<<3) +#define SAA7146_I2C_AL (1<<2) +#define SAA7146_I2C_ERR (1<<1) +#define SAA7146_I2C_BUSY (1<<0) + +#define SAA7146_I2C_START (0x3) +#define SAA7146_I2C_CONT (0x2) +#define SAA7146_I2C_STOP (0x1) +#define SAA7146_I2C_NOP (0x0) + +#define SAA7146_I2C_BUS_BIT_RATE_6400 (0x500) +#define SAA7146_I2C_BUS_BIT_RATE_3200 (0x100) +#define SAA7146_I2C_BUS_BIT_RATE_480 (0x400) +#define SAA7146_I2C_BUS_BIT_RATE_320 (0x600) +#define SAA7146_I2C_BUS_BIT_RATE_240 (0x700) +#define SAA7146_I2C_BUS_BIT_RATE_120 (0x000) +#define SAA7146_I2C_BUS_BIT_RATE_80 (0x200) +#define SAA7146_I2C_BUS_BIT_RATE_60 (0x300) + + +#endif diff --git a/drivers/media/dvb/av7110/saa7146_v4l.c b/drivers/media/dvb/av7110/saa7146_v4l.c new file mode 100644 index 000000000000..387d0fe4b267 --- /dev/null +++ b/drivers/media/dvb/av7110/saa7146_v4l.c @@ -0,0 +1,502 @@ +/* + video4linux-parts of the saa7146 device driver + + Copyright (C) 1998,1999 Michael Hunold <michael@mihu.de> + + 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 <linux/module.h> /* for module-version */ +#include <linux/string.h> +#include <linux/slab.h> /* for kmalloc/kfree */ +#include <linux/delay.h> /* for delay-stuff */ +#include <asm/uaccess.h> /* for copy_to/from_user */ +#include <linux/wrapper.h> /* for mem_map_reserve */ +#include <linux/vmalloc.h> +#include <linux/videodev.h> + +#include "saa7146_defs.h" +#include "saa7146_core.h" +#include "saa7146_v4l.h" + + +static int saa7146_v4l_debug = 0; + +#define dprintk if (saa7146_v4l_debug) printk +#define hprintk if (saa7146_v4l_debug >= 2) printk +#define gprintk if (saa7146_v4l_debug >= 3) printk + +#define __COMPILE_SAA7146__ +#include "saa7146.c" + +/* transform video4linux-cliplist to plain arrays -- we assume that the arrays + are big enough -- if not: your fault! */ +int saa7146_v4lclip2plain(struct video_clip *clips, u16 clipcount, int x[], int y[], int width[], int height[]) +{ + int i = 0; + struct video_clip* vc = NULL; + + dprintk("saa7146_v4l.o: ==> saa7146_v4lclip2plain, cc:%d\n",clipcount); + + /* anything to do here? */ + if( 0 == clipcount ) + return 0; + + /* copy to kernel-space */ + vc = vmalloc(sizeof(struct video_clip)*(clipcount)); + if( NULL == vc ) { + printk("saa7146_v4l.o: ==> v4lclip2saa7146_v4l.o: no memory #2!\n"); + return -ENOMEM; + } + if(copy_from_user(vc,clips,sizeof(struct video_clip)*clipcount)) { + printk("saa7146_v4l.o: ==> v4lclip2saa7146_v4l.o: could not copy from user-space!\n"); + return -EFAULT; + } + + /* copy the clip-list to the arrays + note: the video_clip-struct may contain negative values to indicate that a window + doesn't lay completly over the video window. Thus, we correct the values right here */ + for(i = 0; i < clipcount; i++) { + + if( vc[i].width < 0) { + vc[i].x += vc[i].width; vc[i].width = -vc[i].width; + } + if( vc[i].height < 0) { + vc[i].y += vc[i].height; vc[i].height = -vc[i].height; + } + + if( vc[i].x < 0) { + vc[i].width += vc[i].x; vc[i].x = 0; + } + if( vc[i].y < 0) { + vc[i].height += vc[i].y; vc[i].y = 0; + } + + if(vc[i].width <= 0 || vc[i].height <= 0) { + vfree(vc); + return -EINVAL; + } + + x[i] = vc[i].x; + y[i] = vc[i].y; + width[i] = vc[i].width; + height[i] = vc[i].height; + } + + /* free memory used for temporary clips */ + vfree(vc); + + return 0; +} + +struct saa7146_v4l_struct { + struct video_buffer buffer; + struct video_mbuf mbuf; + struct video_window window; + struct video_picture picture; +}; + +static int saa7146_v4l_command(struct saa7146* saa, void *p, unsigned int cmd, void *arg) +{ + struct saa7146_v4l_struct* data = (struct saa7146_v4l_struct*)p; + + hprintk("saa7146_v4l.o: ==> saa7146_v4l_command\n"); + + if( NULL == saa) + return -EINVAL; + + switch(cmd) { + case SAA7146_V4L_GPICT: + { + struct video_picture *p = arg; + + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_GPICT\n"); + + memcpy(p, &data->picture, sizeof(struct video_picture)); + + } + break; + + case SAA7146_V4L_SPICT: + { + struct video_picture *p = arg; + + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_SPICT\n"); + + memcpy(&data->picture, p, sizeof(struct video_picture)); + set_picture_prop(saa, (u32)(data->picture.brightness>>8),(u32)(data->picture.contrast>>9),(u32)(data->picture.colour>>9)); + + } + break; + + case SAA7146_V4L_SWIN: + { + struct video_window *vw = arg; + int *x = NULL, *y = NULL, *w = NULL, *h = NULL; + + u32 palette = 0; + + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_SWIN\n"); + + video_setmode(saa, 0); + saa7146_write(saa->mem, MC1, (MASK_21)); + + set_window(saa, vw->width, vw->height,0,0,0); + //saa->port, saa->sync); + if (move_to(saa, vw->x, vw->y, vw->height, data->buffer.width, + data->buffer.depth, data->buffer.bytesperline, + (u32)data->buffer.base, 0)<0) + return -1; + + switch( data->picture.palette ) { + + case VIDEO_PALETTE_RGB555: + palette = RGB15_COMPOSED; + break; + + case VIDEO_PALETTE_RGB24: + palette = RGB24_COMPOSED; + break; + + case VIDEO_PALETTE_RGB32: + palette = RGB32_COMPOSED; + break; + + case VIDEO_PALETTE_UYVY: + palette = YUV422_COMPOSED; + break; + + case VIDEO_PALETTE_YUV422P: + palette = YUV422_DECOMPOSED; + break; + + case VIDEO_PALETTE_YUV420P: + palette = YUV420_DECOMPOSED; + break; + + case VIDEO_PALETTE_YUV411P: + palette = YUV411_DECOMPOSED; + break; + + default: + /*case VIDEO_PALETTE_RGB565:*/ + palette = RGB16_COMPOSED; + break; + } + + set_output_format(saa, palette); + + if (vw->flags==VIDEO_CLIP_BITMAP) { + clip_windows(saa, SAA7146_CLIPPING_MASK, vw->width, vw->height, + (u32 *) vw->clips, 1, 0, 0, 0, 0); + } else { + + + /* this is tricky, but helps us saving kmalloc/kfree-calls + and boring if/else-constructs ... */ + x = (int*)kmalloc(sizeof(int)*vw->clipcount*4,GFP_KERNEL); + if( NULL == x ) { + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_SWIN: out of kernel-memory.\n"); + return -ENOMEM; + } + y = x+(1*vw->clipcount); + w = x+(2*vw->clipcount); + h = x+(3*vw->clipcount); + + /* transform clipping-windows */ + if (0 != saa7146_v4lclip2plain(vw->clips, vw->clipcount,x,y,w,h)) + break; + clip_windows(saa, SAA7146_CLIPPING_RECT, vw->width, vw->height, + NULL, vw->clipcount, x, y, w, h); + kfree(x); + + memcpy(&data->window, arg, sizeof(struct video_window)); + } + video_setmode(saa, 1); + break; + } + + case SAA7146_V4L_CCAPTURE: + { + int* i = arg; + + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_CCAPTURE\n"); + + if ( 0 == *i ) { + video_setmode(saa, 0); + } + else { + video_setmode(saa, 1); + } + + break; + } + + case SAA7146_V4L_GFBUF: + { + struct video_buffer *b = arg; + + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_GFBUF\n"); + + memcpy(b, &data->buffer, sizeof(struct video_buffer)); + + break; + } + + case SAA7146_V4L_SFBUF: + { + struct video_buffer *b = arg; + + memcpy(&data->buffer, b, sizeof(struct video_buffer)); + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_SFBUF: b:0x%08x, h:%d, w:%d, d:%d\n", (u32)data->buffer.base, data->buffer.height, data->buffer.width, data->buffer.depth); + + break; + } + + + case SAA7146_V4L_CSYNC: + { + int i = *((int*)arg); + + int count = 0, k = 0; + unsigned char* grabbfr; + unsigned char y, uv; + + /* sanity checks */ + if ( i >= saa->buffers || i < 0) { + gprintk("saa7146_v4l.o: SAA7146_V4L_CSYNC, invalid buffer %d\n",i); + return -EINVAL; + } + + /* get the state */ + switch ( saa->frame_stat[i] ) { + case GBUFFER_UNUSED: + { + /* there was no grab to this buffer */ + gprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_CSYNC, invalid frame (fr:%d)\n",i); + return -EINVAL; + } + case GBUFFER_GRABBING: + { + /* wait to be woken up by the irq-handler */ + interruptible_sleep_on(&saa->rps0_wq); + break; + } + case GBUFFER_DONE: + { + gprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_CSYNC, frame done! (fr:%d)\n",i); + break; + } + } + + /* all saa7146´s below chip-revision 3 are not capable of + doing byte-swaps with video-dma1. for rgb-grabbing this + does not matter, but yuv422-grabbing has the wrong + byte-order, so we have to swap in software */ + if ( ( saa->revision<3) && + (saa->grab_format[i] == YUV422_COMPOSED)) { + /* swap UYVY to YUYV */ + count = saa->grab_height[i]*saa->grab_width[i]*2; + grabbfr = ((unsigned char*)(saa->grabbing))+i*GRABBING_MEM_SIZE; + for (k=0; k<count; k=k+2) { + y = grabbfr[k+1]; + uv = grabbfr[k]; + grabbfr[k] = y; + grabbfr[k+1] = uv; + } + } + + /* set corresponding buffer to ´unused´ */ + saa->frame_stat[i] = GBUFFER_UNUSED; +printk ("saa7146_v4l.o: SAA7146_V4L_CSYNC, frame %i done.\n", i); + + break; + } + case SAA7146_V4L_CMCAPTURE: + { + struct video_mmap *vm = arg; + + gprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_CMCAPTURE, trying buffer:%d\n", vm->frame); + + /* check status for wanted frame */ + if ( GBUFFER_GRABBING == saa->frame_stat[vm->frame] ) { + gprintk("saa7146_v4l.o: frame #%d still grabbing!\n",vm->frame); + return -EBUSY; + } + + /* do necessary transformations from the videodev-structure to our own format. */ + + /* sanity checks */ + if ( vm->width <= 0 || vm->height <= 0 ) { + gprintk("saa7146_v4l.o: set_up_grabbing, invalid dimension for wanted buffer %d\n",vm->frame); + return -EINVAL; + } + + /* set corresponding buffer to ´grabbing´ */ + saa->frame_stat[vm->frame] = GBUFFER_GRABBING; + + /* copy grabbing informtaion for the buffer */ + saa->grab_height[vm->frame] = vm->height; + saa->grab_width[vm->frame] = vm->width; + /* fixme: setting of grabbing port ?!*/ + saa->grab_port[vm->frame] = 0; + + switch( vm->format ) { + + case VIDEO_PALETTE_RGB555: + saa->grab_format[vm->frame] = RGB15_COMPOSED; + break; + + case VIDEO_PALETTE_RGB24: + saa->grab_format[vm->frame] = RGB24_COMPOSED; + break; + + case VIDEO_PALETTE_RGB32: + saa->grab_format[vm->frame] = RGB32_COMPOSED; + break; + + case VIDEO_PALETTE_YUV420P: + return -EINVAL; + + case VIDEO_PALETTE_YUV422: + saa->grab_format[vm->frame] = YUV422_COMPOSED; + break; + + case VIDEO_PALETTE_YUV422P: + saa->grab_format[vm->frame] = YUV422_DECOMPOSED; + break; + + case VIDEO_PALETTE_YUV411P: + saa->grab_format[vm->frame] = YUV411_DECOMPOSED; + break; + + default: + /*case VIDEO_PALETTE_RGB565:*/ + saa->grab_format[vm->frame] = RGB16_COMPOSED; + break; + } + + set_up_grabbing(saa,vm->frame); + break; + } + case SAA7146_V4L_GMBUF: + { + struct video_mbuf *m = arg; + int i = 0; + + m->size = saa->buffers * GRABBING_MEM_SIZE; + m->frames = saa->buffers; + + for(i = 0; i < saa->buffers; i++) + m->offsets[i]=(i*GRABBING_MEM_SIZE); + + gprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_GMBUF, providing %d buffers.\n", saa->buffers); + + break; + } + + default: + return -ENOIOCTLCMD; + } + + return 0; +} + +int saa7146_v4l_attach(struct saa7146* adap, void** p) +{ + struct saa7146_v4l_struct* data; + + hprintk("saa7146_v4l.o: ==> saa7146_v4l_inc_use_attach\n"); + + if (!(data = kmalloc(sizeof(struct saa7146_v4l_struct), GFP_KERNEL))) { + printk (KERN_ERR "%s: out of memory!\n", __FUNCTION__); + return -ENOMEM; + } + *(struct saa7146_v4l_struct**)p = data; + + memset(&data->buffer, 0x0, sizeof(struct video_buffer)); + memset(&data->mbuf, 0x0, sizeof(struct video_mbuf)); + memset(&data->window, 0x0, sizeof(struct video_window)); + memset(&data->picture,0x0, sizeof(struct video_picture)); + + data->picture.brightness = 32768; + data->picture.contrast = 32768; + data->picture.colour = 32768; /* saturation */ + data->picture.depth = 16; + data->picture.palette = VIDEO_PALETTE_RGB565; + + return 0; +} + + +void saa7146_v4l_inc_use(struct saa7146* adap) +{ + MOD_INC_USE_COUNT; +} + + +int saa7146_v4l_detach(struct saa7146* adap, void** p) +{ + struct saa7146_v4l_struct** data = (struct saa7146_v4l_struct**)p; + + kfree(*data); + *data = NULL; + + return 0; +} + + +void saa7146_v4l_dec_use(struct saa7146* adap) +{ + MOD_DEC_USE_COUNT; +} + + +static struct saa7146_extension saa7146_v4l_extension = { + "v4l extension\0", + MASK_27, /* handles rps0 irqs */ + saa7146_std_grab_irq_callback_rps0, + saa7146_v4l_command, + saa7146_v4l_attach, + saa7146_v4l_detach, + saa7146_v4l_inc_use, + saa7146_v4l_dec_use +}; + + +int saa7146_v4l_init (void) +{ + int res = 0; + + if((res = saa7146_add_extension(&saa7146_v4l_extension))) { + printk("saa7146_v4l.o: extension registration failed, module not inserted.\n"); + return res; + } + + return 0; +} + + +void saa7146_v4l_exit (void) +{ + int res = 0; + if ((res = saa7146_del_extension(&saa7146_v4l_extension))) { + printk("saa7146_v4l.o: extension deregistration failed, module not removed.\n"); + } +} + +MODULE_PARM(saa7146_v4l_debug, "i"); +MODULE_PARM_DESC(saa7146_v4l_debug, "set saa7146_v4l.c in debug mode"); + diff --git a/drivers/media/dvb/av7110/saa7146_v4l.h b/drivers/media/dvb/av7110/saa7146_v4l.h new file mode 100644 index 000000000000..b9236252e4ac --- /dev/null +++ b/drivers/media/dvb/av7110/saa7146_v4l.h @@ -0,0 +1,32 @@ +#ifndef __INCLUDED_SAA7146_V4L_V4L__ +#define __INCLUDED_SAA7146_V4L_V4L__ + +/************************************************************************/ +/* ADDRESSING */ +/************************************************************************/ + +#define SAA7146_V4L_BASE 100 + +#define SAA7146_V4L_GPICT _IOW('d', (SAA7146_V4L_BASE+ 1), struct video_picture) +#define SAA7146_V4L_SPICT _IOW('d', (SAA7146_V4L_BASE+ 2), struct video_picture) + +#define SAA7146_V4L_GFBUF _IOW('d', (SAA7146_V4L_BASE+ 3), struct video_buffer) +#define SAA7146_V4L_SFBUF _IOW('d', (SAA7146_V4L_BASE+ 4), struct video_buffer) + +#define SAA7146_V4L_GMBUF _IOW('d', (SAA7146_V4L_BASE+ 5), struct video_mbuf) + +#define SAA7146_V4L_SWIN _IOW('d', (SAA7146_V4L_BASE+ 6), struct video_window) + +#define SAA7146_V4L_CCAPTURE _IOW('d', (SAA7146_V4L_BASE+ 7), int) + +#define SAA7146_V4L_CMCAPTURE _IOW('d', (SAA7146_V4L_BASE+ 8), struct video_mmap) +#define SAA7146_V4L_CSYNC _IOW('d', (SAA7146_V4L_BASE+ 9), int) +#define SAA7146_V4L_CGSTATUS _IOW('d', (SAA7146_V4L_BASE+10), int) + +#define SAA7146_V4L_TSCAPTURE _IOW('d', (SAA7146_V4L_BASE+11), int) + +extern int saa7146_v4l_init (void); +extern void saa7146_v4l_exit (void); + +#endif + diff --git a/drivers/media/dvb/dvb-core/Config.help b/drivers/media/dvb/dvb-core/Config.help new file mode 100644 index 000000000000..ad3c23d740fe --- /dev/null +++ b/drivers/media/dvb/dvb-core/Config.help @@ -0,0 +1,13 @@ +CONFIG_DVB_CORE + DVB core utility functions for device handling, software fallbacks etc. + + Say Y when you have a DVB card and want to use it. If unsure say N. + + +CONFIG_DVB_DEVFS_ONLY + Drop support for old major/minor device scheme and support only devfs + systems. This saves some code. + + If unsure say N. + + diff --git a/drivers/media/dvb/dvb-core/Config.in b/drivers/media/dvb/dvb-core/Config.in new file mode 100644 index 000000000000..9c43c6498cf3 --- /dev/null +++ b/drivers/media/dvb/dvb-core/Config.in @@ -0,0 +1,7 @@ + +dep_tristate ' DVB Core Support' CONFIG_DVB_CORE $CONFIG_DVB + +if [ "$CONFIG_DVB_CORE" != "n" ]; then + dep_bool ' devfs only' CONFIG_DVB_DEVFS_ONLY $CONFIG_DVB_CORE $CONFIG_DEVFS_FS +fi + diff --git a/drivers/media/dvb/dvb-core/Makefile b/drivers/media/dvb/dvb-core/Makefile new file mode 100644 index 000000000000..a32a5f5530d5 --- /dev/null +++ b/drivers/media/dvb/dvb-core/Makefile @@ -0,0 +1,13 @@ +# +# Makefile for the kernel DVB device drivers. +# + +export-objs := dvb_ksyms.o + +dvb-core-objs = dvbdev.o dmxdev.o dvb_demux.o dvb_filter.o \ + dvb_frontend.o dvb_i2c.o dvb_net.o dvb_ksyms.o + +obj-$(CONFIG_DVB_CORE) += dvb-core.o + +include $(TOPDIR)/Rules.make + diff --git a/drivers/media/dvb/dvb-core/compat.h b/drivers/media/dvb/dvb-core/compat.h new file mode 100644 index 000000000000..25af8145b295 --- /dev/null +++ b/drivers/media/dvb/dvb-core/compat.h @@ -0,0 +1,24 @@ +#ifndef __CRAP_H +#define __CRAP_H + +/** + * compatibility crap for old kernels. No guarantee for a working driver + * even when everything compiles. + */ + + +#include <linux/module.h> +#include <linux/list.h> + +#ifndef MODULE_LICENSE +#define MODULE_LICENSE(x) +#endif + +#ifndef list_for_each_safe +#define list_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) +#endif + +#endif + diff --git a/drivers/media/dvb/dvb-core/demux.h b/drivers/media/dvb/dvb-core/demux.h new file mode 100644 index 000000000000..ce769ebf1e47 --- /dev/null +++ b/drivers/media/dvb/dvb-core/demux.h @@ -0,0 +1,301 @@ +/* demux.h + * + * Copyright (c) 2002 Convergence GmbH + * + * based on code: + * Copyright (c) 2000 Nokia Research Center + * Tampere, FINLAND + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __DEMUX_H +#define __DEMUX_H + +#ifndef __KERNEL__ +#define __KERNEL__ +#endif + +#include <linux/types.h> +#include <linux/list.h> +#include <linux/time.h> +#include <linux/errno.h> + +/*--------------------------------------------------------------------------*/ +/* Common definitions */ +/*--------------------------------------------------------------------------*/ + +/* + * DMX_MAX_FILTER_SIZE: Maximum length (in bytes) of a section/PES filter. + */ + +#ifndef DMX_MAX_FILTER_SIZE +#define DMX_MAX_FILTER_SIZE 18 +#endif + +/* + * dmx_success_t: Success codes for the Demux Callback API. + */ + +typedef enum { + DMX_OK = 0, /* Received Ok */ + DMX_LENGTH_ERROR, /* Incorrect length */ + DMX_OVERRUN_ERROR, /* Receiver ring buffer overrun */ + DMX_CRC_ERROR, /* Incorrect CRC */ + DMX_FRAME_ERROR, /* Frame alignment error */ + DMX_FIFO_ERROR, /* Receiver FIFO overrun */ + DMX_MISSED_ERROR /* Receiver missed packet */ +} dmx_success_t; + +/*--------------------------------------------------------------------------*/ +/* TS packet reception */ +/*--------------------------------------------------------------------------*/ + +/* TS filter type for set() */ + +#define TS_PACKET 1 /* send TS packets (188 bytes) to callback (default) */ +#define TS_PAYLOAD_ONLY 2 /* in case TS_PACKET is set, only send the TS + payload (<=184 bytes per packet) to callback */ +#define TS_DECODER 4 /* send stream to built-in decoder (if present) */ + +/* PES type for filters which write to built-in decoder */ +/* these should be kept identical to the types in dmx.h */ + +typedef enum +{ /* also send packets to decoder (if it exists) */ + DMX_TS_PES_AUDIO0, + DMX_TS_PES_VIDEO0, + DMX_TS_PES_TELETEXT0, + DMX_TS_PES_SUBTITLE0, + DMX_TS_PES_PCR0, + + DMX_TS_PES_AUDIO1, + DMX_TS_PES_VIDEO1, + DMX_TS_PES_TELETEXT1, + DMX_TS_PES_SUBTITLE1, + DMX_TS_PES_PCR1, + + DMX_TS_PES_AUDIO2, + DMX_TS_PES_VIDEO2, + DMX_TS_PES_TELETEXT2, + DMX_TS_PES_SUBTITLE2, + DMX_TS_PES_PCR2, + + DMX_TS_PES_AUDIO3, + DMX_TS_PES_VIDEO3, + DMX_TS_PES_TELETEXT3, + DMX_TS_PES_SUBTITLE3, + DMX_TS_PES_PCR3, + + DMX_TS_PES_OTHER +} dmx_ts_pes_t; + +#define DMX_TS_PES_AUDIO DMX_TS_PES_AUDIO0 +#define DMX_TS_PES_VIDEO DMX_TS_PES_VIDEO0 +#define DMX_TS_PES_TELETEXT DMX_TS_PES_TELETEXT0 +#define DMX_TS_PES_SUBTITLE DMX_TS_PES_SUBTITLE0 +#define DMX_TS_PES_PCR DMX_TS_PES_PCR0 + + +struct dmx_ts_feed_s { + int is_filtering; /* Set to non-zero when filtering in progress */ + struct dmx_demux_s *parent; /* Back-pointer */ + void *priv; /* Pointer to private data of the API client */ + int (*set) (struct dmx_ts_feed_s *feed, + uint16_t pid, + int type, + dmx_ts_pes_t pes_type, + size_t callback_length, + size_t circular_buffer_size, + int descramble, + struct timespec timeout); + int (*start_filtering) (struct dmx_ts_feed_s* feed); + int (*stop_filtering) (struct dmx_ts_feed_s* feed); +}; + +typedef struct dmx_ts_feed_s dmx_ts_feed_t; + +/*--------------------------------------------------------------------------*/ +/* Section reception */ +/*--------------------------------------------------------------------------*/ + +typedef struct { + __u8 filter_value [DMX_MAX_FILTER_SIZE]; + __u8 filter_mask [DMX_MAX_FILTER_SIZE]; + __u8 filter_mode [DMX_MAX_FILTER_SIZE]; + struct dmx_section_feed_s* parent; /* Back-pointer */ + void* priv; /* Pointer to private data of the API client */ +} dmx_section_filter_t; + +struct dmx_section_feed_s { + int is_filtering; /* Set to non-zero when filtering in progress */ + struct dmx_demux_s* parent; /* Back-pointer */ + void* priv; /* Pointer to private data of the API client */ + int (*set) (struct dmx_section_feed_s* feed, + __u16 pid, + size_t circular_buffer_size, + int descramble, + int check_crc); + int (*allocate_filter) (struct dmx_section_feed_s* feed, + dmx_section_filter_t** filter); + int (*release_filter) (struct dmx_section_feed_s* feed, + dmx_section_filter_t* filter); + int (*start_filtering) (struct dmx_section_feed_s* feed); + int (*stop_filtering) (struct dmx_section_feed_s* feed); +}; +typedef struct dmx_section_feed_s dmx_section_feed_t; + +/*--------------------------------------------------------------------------*/ +/* Callback functions */ +/*--------------------------------------------------------------------------*/ + +typedef int (*dmx_ts_cb) ( __u8 * buffer1, + size_t buffer1_length, + __u8 * buffer2, + size_t buffer2_length, + dmx_ts_feed_t* source, + dmx_success_t success); + +typedef int (*dmx_section_cb) ( __u8 * buffer1, + size_t buffer1_len, + __u8 * buffer2, + size_t buffer2_len, + dmx_section_filter_t * source, + dmx_success_t success); + +/*--------------------------------------------------------------------------*/ +/* DVB Front-End */ +/*--------------------------------------------------------------------------*/ + +typedef enum { + DMX_MEMORY_FE, + DMX_FRONTEND_0, + DMX_FRONTEND_1, + DMX_FRONTEND_2, + DMX_FRONTEND_3, + DMX_STREAM_0, /* external stream input, e.g. LVDS */ + DMX_STREAM_1, + DMX_STREAM_2, + DMX_STREAM_3 +} dmx_frontend_source_t; + +typedef struct { + /* The following char* fields point to NULL terminated strings */ + char* id; /* Unique front-end identifier */ + char* vendor; /* Name of the front-end vendor */ + char* model; /* Name of the front-end model */ + struct list_head connectivity_list; /* List of front-ends that can + be connected to a particular + demux */ + void* priv; /* Pointer to private data of the API client */ + dmx_frontend_source_t source; +} dmx_frontend_t; + +/*--------------------------------------------------------------------------*/ +/* MPEG-2 TS Demux */ +/*--------------------------------------------------------------------------*/ + +/* + * Flags OR'ed in the capabilites field of struct dmx_demux_s. + */ + +#define DMX_TS_FILTERING 1 +#define DMX_PES_FILTERING 2 +#define DMX_SECTION_FILTERING 4 +#define DMX_MEMORY_BASED_FILTERING 8 /* write() available */ +#define DMX_CRC_CHECKING 16 +#define DMX_TS_DESCRAMBLING 32 +#define DMX_SECTION_PAYLOAD_DESCRAMBLING 64 +#define DMX_MAC_ADDRESS_DESCRAMBLING 128 + +/* + * Demux resource type identifier. +*/ + +/* + * DMX_FE_ENTRY(): Casts elements in the list of registered + * front-ends from the generic type struct list_head + * to the type * dmx_frontend_t + *. +*/ + +#define DMX_FE_ENTRY(list) list_entry(list, dmx_frontend_t, connectivity_list) + +struct dmx_demux_s { + /* The following char* fields point to NULL terminated strings */ + char* id; /* Unique demux identifier */ + char* vendor; /* Name of the demux vendor */ + char* model; /* Name of the demux model */ + __u32 capabilities; /* Bitfield of capability flags */ + dmx_frontend_t* frontend; /* Front-end connected to the demux */ + struct list_head reg_list; /* List of registered demuxes */ + void* priv; /* Pointer to private data of the API client */ + int users; /* Number of users */ + int (*open) (struct dmx_demux_s* demux); + int (*close) (struct dmx_demux_s* demux); + int (*write) (struct dmx_demux_s* demux, const char* buf, size_t count); + int (*allocate_ts_feed) (struct dmx_demux_s* demux, + dmx_ts_feed_t** feed, + dmx_ts_cb callback); + int (*release_ts_feed) (struct dmx_demux_s* demux, + dmx_ts_feed_t* feed); + int (*allocate_section_feed) (struct dmx_demux_s* demux, + dmx_section_feed_t** feed, + dmx_section_cb callback); + int (*release_section_feed) (struct dmx_demux_s* demux, + dmx_section_feed_t* feed); + int (*descramble_mac_address) (struct dmx_demux_s* demux, + __u8* buffer1, + size_t buffer1_length, + __u8* buffer2, + size_t buffer2_length, + __u16 pid); + int (*descramble_section_payload) (struct dmx_demux_s* demux, + __u8* buffer1, + size_t buffer1_length, + __u8* buffer2, size_t buffer2_length, + __u16 pid); + int (*add_frontend) (struct dmx_demux_s* demux, + dmx_frontend_t* frontend); + int (*remove_frontend) (struct dmx_demux_s* demux, + dmx_frontend_t* frontend); + struct list_head* (*get_frontends) (struct dmx_demux_s* demux); + int (*connect_frontend) (struct dmx_demux_s* demux, + dmx_frontend_t* frontend); + int (*disconnect_frontend) (struct dmx_demux_s* demux); + + int (*get_pes_pids) (struct dmx_demux_s* demux, __u16 *pids); +}; +typedef struct dmx_demux_s dmx_demux_t; + +/*--------------------------------------------------------------------------*/ +/* Demux directory */ +/*--------------------------------------------------------------------------*/ + +/* + * DMX_DIR_ENTRY(): Casts elements in the list of registered + * demuxes from the generic type struct list_head* to the type dmx_demux_t + *. + */ + +#define DMX_DIR_ENTRY(list) list_entry(list, dmx_demux_t, reg_list) + +int dmx_register_demux (dmx_demux_t* demux); +int dmx_unregister_demux (dmx_demux_t* demux); +struct list_head* dmx_get_demuxes (void); + +#endif /* #ifndef __DEMUX_H */ + diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c new file mode 100644 index 000000000000..d388a1b6254c --- /dev/null +++ b/drivers/media/dvb/dvb-core/dmxdev.c @@ -0,0 +1,1113 @@ +/* + * dmxdev.c - DVB demultiplexer device + * + * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de> + * & Marcus Metzler <marcus@convergence.de> + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include <linux/vmalloc.h> +#include <linux/module.h> +#include <linux/poll.h> +#include <asm/uaccess.h> + +#include "dmxdev.h" + + +//MODULE_DESCRIPTION(""); +//MODULE_AUTHOR("Ralph Metzler, Marcus Metzler"); +//#ifdef MODULE_LICENSE +//MODULE_LICENSE("GPL"); +//#endif +MODULE_PARM(debug,"i"); +static int debug = 0; + +#define dprintk if (debug) printk + +inline dmxdev_filter_t * +DmxDevFile2Filter(struct file *file) +{ + return (dmxdev_filter_t *) file->private_data; +} + +inline dmxdev_dvr_t * +DmxDevFile2DVR(dmxdev_t *dmxdev, struct file *file) +{ + return (dmxdev_dvr_t *) file->private_data; +} + +static inline void +DmxDevBufferInit(dmxdev_buffer_t *buffer) +{ + buffer->data=0; + buffer->size=8192; + buffer->pread=0; + buffer->pwrite=0; + buffer->error=0; + init_waitqueue_head(&buffer->queue); +} + +static inline int +DmxDevBufferWrite(dmxdev_buffer_t *buf, uint8_t *src, int len) +{ + int split; + int free; + int todo; + + if (!len) + return 0; + if (!buf->data) + return 0; + + free=buf->pread-buf->pwrite; + split=0; + if (free<=0) { + free+=buf->size; + split=buf->size-buf->pwrite; + } + if (len>=free) { + dprintk("dmxdev: buffer overflow\n"); + return -1; + } + if (split>=len) + split=0; + todo=len; + if (split) { + memcpy(buf->data + buf->pwrite, src, split); + todo-=split; + buf->pwrite=0; + } + memcpy(buf->data + buf->pwrite, src+split, todo); + buf->pwrite=(buf->pwrite+todo)%buf->size; + return len; +} + +static ssize_t +DmxDevBufferRead(dmxdev_buffer_t *src, int non_blocking, + char *buf, size_t count, loff_t *ppos) +{ + unsigned long todo=count; + int split, avail, error; + + if (!src->data) + return 0; + + if ((error=src->error)) { + src->error=0; + return error; + } + + if (non_blocking && (src->pwrite==src->pread)) + return -EWOULDBLOCK; + + while (todo>0) { + if (non_blocking && (src->pwrite==src->pread)) + return (count-todo) ? (count-todo) : -EWOULDBLOCK; + + if (wait_event_interruptible(src->queue, + (src->pread!=src->pwrite) || + (src->error))<0) + return count-todo; + + if ((error=src->error)) { + src->error=0; + return error; + } + + split=src->size; + avail=src->pwrite - src->pread; + if (avail<0) { + avail+=src->size; + split=src->size - src->pread; + } + if (avail>todo) + avail=todo; + if (split<avail) { + if (copy_to_user(buf, src->data+src->pread, split)) + return -EFAULT; + buf+=split; + src->pread=0; + todo-=split; + avail-=split; + } + if (avail) { + if (copy_to_user(buf, src->data+src->pread, avail)) + return -EFAULT; + src->pread = (src->pread + avail) % src->size; + todo-=avail; + buf+=avail; + } + } + return count; +} + +static dmx_frontend_t * +get_fe(dmx_demux_t *demux, int type) +{ + struct list_head *head, *pos; + + head=demux->get_frontends(demux); + if (!head) + return 0; + list_for_each(pos, head) + if (DMX_FE_ENTRY(pos)->source==type) + return DMX_FE_ENTRY(pos); + + return 0; +} + +static inline void +DmxDevDVRStateSet(dmxdev_dvr_t *dmxdevdvr, int state) +{ + spin_lock_irq(&dmxdevdvr->dev->lock); + dmxdevdvr->state=state; + spin_unlock_irq(&dmxdevdvr->dev->lock); +} + +static int dvb_dvr_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + dmx_frontend_t *front; + + dprintk ("function : %s\n", __FUNCTION__); + + if (down_interruptible (&dmxdev->mutex)) + return -ERESTARTSYS; + + if ((file->f_flags&O_ACCMODE)==O_RDWR) { + if (!(dmxdev->capabilities&DMXDEV_CAP_DUPLEX)) { + up(&dmxdev->mutex); + return -EOPNOTSUPP; + } + } + + if ((file->f_flags&O_ACCMODE)==O_RDONLY) { + DmxDevBufferInit(&dmxdev->dvr_buffer); + dmxdev->dvr_buffer.size=DVR_BUFFER_SIZE; + dmxdev->dvr_buffer.data=vmalloc(DVR_BUFFER_SIZE); + if (!dmxdev->dvr_buffer.data) { + up(&dmxdev->mutex); + return -ENOMEM; + } + } + + if ((file->f_flags&O_ACCMODE)==O_WRONLY) { + dmxdev->dvr_orig_fe=dmxdev->demux->frontend; + + if (!dmxdev->demux->write) { + up(&dmxdev->mutex); + return -EOPNOTSUPP; + } + + front=get_fe(dmxdev->demux, DMX_MEMORY_FE); + + if (!front) { + up(&dmxdev->mutex); + return -EINVAL; + } + dmxdev->demux->disconnect_frontend(dmxdev->demux); + dmxdev->demux->connect_frontend(dmxdev->demux, front); + } + up(&dmxdev->mutex); + return 0; +} + +static int dvb_dvr_release(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + + if (down_interruptible (&dmxdev->mutex)) + return -ERESTARTSYS; + + if ((file->f_flags&O_ACCMODE)==O_WRONLY) { + dmxdev->demux->disconnect_frontend(dmxdev->demux); + dmxdev->demux->connect_frontend(dmxdev->demux, + dmxdev->dvr_orig_fe); + } + if ((file->f_flags&O_ACCMODE)==O_RDONLY) { + if (dmxdev->dvr_buffer.data) { + void *mem=dmxdev->dvr_buffer.data; + mb(); + spin_lock_irq(&dmxdev->lock); + dmxdev->dvr_buffer.data=0; + spin_unlock_irq(&dmxdev->lock); + vfree(mem); + } + } + up(&dmxdev->mutex); + return 0; +} + +static ssize_t +dvb_dvr_write(struct file *file, const char *buf, size_t count, loff_t *ppos) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + int ret; + + if (!dmxdev->demux->write) + return -EOPNOTSUPP; + if ((file->f_flags&O_ACCMODE)!=O_WRONLY) + return -EINVAL; + if (down_interruptible (&dmxdev->mutex)) + return -ERESTARTSYS; + ret=dmxdev->demux->write(dmxdev->demux, buf, count); + up(&dmxdev->mutex); + return ret; +} + +static ssize_t +dvb_dvr_read(struct file *file, char *buf, size_t count, loff_t *ppos) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + int ret; + + //down(&dmxdev->mutex); + ret= DmxDevBufferRead(&dmxdev->dvr_buffer, + file->f_flags&O_NONBLOCK, + buf, count, ppos); + //up(&dmxdev->mutex); + return ret; +} + +static inline void +DmxDevFilterStateSet(dmxdev_filter_t *dmxdevfilter, int state) +{ + spin_lock_irq(&dmxdevfilter->dev->lock); + dmxdevfilter->state=state; + spin_unlock_irq(&dmxdevfilter->dev->lock); +} + +static int +DmxDevSetBufferSize(dmxdev_filter_t *dmxdevfilter, unsigned long size) +{ + dmxdev_buffer_t *buf=&dmxdevfilter->buffer; + void *mem; + + if (buf->size==size) + return 0; + if (dmxdevfilter->state>=DMXDEV_STATE_GO) + return -EBUSY; + spin_lock_irq(&dmxdevfilter->dev->lock); + mem=buf->data; + buf->data=0; + buf->size=size; + buf->pwrite=buf->pread=0; + spin_unlock_irq(&dmxdevfilter->dev->lock); + if (mem) + vfree(mem); + + if (buf->size) { + mem=vmalloc(dmxdevfilter->buffer.size); + if (!mem) + return -ENOMEM; + spin_lock_irq(&dmxdevfilter->dev->lock); + buf->data=mem; + spin_unlock_irq(&dmxdevfilter->dev->lock); + } + return 0; +} + +static void +DmxDevFilterTimeout(unsigned long data) +{ + dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *)data; + + dmxdevfilter->buffer.error=-ETIMEDOUT; + spin_lock_irq(&dmxdevfilter->dev->lock); + dmxdevfilter->state=DMXDEV_STATE_TIMEDOUT; + spin_unlock_irq(&dmxdevfilter->dev->lock); + wake_up(&dmxdevfilter->buffer.queue); +} + +static void +DmxDevFilterTimer(dmxdev_filter_t *dmxdevfilter) +{ + struct dmx_sct_filter_params *para=&dmxdevfilter->params.sec; + + del_timer(&dmxdevfilter->timer); + if (para->timeout) { + dmxdevfilter->timer.function=DmxDevFilterTimeout; + dmxdevfilter->timer.data=(unsigned long) dmxdevfilter; + dmxdevfilter->timer.expires=jiffies+1+(HZ/2+HZ*para->timeout)/1000; + add_timer(&dmxdevfilter->timer); + } +} + +static int +DmxDevSectionCallback(u8 *buffer1, size_t buffer1_len, + u8 *buffer2, size_t buffer2_len, + dmx_section_filter_t *filter, + dmx_success_t success) +{ + dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *) filter->priv; + int ret; + + if (dmxdevfilter->buffer.error) { + wake_up(&dmxdevfilter->buffer.queue); + return 0; + } + spin_lock(&dmxdevfilter->dev->lock); + if (dmxdevfilter->state!=DMXDEV_STATE_GO) { + spin_unlock(&dmxdevfilter->dev->lock); + return 0; + } + del_timer(&dmxdevfilter->timer); + dprintk("dmxdev: section callback %02x %02x %02x %02x %02x %02x\n", + buffer1[0], buffer1[1], + buffer1[2], buffer1[3], + buffer1[4], buffer1[5]); + ret=DmxDevBufferWrite(&dmxdevfilter->buffer, buffer1, buffer1_len); + if (ret==buffer1_len) { + ret=DmxDevBufferWrite(&dmxdevfilter->buffer, buffer2, buffer2_len); + } + if (ret<0) { + dmxdevfilter->buffer.pwrite=dmxdevfilter->buffer.pread; + dmxdevfilter->buffer.error=-EOVERFLOW; + } + if (dmxdevfilter->params.sec.flags&DMX_ONESHOT) + dmxdevfilter->state=DMXDEV_STATE_DONE; + spin_unlock(&dmxdevfilter->dev->lock); + wake_up(&dmxdevfilter->buffer.queue); + return 0; +} + +static int +DmxDevTSCallback(u8 *buffer1, size_t buffer1_len, + u8 *buffer2, size_t buffer2_len, + dmx_ts_feed_t *feed, + dmx_success_t success) +{ + dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *) feed->priv; + dmxdev_buffer_t *buffer; + int ret; + + spin_lock(&dmxdevfilter->dev->lock); + if (dmxdevfilter->params.pes.output==DMX_OUT_DECODER) { + spin_unlock(&dmxdevfilter->dev->lock); + return 0; + } + + if (dmxdevfilter->params.pes.output==DMX_OUT_TAP) + buffer=&dmxdevfilter->buffer; + else + buffer=&dmxdevfilter->dev->dvr_buffer; + if (buffer->error) { + spin_unlock(&dmxdevfilter->dev->lock); + wake_up(&buffer->queue); + return 0; + } + ret=DmxDevBufferWrite(buffer, buffer1, buffer1_len); + if (ret==buffer1_len) + ret=DmxDevBufferWrite(buffer, buffer2, buffer2_len); + if (ret<0) { + buffer->pwrite=buffer->pread; + buffer->error=-EOVERFLOW; + } + spin_unlock(&dmxdevfilter->dev->lock); + wake_up(&buffer->queue); + return 0; +} + + +/* stop feed but only mark the specified filter as stopped (state set) */ + +static int +DmxDevFeedStop(dmxdev_filter_t *dmxdevfilter) +{ + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_SET); + + switch (dmxdevfilter->type) { + case DMXDEV_TYPE_SEC: + del_timer(&dmxdevfilter->timer); + dmxdevfilter->feed.sec->stop_filtering(dmxdevfilter->feed.sec); + break; + case DMXDEV_TYPE_PES: + dmxdevfilter->feed.ts->stop_filtering(dmxdevfilter->feed.ts); + break; + default: + return -EINVAL; + } + return 0; +} + + +/* start feed associated with the specified filter */ + +static int +DmxDevFeedStart(dmxdev_filter_t *dmxdevfilter) +{ + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_GO); + + switch (dmxdevfilter->type) { + case DMXDEV_TYPE_SEC: + dmxdevfilter->feed.sec->start_filtering(dmxdevfilter->feed.sec); + break; + case DMXDEV_TYPE_PES: + dmxdevfilter->feed.ts->start_filtering(dmxdevfilter->feed.ts); + break; + default: + return -EINVAL; + } + return 0; +} + + +/* restart section feed if it has filters left associated with it, + otherwise release the feed */ + +static int +DmxDevFeedRestart(dmxdev_filter_t *dmxdevfilter) +{ + int i; + dmxdev_t *dmxdev=dmxdevfilter->dev; + uint16_t pid=dmxdevfilter->params.sec.pid; + + for (i=0; i<dmxdev->filternum; i++) + if (dmxdev->filter[i].state>=DMXDEV_STATE_GO && + dmxdev->filter[i].type==DMXDEV_TYPE_SEC && + dmxdev->filter[i].pid==pid) { + DmxDevFeedStart(&dmxdev->filter[i]); + return 0; + } + + dmxdevfilter->dev->demux-> + release_section_feed(dmxdev->demux, + dmxdevfilter->feed.sec); + + return 0; +} + +static int +DmxDevFilterStop(dmxdev_filter_t *dmxdevfilter) +{ + if (dmxdevfilter->state<DMXDEV_STATE_GO) + return 0; + + switch (dmxdevfilter->type) { + case DMXDEV_TYPE_SEC: + if (!dmxdevfilter->feed.sec) + break; + DmxDevFeedStop(dmxdevfilter); + if (dmxdevfilter->filter.sec) + dmxdevfilter->feed.sec-> + release_filter(dmxdevfilter->feed.sec, + dmxdevfilter->filter.sec); + DmxDevFeedRestart(dmxdevfilter); + dmxdevfilter->feed.sec=0; + break; + case DMXDEV_TYPE_PES: + if (!dmxdevfilter->feed.ts) + break; + DmxDevFeedStop(dmxdevfilter); + dmxdevfilter->dev->demux-> + release_ts_feed(dmxdevfilter->dev->demux, + dmxdevfilter->feed.ts); + dmxdevfilter->feed.ts=0; + break; + default: + if (dmxdevfilter->state==DMXDEV_STATE_ALLOCATED) + return 0; + return -EINVAL; + } + dmxdevfilter->buffer.pwrite=dmxdevfilter->buffer.pread=0; + return 0; +} + +static inline int +DmxDevFilterReset(dmxdev_filter_t *dmxdevfilter) +{ + if (dmxdevfilter->state<DMXDEV_STATE_SET) + return 0; + + dmxdevfilter->type=DMXDEV_TYPE_NONE; + dmxdevfilter->pid=0xffff; + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_ALLOCATED); + return 0; +} + +static int +DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter) +{ + dmxdev_t *dmxdev=dmxdevfilter->dev; + void *mem; + int ret, i; + + if (dmxdevfilter->state<DMXDEV_STATE_SET) + return -EINVAL; + if (dmxdevfilter->state>=DMXDEV_STATE_GO) + DmxDevFilterStop(dmxdevfilter); + + mem=dmxdevfilter->buffer.data; + if (!mem) { + mem=vmalloc(dmxdevfilter->buffer.size); + spin_lock_irq(&dmxdevfilter->dev->lock); + dmxdevfilter->buffer.data=mem; + spin_unlock_irq(&dmxdevfilter->dev->lock); + if (!dmxdevfilter->buffer.data) + return -ENOMEM; + } + + switch (dmxdevfilter->type) { + case DMXDEV_TYPE_SEC: + { + struct dmx_sct_filter_params *para=&dmxdevfilter->params.sec; + dmx_section_filter_t **secfilter=&dmxdevfilter->filter.sec; + dmx_section_feed_t **secfeed=&dmxdevfilter->feed.sec; + + *secfilter=0; + *secfeed=0; + + /* find active filter/feed with same PID */ + for (i=0; i<dmxdev->filternum; i++) + if (dmxdev->filter[i].state>=DMXDEV_STATE_GO && + dmxdev->filter[i].pid==para->pid) { + if (dmxdev->filter[i].type!=DMXDEV_TYPE_SEC) + return -EBUSY; + *secfeed=dmxdev->filter[i].feed.sec; + break; + } + + /* if no feed found, try to allocate new one */ + if (!*secfeed) { + ret=dmxdev->demux-> + allocate_section_feed(dmxdev->demux, + secfeed, + DmxDevSectionCallback); + if (ret<0) { + printk ("DVB (%s): could not alloc feed\n", + __FUNCTION__); + return ret; + } + + ret=(*secfeed)->set(*secfeed, para->pid, 32768, 0, + (para->flags & DMX_CHECK_CRC) ? 1 : 0); + + if (ret<0) { + printk ("DVB (%s): could not set feed\n", + __FUNCTION__); + DmxDevFeedRestart(dmxdevfilter); + return ret; + } + } + else + DmxDevFeedStop(dmxdevfilter); + + ret=(*secfeed)->allocate_filter(*secfeed, secfilter); + if (ret<0) { + DmxDevFeedRestart(dmxdevfilter); + dmxdevfilter->feed.sec-> + start_filtering(*secfeed); + dprintk ("could not get filter\n"); + return ret; + } + + (*secfilter)->priv=(void *) dmxdevfilter; + + memcpy(&((*secfilter)->filter_value[3]), + &(para->filter.filter[1]), DMX_FILTER_SIZE-1); + memcpy(&(*secfilter)->filter_mask[3], + ¶->filter.mask[1], DMX_FILTER_SIZE-1); + memcpy(&(*secfilter)->filter_mode[3], + ¶->filter.mode[1], DMX_FILTER_SIZE-1); + + (*secfilter)->filter_value[0]=para->filter.filter[0]; + (*secfilter)->filter_mask[0]=para->filter.mask[0]; + (*secfilter)->filter_mode[0]=para->filter.mode[0]; + (*secfilter)->filter_mask[1]=0; + (*secfilter)->filter_mask[2]=0; + + dmxdevfilter->todo=0; + dmxdevfilter->feed.sec-> + start_filtering(dmxdevfilter->feed.sec); + DmxDevFilterTimer(dmxdevfilter); + break; + } + + case DMXDEV_TYPE_PES: + { + struct timespec timeout = {0 }; + struct dmx_pes_filter_params *para=&dmxdevfilter->params.pes; + dmx_output_t otype; + int ret; + int ts_type; + dmx_ts_pes_t ts_pes; + dmx_ts_feed_t **tsfeed=&dmxdevfilter->feed.ts; + + dmxdevfilter->feed.ts=0; + otype=para->output; + + ts_pes=(dmx_ts_pes_t) para->pes_type; + + if (ts_pes<DMX_PES_OTHER) + ts_type=TS_DECODER; + else + ts_type=0; + + if (otype==DMX_OUT_TS_TAP) + ts_type|=TS_PACKET; + + if (otype==DMX_OUT_TAP) + ts_type|=TS_PAYLOAD_ONLY|TS_PACKET; + + ret=dmxdev->demux->allocate_ts_feed(dmxdev->demux, + tsfeed, + DmxDevTSCallback); + if (ret<0) + return ret; + + (*tsfeed)->priv=(void *) dmxdevfilter; + ret=(*tsfeed)->set(*tsfeed, para->pid, ts_type, ts_pes, 188, 32768, 0, timeout); + if (ret<0) { + dmxdev->demux-> + release_ts_feed(dmxdev->demux, *tsfeed); + return ret; + } + dmxdevfilter->feed.ts-> + start_filtering(dmxdevfilter->feed.ts); + break; + } + default: + return -EINVAL; + } + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_GO); + return 0; +} + +static int dvb_demux_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + int i; + dmxdev_filter_t *dmxdevfilter; + + if (!dmxdev->filter) + return -EINVAL; + if (down_interruptible(&dmxdev->mutex)) + return -ERESTARTSYS; + for (i=0; i<dmxdev->filternum; i++) + if (dmxdev->filter[i].state==DMXDEV_STATE_FREE) + break; + if (i==dmxdev->filternum) { + up(&dmxdev->mutex); + return -EMFILE; + } + dmxdevfilter=&dmxdev->filter[i]; + dmxdevfilter->dvbdev=dmxdev->dvbdev; + file->private_data=dmxdevfilter; + + DmxDevBufferInit(&dmxdevfilter->buffer); + dmxdevfilter->type=DMXDEV_TYPE_NONE; + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_ALLOCATED); + dmxdevfilter->feed.ts=0; + init_timer(&dmxdevfilter->timer); + + up(&dmxdev->mutex); + return 0; +} + +int +DmxDevFilterFree(dmxdev_t *dmxdev, dmxdev_filter_t *dmxdevfilter) +{ + if (down_interruptible(&dmxdev->mutex)) + return -ERESTARTSYS; + + DmxDevFilterStop(dmxdevfilter); + DmxDevFilterReset(dmxdevfilter); + + if (dmxdevfilter->buffer.data) { + void *mem=dmxdevfilter->buffer.data; + + spin_lock_irq(&dmxdev->lock); + dmxdevfilter->buffer.data=0; + spin_unlock_irq(&dmxdev->lock); + vfree(mem); + } + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_FREE); + wake_up(&dmxdevfilter->buffer.queue); + up(&dmxdev->mutex); + return 0; +} + +static inline void +invert_mode(dmx_filter_t *filter) +{ + int i; + + for (i=0; i<DMX_FILTER_SIZE; i++) + filter->mode[i]^=0xff; +} + + +static int +DmxDevFilterSet(dmxdev_t *dmxdev, + dmxdev_filter_t *dmxdevfilter, + struct dmx_sct_filter_params *params) +{ + dprintk ("function : %s\n", __FUNCTION__); + + DmxDevFilterStop(dmxdevfilter); + + dmxdevfilter->type=DMXDEV_TYPE_SEC; + dmxdevfilter->pid=params->pid; + memcpy(&dmxdevfilter->params.sec, + params, sizeof(struct dmx_sct_filter_params)); + invert_mode(&dmxdevfilter->params.sec.filter); + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_SET); + + if (params->flags&DMX_IMMEDIATE_START) + return DmxDevFilterStart(dmxdevfilter); + + return 0; +} + +static int +DmxDevPesFilterSet(dmxdev_t *dmxdev, + dmxdev_filter_t *dmxdevfilter, + struct dmx_pes_filter_params *params) +{ + DmxDevFilterStop(dmxdevfilter); + + if (params->pes_type>DMX_PES_OTHER || params->pes_type<0) + return -EINVAL; + + dmxdevfilter->type=DMXDEV_TYPE_PES; + dmxdevfilter->pid=params->pid; + memcpy(&dmxdevfilter->params, params, sizeof(struct dmx_pes_filter_params)); + + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_SET); + + if (params->flags&DMX_IMMEDIATE_START) + return DmxDevFilterStart(dmxdevfilter); + + return 0; +} + +static ssize_t +DmxDevReadSec(dmxdev_filter_t *dfil, struct file *file, + char *buf, size_t count, loff_t *ppos) +{ + int result, hcount; + int done=0; + + if (dfil->todo<=0) { + hcount=3+dfil->todo; + if (hcount>count) + hcount=count; + result=DmxDevBufferRead(&dfil->buffer, file->f_flags&O_NONBLOCK, + buf, hcount, ppos); + if (result<0) { + dfil->todo=0; + return result; + } + if (copy_from_user(dfil->secheader-dfil->todo, buf, result)) + return -EFAULT; + buf+=result; + done=result; + count-=result; + dfil->todo-=result; + if (dfil->todo>-3) + return done; + dfil->todo=((dfil->secheader[1]<<8)|dfil->secheader[2])&0xfff; + if (!count) + return done; + } + if (count>dfil->todo) + count=dfil->todo; + result=DmxDevBufferRead(&dfil->buffer, file->f_flags&O_NONBLOCK, + buf, count, ppos); + if (result<0) + return result; + dfil->todo-=result; + return (result+done); +} + + +ssize_t +dvb_demux_read(struct file *file, char *buf, size_t count, loff_t *ppos) +{ + dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(file); + //dmxdev_t *dmxdev=dmxdevfilter->dev; + int ret=0; + + // semaphore should not be necessary (I hope ...) + //down(&dmxdev->mutex); + if (dmxdevfilter->type==DMXDEV_TYPE_SEC) + ret=DmxDevReadSec(dmxdevfilter, file, buf, count, ppos); + else + ret=DmxDevBufferRead(&dmxdevfilter->buffer, + file->f_flags&O_NONBLOCK, + buf, count, ppos); + //up(&dmxdev->mutex); + return ret; +} + + +static int dvb_demux_do_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(file); + dmxdev_t *dmxdev=dmxdevfilter->dev; + unsigned long arg=(unsigned long) parg; + int ret=0; + + if (down_interruptible (&dmxdev->mutex)) + return -ERESTARTSYS; + + switch (cmd) { + case DMX_START: + if (dmxdevfilter->state<DMXDEV_STATE_SET) + ret=-EINVAL; + else + ret=DmxDevFilterStart(dmxdevfilter); + break; + + case DMX_STOP: + ret=DmxDevFilterStop(dmxdevfilter); + break; + + case DMX_SET_FILTER: + ret=DmxDevFilterSet(dmxdev, dmxdevfilter, + (struct dmx_sct_filter_params *)parg); + break; + + case DMX_SET_PES_FILTER: + ret=DmxDevPesFilterSet(dmxdev, dmxdevfilter, + (struct dmx_pes_filter_params *)parg); + break; + + case DMX_SET_BUFFER_SIZE: + ret=DmxDevSetBufferSize(dmxdevfilter, arg); + break; + + case DMX_GET_EVENT: + break; + + case DMX_GET_PES_PIDS: + if (!dmxdev->demux->get_pes_pids) { + ret=-EINVAL; + break; + } + dmxdev->demux->get_pes_pids(dmxdev->demux, (uint16_t *)parg); + break; + + default: + ret=-EINVAL; + } + up(&dmxdev->mutex); + return ret; +} + +static int dvb_demux_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + return generic_usercopy(inode, file, cmd, arg, dvb_demux_do_ioctl); +} + + +static unsigned int dvb_demux_poll(struct file *file, poll_table *wait) +{ + dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(file); + + if (!dmxdevfilter) + return -EINVAL; + + if (dmxdevfilter->state==DMXDEV_STATE_FREE) + return 0; + + if (dmxdevfilter->buffer.error) + return (POLLIN | POLLRDNORM | POLLPRI | POLLERR); + + if (dmxdevfilter->buffer.pread!=dmxdevfilter->buffer.pwrite) + return (POLLIN | POLLRDNORM | POLLPRI); + + if (dmxdevfilter->state!=DMXDEV_STATE_GO) + return 0; + + poll_wait(file, &dmxdevfilter->buffer.queue, wait); + + if (dmxdevfilter->state==DMXDEV_STATE_FREE) + return 0; + + if (dmxdevfilter->buffer.error) + return (POLLIN | POLLRDNORM | POLLPRI | POLLERR); + + if (dmxdevfilter->buffer.pread!=dmxdevfilter->buffer.pwrite) + return (POLLIN | POLLRDNORM | POLLPRI); + + return 0; +} + +static int dvb_demux_release(struct inode *inode, struct file *file) +{ + dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(file); + dmxdev_t *dmxdev=dmxdevfilter->dev; + + return DmxDevFilterFree(dmxdev, dmxdevfilter); +} + +static struct file_operations dvb_demux_fops = { + owner: THIS_MODULE, + read: dvb_demux_read, + write: 0, + ioctl: dvb_demux_ioctl, + open: dvb_demux_open, + release: dvb_demux_release, + poll: dvb_demux_poll, +}; + +static dvb_device_t dvbdev_demux = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_demux_fops +}; + +static int dvb_dvr_do_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + + int ret=0; + + if (down_interruptible (&dmxdev->mutex)) + return -ERESTARTSYS; + + switch (cmd) { + case DMX_SET_BUFFER_SIZE: + // FIXME: implement + ret=0; + break; + + default: + ret=-EINVAL; + } + up(&dmxdev->mutex); + return ret; +} + +static int dvb_dvr_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + return generic_usercopy(inode, file, cmd, arg, dvb_dvr_do_ioctl); +} + + +static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + + dprintk ("function : %s\n", __FUNCTION__); + + if ((file->f_flags&O_ACCMODE)==O_RDONLY) { + if (dmxdev->dvr_buffer.error) + return (POLLIN | POLLRDNORM | POLLPRI | POLLERR); + + if (dmxdev->dvr_buffer.pread!=dmxdev->dvr_buffer.pwrite) + return (POLLIN | POLLRDNORM | POLLPRI); + + poll_wait(file, &dmxdev->dvr_buffer.queue, wait); + + if (dmxdev->dvr_buffer.error) + return (POLLIN | POLLRDNORM | POLLPRI | POLLERR); + + if (dmxdev->dvr_buffer.pread!=dmxdev->dvr_buffer.pwrite) + return (POLLIN | POLLRDNORM | POLLPRI); + + return 0; + } else + return (POLLOUT | POLLWRNORM | POLLPRI); +} + +static struct file_operations dvb_dvr_fops = { + owner: THIS_MODULE, + read: dvb_dvr_read, + write: dvb_dvr_write, + ioctl: dvb_dvr_ioctl, + open: dvb_dvr_open, + release: dvb_dvr_release, + poll: dvb_dvr_poll, +}; + +static dvb_device_t dvbdev_dvr = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_dvr_fops +}; + +int +DmxDevInit(dmxdev_t *dmxdev, dvb_adapter_t *dvb_adapter) +{ + int i; + + if (dmxdev->demux->open(dmxdev->demux)<0) + return -EUSERS; + + dmxdev->filter=vmalloc(dmxdev->filternum*sizeof(dmxdev_filter_t)); + if (!dmxdev->filter) + return -ENOMEM; + + dmxdev->dvr=vmalloc(dmxdev->filternum*sizeof(dmxdev_dvr_t)); + if (!dmxdev->dvr) { + vfree(dmxdev->filter); + dmxdev->filter=0; + return -ENOMEM; + } + sema_init(&dmxdev->mutex, 1); + spin_lock_init(&dmxdev->lock); + for (i=0; i<dmxdev->filternum; i++) { + dmxdev->filter[i].dev=dmxdev; + dmxdev->filter[i].buffer.data=0; + DmxDevFilterStateSet(&dmxdev->filter[i], DMXDEV_STATE_FREE); + dmxdev->dvr[i].dev=dmxdev; + dmxdev->dvr[i].buffer.data=0; + DmxDevFilterStateSet(&dmxdev->filter[i], DMXDEV_STATE_FREE); + DmxDevDVRStateSet(&dmxdev->dvr[i], DMXDEV_STATE_FREE); + } + dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, DVB_DEVICE_DEMUX); + dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, dmxdev, DVB_DEVICE_DVR); + + DmxDevBufferInit(&dmxdev->dvr_buffer); + MOD_INC_USE_COUNT; + return 0; +} + +void +DmxDevRelease(dmxdev_t *dmxdev) +{ + dvb_unregister_device(dmxdev->dvbdev); + dvb_unregister_device(dmxdev->dvr_dvbdev); + if (dmxdev->filter) { + vfree(dmxdev->filter); + dmxdev->filter=0; + } + if (dmxdev->dvr) { + vfree(dmxdev->dvr); + dmxdev->dvr=0; + } + dmxdev->demux->close(dmxdev->demux); + MOD_DEC_USE_COUNT; +} + + diff --git a/drivers/media/dvb/dvb-core/dmxdev.h b/drivers/media/dvb/dvb-core/dmxdev.h new file mode 100644 index 000000000000..c5fa89d51d86 --- /dev/null +++ b/drivers/media/dvb/dvb-core/dmxdev.h @@ -0,0 +1,128 @@ +/* + * dmxdev.h + * + * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de> + * & Marcus Metzler <marcus@convergence.de> + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DMXDEV_H_ +#define _DMXDEV_H_ + +#ifndef __KERNEL__ +#define __KERNEL__ +#endif + +#include <linux/dvb/dmx.h> + +#include <linux/version.h> +#include <linux/wait.h> +#include <linux/types.h> +#include <linux/fs.h> + +#include "dvbdev.h" +#include "demux.h" + +typedef enum { + DMXDEV_TYPE_NONE, + DMXDEV_TYPE_SEC, + DMXDEV_TYPE_PES, +} dmxdev_type_t; + +typedef enum { + DMXDEV_STATE_FREE, + DMXDEV_STATE_ALLOCATED, + DMXDEV_STATE_SET, + DMXDEV_STATE_GO, + DMXDEV_STATE_DONE, + DMXDEV_STATE_TIMEDOUT +} dmxdev_state_t; + +typedef struct dmxdev_buffer_s { + uint8_t *data; + uint32_t size; + int32_t pread; + int32_t pwrite; + wait_queue_head_t queue; + int error; +} dmxdev_buffer_t; + + +typedef struct dmxdev_filter_s { + dvb_device_t *dvbdev; + + union { + dmx_section_filter_t *sec; + } filter; + + union { + dmx_ts_feed_t *ts; + dmx_section_feed_t *sec; + } feed; + + union { + struct dmx_sct_filter_params sec; + struct dmx_pes_filter_params pes; + } params; + + int type; + dmxdev_state_t state; + struct dmxdev_s *dev; + dmxdev_buffer_t buffer; + + // only for sections + struct timer_list timer; + int todo; + uint8_t secheader[3]; + + u16 pid; +} dmxdev_filter_t; + + +typedef struct dmxdev_dvr_s { + int state; + struct dmxdev_s *dev; + dmxdev_buffer_t buffer; +} dmxdev_dvr_t; + + +typedef struct dmxdev_s { + dvb_device_t *dvbdev; + dvb_device_t *dvr_dvbdev; + + dmxdev_filter_t *filter; + dmxdev_dvr_t *dvr; + dmx_demux_t *demux; + + int filternum; + int capabilities; +#define DMXDEV_CAP_DUPLEX 1 + dmx_frontend_t *dvr_orig_fe; + + dmxdev_buffer_t dvr_buffer; +#define DVR_BUFFER_SIZE (10*188*1024) + + struct semaphore mutex; + spinlock_t lock; +} dmxdev_t; + + +int DmxDevInit(dmxdev_t *dmxdev, dvb_adapter_t *); +void DmxDevRelease(dmxdev_t *dmxdev); + +#endif /* _DMXDEV_H_ */ diff --git a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c new file mode 100644 index 000000000000..3a3e3834afeb --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvb_demux.c @@ -0,0 +1,1179 @@ +/* + * dvb_demux.c - DVB kernel demux API + * + * Copyright (C) 2000-2001 Ralph Metzler <ralph@convergence.de> + * & Marcus Metzler <marcus@convergence.de> + * for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include <linux/vmalloc.h> +#include <linux/module.h> +#include <linux/poll.h> +#include <linux/version.h> +#include <asm/uaccess.h> + +#include "compat.h" +#include "dvb_demux.h" + +#define NOBUFS + +LIST_HEAD(dmx_muxs); + +int dmx_register_demux(dmx_demux_t *demux) +{ + struct list_head *pos, *head=&dmx_muxs; + + if (!(demux->id && demux->vendor && demux->model)) + return -EINVAL; + list_for_each(pos, head) + { + if (!strcmp(DMX_DIR_ENTRY(pos)->id, demux->id)) + return -EEXIST; + } + demux->users=0; + list_add(&(demux->reg_list), head); + MOD_INC_USE_COUNT; + return 0; +} + +int dmx_unregister_demux(dmx_demux_t* demux) +{ + struct list_head *pos, *n, *head=&dmx_muxs; + + list_for_each_safe (pos, n, head) + { + if (DMX_DIR_ENTRY(pos)==demux) + { + if (demux->users>0) + return -EINVAL; + list_del(pos); + MOD_DEC_USE_COUNT; + return 0; + } + } + return -ENODEV; +} + + +struct list_head *dmx_get_demuxes(void) +{ + if (list_empty(&dmx_muxs)) + return NULL; + + return &dmx_muxs; +} + +/****************************************************************************** + * static inlined helper functions + ******************************************************************************/ + +static inline u16 +section_length(const u8 *buf) +{ + return 3+((buf[1]&0x0f)<<8)+buf[2]; +} + +static inline u16 +ts_pid(const u8 *buf) +{ + return ((buf[1]&0x1f)<<8)+buf[2]; +} + +static inline int +payload(const u8 *tsp) +{ + if (!(tsp[3]&0x10)) // no payload? + return 0; + if (tsp[3]&0x20) { // adaptation field? + if (tsp[4]>183) // corrupted data? + return 0; + else + return 184-1-tsp[4]; + } + return 184; +} + + +static u32 +dvb_crc_table[256] = { + 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, + 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, + 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, + 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, + 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, + 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, + 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, + 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, + 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, + 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, + 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, + 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, + 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, + 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, + 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, + 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, + 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, + 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, + 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, + 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, + 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, + 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, + 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, + 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, + 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, + 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, + 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, + 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, + 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, + 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, + 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, + 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, + 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, + 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, + 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, + 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, + 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, + 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, + 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, + 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, + 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, + 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, + 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4}; + +u32 dvb_crc32(u8 *data, int len) +{ + int i; + u32 crc = 0xffffffff; + + for (i=0; i<len; i++) + crc = (crc << 8) ^ dvb_crc_table[((crc >> 24) ^ *data++) & 0xff]; + return crc; +} + +void dvb_set_crc32(u8 *data, int length) +{ + u32 crc; + + crc=dvb_crc32(data,length); + data[length] = (crc>>24)&0xff; + data[length+1] = (crc>>16)&0xff; + data[length+2] = (crc>>8)&0xff; + data[length+3] = (crc)&0xff; +} + + +/****************************************************************************** + * Software filter functions + ******************************************************************************/ + +static inline int +DvbDmxSWFilterPayload(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) +{ + int p, count; + //int ccok; + //u8 cc; + + if (!(count=payload(buf))) + return -1; + p=188-count; + /* + cc=buf[3]&0x0f; + ccok=((dvbdmxfeed->cc+1)&0x0f)==cc ? 1 : 0; + dvbdmxfeed->cc=cc; + if (!ccok) + printk("missed packet!\n"); + */ + if (buf[1]&0x40) // PUSI ? + dvbdmxfeed->peslen=0xfffa; + dvbdmxfeed->peslen+=count; + + return dvbdmxfeed->cb.ts((u8 *)&buf[p], count, 0, 0, + &dvbdmxfeed->feed.ts, DMX_OK); +} + + +static int +DvbDmxSWFilterSectionFilter(dvb_demux_feed_t *dvbdmxfeed, + dvb_demux_filter_t *f) +{ + dmx_section_filter_t *filter=&f->filter; + int i; + u8 xor, neq=0; + + for (i=0; i<DVB_DEMUX_MASK_MAX; i++) { + xor=filter->filter_value[i]^dvbdmxfeed->secbuf[i]; + if (f->maskandmode[i]&xor) + return 0; + neq|=f->maskandnotmode[i]&xor; + } + if (f->doneq & !neq) + return 0; + + return dvbdmxfeed->cb.sec(dvbdmxfeed->secbuf, dvbdmxfeed->seclen, + 0, 0, filter, DMX_OK); +} + +static inline int +DvbDmxSWFilterSectionFeed(dvb_demux_feed_t *dvbdmxfeed) +{ + u8 *buf=dvbdmxfeed->secbuf; + dvb_demux_filter_t *f; + + if (dvbdmxfeed->secbufp!=dvbdmxfeed->seclen) + return -1; + if (!dvbdmxfeed->feed.sec.is_filtering) + return 0; + if (!(f=dvbdmxfeed->filter)) + return 0; + do + if (DvbDmxSWFilterSectionFilter(dvbdmxfeed, f)<0) + return -1; + while ((f=f->next) && dvbdmxfeed->feed.sec.is_filtering); + + dvbdmxfeed->secbufp=dvbdmxfeed->seclen=0; + memset(buf, 0, DVB_DEMUX_MASK_MAX); + return 0; +} + +static inline int +DvbDmxSWFilterSectionPacket(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) +{ + int p, count; + int ccok, rest; + u8 cc; + + if (!(count=payload(buf))) + return -1; + p=188-count; + + cc=buf[3]&0x0f; + ccok=((dvbdmxfeed->cc+1)&0x0f)==cc ? 1 : 0; + dvbdmxfeed->cc=cc; + + if (buf[1]&0x40) { // PUSI set + // offset to start of first section is in buf[p] + if (p+buf[p]>187) // trash if it points beyond packet + return -1; + if (buf[p] && ccok) { // rest of previous section? + // did we have enough data in last packet to calc length? + int tmp=3-dvbdmxfeed->secbufp; + if (tmp>0 && tmp!=3) { + if (p+tmp>=187) + return -1; + memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, + buf+p+1, tmp); + dvbdmxfeed->seclen=section_length(dvbdmxfeed->secbuf); + if (dvbdmxfeed->seclen>4096) + return -1; + } + rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp; + if (rest==buf[p] && dvbdmxfeed->seclen) { + memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, + buf+p+1, buf[p]); + dvbdmxfeed->secbufp+=buf[p]; + DvbDmxSWFilterSectionFeed(dvbdmxfeed); + } + } + p+=buf[p]+1; // skip rest of last section + count=188-p; + while (count>0) { + if ((count>2) && // enough data to determine sec length? + ((dvbdmxfeed->seclen=section_length(buf+p))<=count)) { + if (dvbdmxfeed->seclen>4096) + return -1; + memcpy(dvbdmxfeed->secbuf, buf+p, + dvbdmxfeed->seclen); + dvbdmxfeed->secbufp=dvbdmxfeed->seclen; + p+=dvbdmxfeed->seclen; + count=188-p; + DvbDmxSWFilterSectionFeed(dvbdmxfeed); + + // filling bytes until packet end? + if (count && buf[p]==0xff) + count=0; + } else { // section continues to following TS packet + memcpy(dvbdmxfeed->secbuf, buf+p, count); + dvbdmxfeed->secbufp+=count; + count=0; + } + } + return 0; + } + + // section continued below + if (!ccok) + return -1; + if (!dvbdmxfeed->secbufp) // any data in last ts packet? + return -1; + // did we have enough data in last packet to calc section length? + if (dvbdmxfeed->secbufp<3) { + int tmp=3-dvbdmxfeed->secbufp; + + if (tmp>count) + return -1; + memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, tmp); + dvbdmxfeed->seclen=section_length(dvbdmxfeed->secbuf); + if (dvbdmxfeed->seclen>4096) + return -1; + } + rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp; + if (rest<0) + return -1; + if (rest<=count) { // section completed in this TS packet + memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, rest); + dvbdmxfeed->secbufp+=rest; + DvbDmxSWFilterSectionFeed(dvbdmxfeed); + } else { // section continues in following ts packet + memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, count); + dvbdmxfeed->secbufp+=count; + } + return 0; +} + +static inline void +DvbDmxSWFilterPacketType(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) +{ + switch(dvbdmxfeed->type) { + case DMX_TYPE_TS: + if (!dvbdmxfeed->feed.ts.is_filtering) + break; + if (dvbdmxfeed->ts_type & TS_PACKET) { + if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY) + DvbDmxSWFilterPayload(dvbdmxfeed, buf); + else + dvbdmxfeed->cb.ts((u8 *)buf, 188, 0, 0, + &dvbdmxfeed->feed.ts, DMX_OK); + } + if (dvbdmxfeed->ts_type & TS_DECODER) + if (dvbdmxfeed->demux->write_to_decoder) + dvbdmxfeed->demux-> + write_to_decoder(dvbdmxfeed, (u8 *)buf, 188); + break; + + case DMX_TYPE_SEC: + if (!dvbdmxfeed->feed.sec.is_filtering) + break; + if (DvbDmxSWFilterSectionPacket(dvbdmxfeed, buf)<0) + dvbdmxfeed->seclen=dvbdmxfeed->secbufp=0; + break; + + default: + break; + } +} + +void inline +DvbDmxSWFilterPacket(dvb_demux_t *dvbdmx, const u8 *buf) +{ + dvb_demux_feed_t *dvbdmxfeed; + + if (!(dvbdmxfeed=dvbdmx->pid2feed[ts_pid(buf)])) + return; + DvbDmxSWFilterPacketType(dvbdmxfeed, buf); +} + +void +DvbDmxSWFilterPackets(dvb_demux_t *dvbdmx, const u8 *buf, int count) +{ + dvb_demux_feed_t *dvbdmxfeed; + + spin_lock(&dvbdmx->lock); + if ((dvbdmxfeed=dvbdmx->pid2feed[0x2000])) + dvbdmxfeed->cb.ts((u8 *)buf, count*188, 0, 0, + &dvbdmxfeed->feed.ts, DMX_OK); + while (count) { + DvbDmxSWFilterPacket(dvbdmx, buf); + count--; + buf+=188; + } + spin_unlock(&dvbdmx->lock); +} + +static inline void +DvbDmxSWFilter(dvb_demux_t *dvbdmx, const u8 *buf, size_t count) +{ + int p=0,i, j; + + if ((i=dvbdmx->tsbufp)) { + if (count<(j=188-i)) { + memcpy(&dvbdmx->tsbuf[i], buf, count); + dvbdmx->tsbufp+=count; + return; + } + memcpy(&dvbdmx->tsbuf[i], buf, j); + DvbDmxSWFilterPacket(dvbdmx, dvbdmx->tsbuf); + dvbdmx->tsbufp=0; + p+=j; + } + + while (p<count) { + if (buf[p]==0x47) { + if (count-p>=188) { + DvbDmxSWFilterPacket(dvbdmx, buf+p); + p+=188; + } else { + i=count-p; + memcpy(dvbdmx->tsbuf, buf+p, i); + dvbdmx->tsbufp=i; + return; + } + } else + p++; + } +} + + +/****************************************************************************** + ****************************************************************************** + * DVB DEMUX API LEVEL FUNCTIONS + ****************************************************************************** + ******************************************************************************/ + +static dvb_demux_filter_t * +DvbDmxFilterAlloc(dvb_demux_t *dvbdmx) +{ + int i; + + for (i=0; i<dvbdmx->filternum; i++) + if (dvbdmx->filter[i].state==DMX_STATE_FREE) + break; + if (i==dvbdmx->filternum) + return 0; + dvbdmx->filter[i].state=DMX_STATE_ALLOCATED; + return &dvbdmx->filter[i]; +} + +static dvb_demux_feed_t * +DvbDmxFeedAlloc(dvb_demux_t *dvbdmx) +{ + int i; + + for (i=0; i<dvbdmx->feednum; i++) + if (dvbdmx->feed[i].state==DMX_STATE_FREE) + break; + if (i==dvbdmx->feednum) + return 0; + dvbdmx->feed[i].state=DMX_STATE_ALLOCATED; + return &dvbdmx->feed[i]; +} + + +/****************************************************************************** + * dmx_ts_feed API calls + ******************************************************************************/ + +static int +dmx_pid_set(u16 pid, dvb_demux_feed_t *dvbdmxfeed) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + dvb_demux_feed_t **pid2feed=dvbdmx->pid2feed; + + if (pid>DMX_MAX_PID) + return -EINVAL; + if (dvbdmxfeed->pid!=0xffff) { + if (dvbdmxfeed->pid<=DMX_MAX_PID) + pid2feed[dvbdmxfeed->pid]=0; + dvbdmxfeed->pid=0xffff; + } + if (pid2feed[pid]) { + return -EBUSY; + } + pid2feed[pid]=dvbdmxfeed; + dvbdmxfeed->pid=pid; + return 0; +} + + +static int +dmx_ts_feed_set(struct dmx_ts_feed_s* feed, + u16 pid, + int ts_type, + dmx_ts_pes_t pes_type, + size_t callback_length, + size_t circular_buffer_size, + int descramble, + struct timespec timeout + ) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + int ret; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (ts_type & TS_DECODER) { + if (pes_type >= DMX_TS_PES_OTHER) { + up(&dvbdmx->mutex); + return -EINVAL; + } + if (dvbdmx->pesfilter[pes_type] && + (dvbdmx->pesfilter[pes_type]!=dvbdmxfeed)) { + up(&dvbdmx->mutex); + return -EINVAL; + } + if ((pes_type != DMX_TS_PES_PCR0) && + (pes_type != DMX_TS_PES_PCR1) && + (pes_type != DMX_TS_PES_PCR2) && + (pes_type != DMX_TS_PES_PCR3)) { + if ((ret=dmx_pid_set(pid, dvbdmxfeed))<0) { + up(&dvbdmx->mutex); + return ret; + } else + dvbdmxfeed->pid=pid; + } + dvbdmx->pesfilter[pes_type]=dvbdmxfeed; + dvbdmx->pids[pes_type]=dvbdmxfeed->pid; + } else + if ((ret=dmx_pid_set(pid, dvbdmxfeed))<0) { + up(&dvbdmx->mutex); + return ret; + } + + dvbdmxfeed->buffer_size=circular_buffer_size; + dvbdmxfeed->descramble=descramble; + dvbdmxfeed->timeout=timeout; + dvbdmxfeed->cb_length=callback_length; + dvbdmxfeed->ts_type=ts_type; + dvbdmxfeed->pes_type=pes_type; + + if (dvbdmxfeed->descramble) { + up(&dvbdmx->mutex); + return -ENOSYS; + } + + if (dvbdmxfeed->buffer_size) { +#ifdef NOBUFS + dvbdmxfeed->buffer=0; +#else + dvbdmxfeed->buffer=vmalloc(dvbdmxfeed->buffer_size); + if (!dvbdmxfeed->buffer) { + up(&dvbdmx->mutex); + return -ENOMEM; + } +#endif + } + dvbdmxfeed->state=DMX_STATE_READY; + up(&dvbdmx->mutex); + return 0; +} + +static int +dmx_ts_feed_start_filtering(struct dmx_ts_feed_s* feed) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + int ret; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (dvbdmxfeed->state!=DMX_STATE_READY || + dvbdmxfeed->type!=DMX_TYPE_TS) { + up(&dvbdmx->mutex); + return -EINVAL; + } + if (!dvbdmx->start_feed) { + up(&dvbdmx->mutex); + return -1; + } + ret=dvbdmx->start_feed(dvbdmxfeed); + if (ret<0) { + up(&dvbdmx->mutex); + return ret; + } + spin_lock_irq(&dvbdmx->lock); + feed->is_filtering=1; + dvbdmxfeed->state=DMX_STATE_GO; + spin_unlock_irq(&dvbdmx->lock); + up(&dvbdmx->mutex); + return 0; +} + +static int +dmx_ts_feed_stop_filtering(struct dmx_ts_feed_s* feed) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + int ret; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (dvbdmxfeed->state<DMX_STATE_GO) { + up(&dvbdmx->mutex); + return -EINVAL; + } + if (!dvbdmx->stop_feed) { + up(&dvbdmx->mutex); + return -1; + } + ret=dvbdmx->stop_feed(dvbdmxfeed); + spin_lock_irq(&dvbdmx->lock); + feed->is_filtering=0; + dvbdmxfeed->state=DMX_STATE_ALLOCATED; + + spin_unlock_irq(&dvbdmx->lock); + up(&dvbdmx->mutex); + return ret; +} + +static int dvbdmx_allocate_ts_feed(dmx_demux_t *demux, + dmx_ts_feed_t **feed, + dmx_ts_cb callback) +{ + dvb_demux_t *dvbdmx=(dvb_demux_t *) demux; + dvb_demux_feed_t *dvbdmxfeed; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (!(dvbdmxfeed=DvbDmxFeedAlloc(dvbdmx))) { + up(&dvbdmx->mutex); + return -EBUSY; + } + dvbdmxfeed->type=DMX_TYPE_TS; + dvbdmxfeed->cb.ts=callback; + dvbdmxfeed->demux=dvbdmx; + dvbdmxfeed->pid=0xffff; + dvbdmxfeed->peslen=0xfffa; + dvbdmxfeed->buffer=0; + + (*feed)=&dvbdmxfeed->feed.ts; + (*feed)->is_filtering=0; + (*feed)->parent=demux; + (*feed)->priv=0; + (*feed)->set=dmx_ts_feed_set; + (*feed)->start_filtering=dmx_ts_feed_start_filtering; + (*feed)->stop_filtering=dmx_ts_feed_stop_filtering; + + + if (!(dvbdmxfeed->filter=DvbDmxFilterAlloc(dvbdmx))) { + dvbdmxfeed->state=DMX_STATE_FREE; + up(&dvbdmx->mutex); + return -EBUSY; + } + + dvbdmxfeed->filter->type=DMX_TYPE_TS; + dvbdmxfeed->filter->feed=dvbdmxfeed; + dvbdmxfeed->filter->state=DMX_STATE_READY; + + up(&dvbdmx->mutex); + return 0; +} + +static int dvbdmx_release_ts_feed(dmx_demux_t *demux, dmx_ts_feed_t *feed) +{ + dvb_demux_t *dvbdmx=(dvb_demux_t *) demux; + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (dvbdmxfeed->state==DMX_STATE_FREE) { + up(&dvbdmx->mutex); + return -EINVAL; + } +#ifndef NOBUFS + if (dvbdmxfeed->buffer) { + vfree(dvbdmxfeed->buffer); + dvbdmxfeed->buffer=0; + } +#endif + dvbdmxfeed->state=DMX_STATE_FREE; + dvbdmxfeed->filter->state=DMX_STATE_FREE; + if (dvbdmxfeed->pid<=DMX_MAX_PID) { + dvbdmxfeed->demux->pid2feed[dvbdmxfeed->pid]=0; + dvbdmxfeed->pid=0xffff; + } + + up(&dvbdmx->mutex); + return 0; +} + + +/****************************************************************************** + * dmx_section_feed API calls + ******************************************************************************/ + +static int +dmx_section_feed_allocate_filter(struct dmx_section_feed_s* feed, + dmx_section_filter_t** filter) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdemux=dvbdmxfeed->demux; + dvb_demux_filter_t *dvbdmxfilter; + + if (down_interruptible (&dvbdemux->mutex)) + return -ERESTARTSYS; + + dvbdmxfilter=DvbDmxFilterAlloc(dvbdemux); + if (!dvbdmxfilter) { + up(&dvbdemux->mutex); + return -ENOSPC; + } + spin_lock_irq(&dvbdemux->lock); + *filter=&dvbdmxfilter->filter; + (*filter)->parent=feed; + (*filter)->priv=0; + dvbdmxfilter->feed=dvbdmxfeed; + dvbdmxfilter->type=DMX_TYPE_SEC; + dvbdmxfilter->state=DMX_STATE_READY; + + dvbdmxfilter->next=dvbdmxfeed->filter; + dvbdmxfeed->filter=dvbdmxfilter; + spin_unlock_irq(&dvbdemux->lock); + up(&dvbdemux->mutex); + return 0; +} + +static int +dmx_section_feed_set(struct dmx_section_feed_s* feed, + u16 pid, size_t circular_buffer_size, + int descramble, int check_crc) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + + if (pid>0x1fff) + return -EINVAL; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (dvbdmxfeed->pid!=0xffff) { + dvbdmx->pid2feed[dvbdmxfeed->pid]=0; + dvbdmxfeed->pid=0xffff; + } + if (dvbdmx->pid2feed[pid]) { + up(&dvbdmx->mutex); + return -EBUSY; + } + dvbdmx->pid2feed[pid]=dvbdmxfeed; + dvbdmxfeed->pid=pid; + + dvbdmxfeed->buffer_size=circular_buffer_size; + dvbdmxfeed->descramble=descramble; + if (dvbdmxfeed->descramble) { + up(&dvbdmx->mutex); + return -ENOSYS; + } + + dvbdmxfeed->check_crc=check_crc; +#ifdef NOBUFS + dvbdmxfeed->buffer=0; +#else + dvbdmxfeed->buffer=vmalloc(dvbdmxfeed->buffer_size); + if (!dvbdmxfeed->buffer) { + up(&dvbdmx->mutex); + return -ENOMEM; + } +#endif + dvbdmxfeed->state=DMX_STATE_READY; + up(&dvbdmx->mutex); + return 0; +} + +static void prepare_secfilters(dvb_demux_feed_t *dvbdmxfeed) +{ + int i; + dmx_section_filter_t *sf; + dvb_demux_filter_t *f; + u8 mask, mode, doneq; + + if (!(f=dvbdmxfeed->filter)) + return; + do { + sf=&f->filter; + doneq=0; + for (i=0; i<DVB_DEMUX_MASK_MAX; i++) { + mode=sf->filter_mode[i]; + mask=sf->filter_mask[i]; + f->maskandmode[i]=mask&mode; + doneq|=f->maskandnotmode[i]=mask&~mode; + } + f->doneq=doneq ? 1 : 0; + } while ((f=f->next)); +} + + +static int +dmx_section_feed_start_filtering(dmx_section_feed_t *feed) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + int ret; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (feed->is_filtering) { + up(&dvbdmx->mutex); + return -EBUSY; + } + if (!dvbdmxfeed->filter) { + up(&dvbdmx->mutex); + return -EINVAL; + } + dvbdmxfeed->secbufp=0; + dvbdmxfeed->seclen=0; + + if (!dvbdmx->start_feed) { + up(&dvbdmx->mutex); + return -1; + } + prepare_secfilters(dvbdmxfeed); + ret=dvbdmx->start_feed(dvbdmxfeed); + if (ret<0) { + up(&dvbdmx->mutex); + return ret; + } + spin_lock_irq(&dvbdmx->lock); + feed->is_filtering=1; + dvbdmxfeed->state=DMX_STATE_GO; + spin_unlock_irq(&dvbdmx->lock); + up(&dvbdmx->mutex); + return 0; +} + +static int +dmx_section_feed_stop_filtering(struct dmx_section_feed_s* feed) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + int ret; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (!dvbdmx->stop_feed) { + up(&dvbdmx->mutex); + return -1; + } + ret=dvbdmx->stop_feed(dvbdmxfeed); + spin_lock_irq(&dvbdmx->lock); + dvbdmxfeed->state=DMX_STATE_READY; + feed->is_filtering=0; + spin_unlock_irq(&dvbdmx->lock); + up(&dvbdmx->mutex); + return ret; +} + +static int +dmx_section_feed_release_filter(dmx_section_feed_t *feed, + dmx_section_filter_t* filter) +{ + dvb_demux_filter_t *dvbdmxfilter=(dvb_demux_filter_t *) filter, *f; + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (dvbdmxfilter->feed!=dvbdmxfeed) { + up(&dvbdmx->mutex); + return -EINVAL; + } + if (feed->is_filtering) + feed->stop_filtering(feed); + + spin_lock_irq(&dvbdmx->lock); + f=dvbdmxfeed->filter; + if (f==dvbdmxfilter) + dvbdmxfeed->filter=dvbdmxfilter->next; + else { + while(f->next!=dvbdmxfilter) + f=f->next; + f->next=f->next->next; + } + dvbdmxfilter->state=DMX_STATE_FREE; + spin_unlock_irq(&dvbdmx->lock); + up(&dvbdmx->mutex); + return 0; +} + +static int dvbdmx_allocate_section_feed(dmx_demux_t *demux, + dmx_section_feed_t **feed, + dmx_section_cb callback) +{ + dvb_demux_t *dvbdmx=(dvb_demux_t *) demux; + dvb_demux_feed_t *dvbdmxfeed; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (!(dvbdmxfeed=DvbDmxFeedAlloc(dvbdmx))) { + up(&dvbdmx->mutex); + return -EBUSY; + } + dvbdmxfeed->type=DMX_TYPE_SEC; + dvbdmxfeed->cb.sec=callback; + dvbdmxfeed->demux=dvbdmx; + dvbdmxfeed->pid=0xffff; + dvbdmxfeed->secbufp=0; + dvbdmxfeed->filter=0; + dvbdmxfeed->buffer=0; + + (*feed)=&dvbdmxfeed->feed.sec; + (*feed)->is_filtering=0; + (*feed)->parent=demux; + (*feed)->priv=0; + (*feed)->set=dmx_section_feed_set; + (*feed)->allocate_filter=dmx_section_feed_allocate_filter; + (*feed)->release_filter=dmx_section_feed_release_filter; + (*feed)->start_filtering=dmx_section_feed_start_filtering; + (*feed)->stop_filtering=dmx_section_feed_stop_filtering; + + up(&dvbdmx->mutex); + return 0; +} + +static int dvbdmx_release_section_feed(dmx_demux_t *demux, + dmx_section_feed_t *feed) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=(dvb_demux_t *) demux; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (dvbdmxfeed->state==DMX_STATE_FREE) { + up(&dvbdmx->mutex); + return -EINVAL; + } +#ifndef NOBUFS + if (dvbdmxfeed->buffer) { + vfree(dvbdmxfeed->buffer); + dvbdmxfeed->buffer=0; + } +#endif + dvbdmxfeed->state=DMX_STATE_FREE; + dvbdmxfeed->demux->pid2feed[dvbdmxfeed->pid]=0; + if (dvbdmxfeed->pid!=0xffff) + dvbdmxfeed->demux->pid2feed[dvbdmxfeed->pid]=0; + up(&dvbdmx->mutex); + return 0; +} + + +/****************************************************************************** + * dvb_demux kernel data API calls + ******************************************************************************/ + +static int dvbdmx_open(dmx_demux_t *demux) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + if (dvbdemux->users>=MAX_DVB_DEMUX_USERS) + return -EUSERS; + dvbdemux->users++; + return 0; +} + +static int dvbdmx_close(struct dmx_demux_s *demux) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + if (dvbdemux->users==0) + return -ENODEV; + dvbdemux->users--; + //FIXME: release any unneeded resources if users==0 + return 0; +} + +static int dvbdmx_write(dmx_demux_t *demux, const char *buf, size_t count) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + if ((!demux->frontend) || + (demux->frontend->source!=DMX_MEMORY_FE)) + return -EINVAL; + + if (down_interruptible (&dvbdemux->mutex)) + return -ERESTARTSYS; + + DvbDmxSWFilter(dvbdemux, buf, count); + up(&dvbdemux->mutex); + return count; +} + + +static int dvbdmx_add_frontend(dmx_demux_t *demux, + dmx_frontend_t *frontend) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + struct list_head *pos, *head=&dvbdemux->frontend_list; + + if (!(frontend->id && frontend->vendor && frontend->model)) + return -EINVAL; + list_for_each(pos, head) + { + if (!strcmp(DMX_FE_ENTRY(pos)->id, frontend->id)) + return -EEXIST; + } + + list_add(&(frontend->connectivity_list), head); + return 0; +} + +static int +dvbdmx_remove_frontend(dmx_demux_t *demux, + dmx_frontend_t *frontend) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + struct list_head *pos, *n, *head=&dvbdemux->frontend_list; + + list_for_each_safe (pos, n, head) + { + if (DMX_FE_ENTRY(pos)==frontend) + { + list_del(pos); + return 0; + } + } + return -ENODEV; +} + +static struct list_head * +dvbdmx_get_frontends(dmx_demux_t *demux) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + if (list_empty(&dvbdemux->frontend_list)) + return NULL; + return &dvbdemux->frontend_list; +} + +static int dvbdmx_connect_frontend(dmx_demux_t *demux, + dmx_frontend_t *frontend) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + if (demux->frontend) + return -EINVAL; + + if (down_interruptible (&dvbdemux->mutex)) + return -ERESTARTSYS; + + demux->frontend=frontend; + up(&dvbdemux->mutex); + return 0; +} + +static int dvbdmx_disconnect_frontend(dmx_demux_t *demux) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + if (down_interruptible (&dvbdemux->mutex)) + return -ERESTARTSYS; + + demux->frontend=NULL; + up(&dvbdemux->mutex); + return 0; +} + +static int dvbdmx_get_pes_pids(dmx_demux_t *demux, u16 *pids) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + memcpy(pids, dvbdemux->pids, 5*sizeof(u16)); + return 0; +} + +int +DvbDmxInit(dvb_demux_t *dvbdemux) +{ + int i; + dmx_demux_t *dmx=&dvbdemux->dmx; + + dvbdemux->users=0; + dvbdemux->filter=vmalloc(dvbdemux->filternum*sizeof(dvb_demux_filter_t)); + if (!dvbdemux->filter) + return -ENOMEM; + + dvbdemux->feed=vmalloc(dvbdemux->feednum*sizeof(dvb_demux_feed_t)); + if (!dvbdemux->feed) { + vfree(dvbdemux->filter); + return -ENOMEM; + } + for (i=0; i<dvbdemux->filternum; i++) { + dvbdemux->filter[i].state=DMX_STATE_FREE; + dvbdemux->filter[i].index=i; + } + for (i=0; i<dvbdemux->feednum; i++) + dvbdemux->feed[i].state=DMX_STATE_FREE; + dvbdemux->frontend_list.next= + dvbdemux->frontend_list.prev= + &dvbdemux->frontend_list; + for (i=0; i<DMX_TS_PES_OTHER; i++) { + dvbdemux->pesfilter[i]=NULL; + dvbdemux->pids[i]=0xffff; + } + dvbdemux->playing=dvbdemux->recording=0; + memset(dvbdemux->pid2feed, 0, (DMX_MAX_PID+1)*sizeof(dvb_demux_feed_t *)); + dvbdemux->tsbufp=0; + + dmx->frontend=0; + dmx->reg_list.next=dmx->reg_list.prev=&dmx->reg_list; + dmx->priv=(void *) dvbdemux; + //dmx->users=0; // reset in dmx_register_demux() + dmx->open=dvbdmx_open; + dmx->close=dvbdmx_close; + dmx->write=dvbdmx_write; + dmx->allocate_ts_feed=dvbdmx_allocate_ts_feed; + dmx->release_ts_feed=dvbdmx_release_ts_feed; + dmx->allocate_section_feed=dvbdmx_allocate_section_feed; + dmx->release_section_feed=dvbdmx_release_section_feed; + + dmx->descramble_mac_address=NULL; + dmx->descramble_section_payload=NULL; + + dmx->add_frontend=dvbdmx_add_frontend; + dmx->remove_frontend=dvbdmx_remove_frontend; + dmx->get_frontends=dvbdmx_get_frontends; + dmx->connect_frontend=dvbdmx_connect_frontend; + dmx->disconnect_frontend=dvbdmx_disconnect_frontend; + dmx->get_pes_pids=dvbdmx_get_pes_pids; + sema_init(&dvbdemux->mutex, 1); + spin_lock_init(&dvbdemux->lock); + + if (dmx_register_demux(dmx)<0) + return -1; + + return 0; +} + +int +DvbDmxRelease(dvb_demux_t *dvbdemux) +{ + dmx_demux_t *dmx=&dvbdemux->dmx; + + dmx_unregister_demux(dmx); + if (dvbdemux->filter) + vfree(dvbdemux->filter); + if (dvbdemux->feed) + vfree(dvbdemux->feed); + return 0; +} + +#if 0 +MODULE_DESCRIPTION("Software MPEG Demultiplexer"); +MODULE_AUTHOR("Ralph Metzler, Markus Metzler"); +MODULE_LICENSE("GPL"); +#endif + diff --git a/drivers/media/dvb/dvb-core/dvb_demux.h b/drivers/media/dvb/dvb-core/dvb_demux.h new file mode 100644 index 000000000000..7fb008c4b355 --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvb_demux.h @@ -0,0 +1,134 @@ +/* + * dvb_demux.h - DVB kernel demux API + * + * Copyright (C) 2000-2001 Marcus Metzler <marcus@convergence.de> + * & Ralph Metzler <ralph@convergence.de> + * for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + + +#ifndef _DVB_DEMUX_H_ +#define _DVB_DEMUX_H_ + +#include "demux.h" + +#define DMX_TYPE_TS 0 +#define DMX_TYPE_SEC 1 +#define DMX_TYPE_PES 2 + +#define DMX_STATE_FREE 0 +#define DMX_STATE_ALLOCATED 1 +#define DMX_STATE_SET 2 +#define DMX_STATE_READY 3 +#define DMX_STATE_GO 4 + +#define DVB_DEMUX_MASK_MAX 18 + +typedef struct dvb_demux_filter_s { + dmx_section_filter_t filter; + u8 maskandmode [DMX_MAX_FILTER_SIZE]; + u8 maskandnotmode [DMX_MAX_FILTER_SIZE]; + int doneq; + + struct dvb_demux_filter_s *next; + struct dvb_demux_feed_s *feed; + int index; + int state; + int type; + int pesto; + + u16 handle; + u16 hw_handle; + struct timer_list timer; + int ts_state; + + //u16 pid; //to be removed +} dvb_demux_filter_t; + +typedef struct dvb_demux_feed_s { + union { + dmx_ts_feed_t ts; + dmx_section_feed_t sec; + } feed; + + union { + dmx_ts_cb ts; + dmx_section_cb sec; + } cb; + + struct dvb_demux_s *demux; + int type; + int state; + u16 pid; + u8 *buffer; + int buffer_size; + int descramble; + int check_crc; + + struct timespec timeout; + dvb_demux_filter_t *filter; + int cb_length; + + int ts_type; + dmx_ts_pes_t pes_type; + + u8 secbuf[4096]; + int secbufp; + int seclen; + int cc; + + u16 peslen; +} dvb_demux_feed_t; + +typedef struct dvb_demux_s { + dmx_demux_t dmx; + void *priv; + int filternum; + int feednum; + int (*start_feed)(dvb_demux_feed_t *); + int (*stop_feed)(dvb_demux_feed_t *); + int (*write_to_decoder)(dvb_demux_feed_t *, u8 *, size_t); + + + int users; +#define MAX_DVB_DEMUX_USERS 10 + dvb_demux_filter_t *filter; + dvb_demux_feed_t *feed; + + struct list_head frontend_list; + + dvb_demux_feed_t *pesfilter[DMX_TS_PES_OTHER]; + u16 pids[DMX_TS_PES_OTHER]; + int playing; + int recording; + +#define DMX_MAX_PID 0x2000 + dvb_demux_feed_t *pid2feed[DMX_MAX_PID+1]; + u8 tsbuf[188]; + int tsbufp; + + struct semaphore mutex; + spinlock_t lock; +} dvb_demux_t; + + +int DvbDmxInit(dvb_demux_t *dvbdemux); +int DvbDmxRelease(dvb_demux_t *dvbdemux); +void DvbDmxSWFilterPackets(dvb_demux_t *dvbdmx, const u8 *buf, int count); + +#endif /* _DVB_DEMUX_H_ */ diff --git a/drivers/media/dvb/dvb-core/dvb_filter.c b/drivers/media/dvb/dvb-core/dvb_filter.c new file mode 100644 index 000000000000..4b6ef6d32caa --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvb_filter.c @@ -0,0 +1,962 @@ +#include <linux/module.h> +#include <linux/videodev.h> +#include "dvb_filter.h" + +unsigned int bitrates[3][16] = +{{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0}, + {0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,0}, + {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}}; + +uint32_t freq[4] = {441, 480, 320, 0}; + +unsigned int ac3_bitrates[32] = + {32,40,48,56,64,80,96,112,128,160,192,224,256,320,384,448,512,576,640, + 0,0,0,0,0,0,0,0,0,0,0,0,0}; + +uint32_t ac3_freq[4] = {480, 441, 320, 0}; +uint32_t ac3_frames[3][32] = + {{64,80,96,112,128,160,192,224,256,320,384,448,512,640,768,896,1024, + 1152,1280,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {69,87,104,121,139,174,208,243,278,348,417,487,557,696,835,975,1114, + 1253,1393,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {96,120,144,168,192,240,288,336,384,480,576,672,768,960,1152,1344, + 1536,1728,1920,0,0,0,0,0,0,0,0,0,0,0,0,0}}; + + + +void pes2ts_init(pes2ts_t *p2ts, unsigned short pid, + pes2ts_cb_t *cb, void *priv) +{ + unsigned char *buf=p2ts->buf; + + buf[0]=0x47; + buf[1]=(pid>>8); + buf[2]=pid&0xff; + p2ts->cc=0; + p2ts->cb=cb; + p2ts->priv=priv; +} + +int pes2ts(pes2ts_t *p2ts, unsigned char *pes, int len) +{ + unsigned char *buf=p2ts->buf; + int ret=0, rest; + + //len=6+((pes[4]<<8)|pes[5]); + + buf[1]|=0x40; + while (len>=184) { + buf[3]=0x10|((p2ts->cc++)&0x0f); + memcpy(buf+4, pes, 184); + if ((ret=p2ts->cb(p2ts->priv, buf))) + return ret; + len-=184; pes+=184; + buf[1]&=~0x40; + } + if (!len) + return 0; + buf[3]=0x30|((p2ts->cc++)&0x0f); + rest=183-len; + if (rest) { + buf[5]=0x00; + if (rest-1) + memset(buf+6, 0xff, rest-1); + } + buf[4]=rest; + memcpy(buf+5+rest, pes, len); + return p2ts->cb(p2ts->priv, buf); +} + +void reset_ipack(ipack *p) +{ + p->found = 0; + p->cid = 0; + p->plength = 0; + p->flag1 = 0; + p->flag2 = 0; + p->hlength = 0; + p->mpeg = 0; + p->check = 0; + p->which = 0; + p->done = 0; + p->count = 0; +} + +void init_ipack(ipack *p, int size, + void (*func)(u8 *buf, int size, void *priv)) +{ + if ( !(p->buf = vmalloc(size*sizeof(u8))) ){ + printk ("Couldn't allocate memory for ipack\n"); + } + p->size = size; + p->func = func; + p->repack_subids = 0; + reset_ipack(p); +} + +void free_ipack(ipack * p) +{ + if (p->buf) vfree(p->buf); +} + +void send_ipack(ipack *p) +{ + int off; + AudioInfo ai; + int ac3_off = 0; + int streamid=0; + int nframes= 0; + int f=0; + + switch ( p->mpeg ){ + case 2: + if (p->count < 10) return; + p->buf[3] = p->cid; + + p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8); + p->buf[5] = (u8)((p->count-6) & 0x00FF); + if (p->repack_subids && p->cid == PRIVATE_STREAM1){ + + off = 9+p->buf[8]; + streamid = p->buf[off]; + if ((streamid & 0xF8) == 0x80){ + ai.off = 0; + ac3_off = ((p->buf[off+2] << 8)| + p->buf[off+3]); + if (ac3_off < p->count) + f=get_ac3info(p->buf+off+3+ac3_off, + p->count-ac3_off, &ai,0); + if ( !f ){ + nframes = (p->count-off-3-ac3_off)/ + ai.framesize + 1; + p->buf[off+2] = (ac3_off >> 8)& 0xFF; + p->buf[off+3] = (ac3_off)& 0xFF; + p->buf[off+1] = nframes; + + ac3_off += nframes * ai.framesize - + p->count; + } + } + } + p->func(p->buf, p->count, p->data); + + p->buf[6] = 0x80; + p->buf[7] = 0x00; + p->buf[8] = 0x00; + p->count = 9; + if (p->repack_subids && p->cid == PRIVATE_STREAM1 + && (streamid & 0xF8)==0x80 ){ + p->count += 4; + p->buf[9] = streamid; + p->buf[10] = (ac3_off >> 8)& 0xFF; + p->buf[11] = (ac3_off)& 0xFF; + p->buf[12] = 0; + } + + break; + case 1: + if (p->count < 8) return; + p->buf[3] = p->cid; + + p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8); + p->buf[5] = (u8)((p->count-6) & 0x00FF); + p->func(p->buf, p->count, p->data); + + p->buf[6] = 0x0F; + p->count = 7; + break; + } +} + +void send_ipack_rest(ipack *p) +{ + if (p->plength != MMAX_PLENGTH-6 || p->found<=6) + return; + p->plength = p->found-6; + p->found = 0; + send_ipack(p); + reset_ipack(p); +} + +static void write_ipack(ipack *p, u8 *data, int count) +{ + u8 headr[3] = { 0x00, 0x00, 0x01} ; + + if (p->count < 6){ + memcpy(p->buf, headr, 3); + p->count = 6; + } + + if (p->count + count < p->size){ + memcpy(p->buf+p->count, data, count); + p->count += count; + } else { + int rest = p->size - p->count; + memcpy(p->buf+p->count, data, rest); + p->count += rest; + send_ipack(p); + if (count - rest > 0) + write_ipack(p, data+rest, count-rest); + } +} + +int instant_repack(u8 *buf, int count, ipack *p) +{ + int l; + int c=0; + + while (c < count && (p->mpeg == 0 || + (p->mpeg == 1 && p->found < 7) || + (p->mpeg == 2 && p->found < 9)) + && (p->found < 5 || !p->done)){ + switch ( p->found ){ + case 0: + case 1: + if (buf[c] == 0x00) p->found++; + else p->found = 0; + c++; + break; + case 2: + if (buf[c] == 0x01) p->found++; + else if (buf[c] == 0) { + p->found = 2; + } else p->found = 0; + c++; + break; + case 3: + p->cid = 0; + switch (buf[c]){ + case PROG_STREAM_MAP: + case PRIVATE_STREAM2: + case PROG_STREAM_DIR: + case ECM_STREAM : + case EMM_STREAM : + case PADDING_STREAM : + case DSM_CC_STREAM : + case ISO13522_STREAM: + p->done = 1; + case PRIVATE_STREAM1: + case VIDEO_STREAM_S ... VIDEO_STREAM_E: + case AUDIO_STREAM_S ... AUDIO_STREAM_E: + p->found++; + p->cid = buf[c]; + c++; + break; + default: + p->found = 0; + break; + } + break; + + case 4: + if (count-c > 1){ + p->plen[0] = buf[c]; + c++; + p->plen[1] = buf[c]; + c++; + p->found+=2; + p->plength=(p->plen[0]<<8)|p->plen[1]; + } else { + p->plen[0] = buf[c]; + p->found++; + return count; + } + break; + case 5: + p->plen[1] = buf[c]; + c++; + p->found++; + p->plength=(p->plen[0]<<8)|p->plen[1]; + break; + case 6: + if (!p->done){ + p->flag1 = buf[c]; + c++; + p->found++; + if ( (p->flag1 & 0xC0) == 0x80 ) p->mpeg = 2; + else { + p->hlength = 0; + p->which = 0; + p->mpeg = 1; + p->flag2 = 0; + } + } + break; + + case 7: + if ( !p->done && p->mpeg == 2) { + p->flag2 = buf[c]; + c++; + p->found++; + } + break; + + case 8: + if ( !p->done && p->mpeg == 2) { + p->hlength = buf[c]; + c++; + p->found++; + } + break; + + default: + + break; + } + } + + if (c == count) return count; + + if (!p->plength) p->plength = MMAX_PLENGTH-6; + + if ( p->done || ((p->mpeg == 2 && p->found >= 9) || + (p->mpeg == 1 && p->found >= 7)) ){ + switch (p->cid){ + + case AUDIO_STREAM_S ... AUDIO_STREAM_E: + case VIDEO_STREAM_S ... VIDEO_STREAM_E: + case PRIVATE_STREAM1: + + if (p->mpeg == 2 && p->found == 9) { + write_ipack(p, &p->flag1, 1); + write_ipack(p, &p->flag2, 1); + write_ipack(p, &p->hlength, 1); + } + + if (p->mpeg == 1 && p->found == 7) + write_ipack(p, &p->flag1, 1); + + if (p->mpeg == 2 && (p->flag2 & PTS_ONLY) && + p->found < 14) { + while (c < count && p->found < 14) { + p->pts[p->found-9] = buf[c]; + write_ipack(p, buf+c, 1); + c++; + p->found++; + } + if (c == count) return count; + } + + if (p->mpeg == 1 && p->which < 2000) { + + if (p->found == 7) { + p->check = p->flag1; + p->hlength = 1; + } + + while (!p->which && c < count && + p->check == 0xFF){ + p->check = buf[c]; + write_ipack(p, buf+c, 1); + c++; + p->found++; + p->hlength++; + } + + if ( c == count) return count; + + if ( (p->check & 0xC0) == 0x40 && !p->which){ + p->check = buf[c]; + write_ipack(p, buf+c, 1); + c++; + p->found++; + p->hlength++; + + p->which = 1; + if ( c == count) return count; + p->check = buf[c]; + write_ipack(p, buf+c, 1); + c++; + p->found++; + p->hlength++; + p->which = 2; + if ( c == count) return count; + } + + if (p->which == 1){ + p->check = buf[c]; + write_ipack(p, buf+c, 1); + c++; + p->found++; + p->hlength++; + p->which = 2; + if ( c == count) return count; + } + + if ( (p->check & 0x30) && p->check != 0xFF){ + p->flag2 = (p->check & 0xF0) << 2; + p->pts[0] = p->check; + p->which = 3; + } + + if ( c == count) return count; + if (p->which > 2){ + if ((p->flag2 & PTS_DTS_FLAGS) + == PTS_ONLY){ + while (c < count && + p->which < 7){ + p->pts[p->which-2] = + buf[c]; + write_ipack(p,buf+c,1); + c++; + p->found++; + p->which++; + p->hlength++; + } + if ( c == count) return count; + } else if ((p->flag2 & PTS_DTS_FLAGS) + == PTS_DTS){ + while (c < count && + p->which< 12){ + if (p->which< 7) + p->pts[p->which + -2] = + buf[c]; + write_ipack(p,buf+c,1); + c++; + p->found++; + p->which++; + p->hlength++; + } + if ( c == count) return count; + } + p->which = 2000; + } + + } + + while (c < count && p->found < p->plength+6){ + l = count -c; + if (l+p->found > p->plength+6) + l = p->plength+6-p->found; + write_ipack(p, buf+c, l); + p->found += l; + c += l; + } + + break; + } + + + if ( p->done ){ + if( p->found + count - c < p->plength+6){ + p->found += count-c; + c = count; + } else { + c += p->plength+6 - p->found; + p->found = p->plength+6; + } + } + + if (p->plength && p->found == p->plength+6) { + send_ipack(p); + reset_ipack(p); + if (c < count) + instant_repack(buf+c, count-c, p); + } + } + return count; +} + + + +void setup_ts2pes(ipack *pa, ipack *pv, u16 *pida, u16 *pidv, + void (*pes_write)(u8 *buf, int count, void *data), + void *priv) +{ + init_ipack(pa, IPACKS, pes_write); + init_ipack(pv, IPACKS, pes_write); + pa->pid = pida; + pv->pid = pidv; + pa->data = priv; + pv->data = priv; +} + +void ts_to_pes(ipack *p, u8 *buf) // don't need count (=188) +{ + u8 off = 0; + + if (!buf || !p ){ + printk("NULL POINTER IDIOT\n"); + return; + } + if (buf[1]&PAY_START) { + if (p->plength == MMAX_PLENGTH-6 && p->found>6){ + p->plength = p->found-6; + p->found = 0; + send_ipack(p); + reset_ipack(p); + } + } + if (buf[3] & ADAPT_FIELD) { // adaptation field? + off = buf[4] + 1; + if (off+4 > 187) return; + } + instant_repack(buf+4+off, TS_SIZE-4-off, p); +} + +/* needs 5 byte input, returns picture coding type*/ +int read_picture_header(uint8_t *headr, mpg_picture *pic, int field, int pr) +{ + uint8_t pct; + + if (pr) printk( "Pic header: "); + pic->temporal_reference[field] = (( headr[0] << 2 ) | + (headr[1] & 0x03) )& 0x03ff; + if (pr) printk( " temp ref: 0x%04x", pic->temporal_reference[field]); + + pct = ( headr[1] >> 2 ) & 0x07; + pic->picture_coding_type[field] = pct; + if (pr) { + switch(pct){ + case I_FRAME: + printk( " I-FRAME"); + break; + case B_FRAME: + printk( " B-FRAME"); + break; + case P_FRAME: + printk( " P-FRAME"); + break; + } + } + + + pic->vinfo.vbv_delay = (( headr[1] >> 5 ) | ( headr[2] << 3) | + ( (headr[3] & 0x1F) << 11) ) & 0xffff; + + if (pr) printk( " vbv delay: 0x%04x", pic->vinfo.vbv_delay); + + pic->picture_header_parameter = ( headr[3] & 0xe0 ) | + ((headr[4] & 0x80) >> 3); + + if ( pct == B_FRAME ){ + pic->picture_header_parameter |= ( headr[4] >> 3 ) & 0x0f; + } + if (pr) printk( " pic head param: 0x%x", + pic->picture_header_parameter); + + return pct; +} + + +/* needs 4 byte input */ +int read_gop_header(uint8_t *headr, mpg_picture *pic, int pr) +{ + if (pr) printk("GOP header: "); + + pic->time_code = (( headr[0] << 17 ) | ( headr[1] << 9) | + ( headr[2] << 1 ) | (headr[3] &0x01)) & 0x1ffffff; + + if (pr) printk(" time: %d:%d.%d ", (headr[0]>>2)& 0x1F, + ((headr[0]<<4)& 0x30)| ((headr[1]>>4)& 0x0F), + ((headr[1]<<3)& 0x38)| ((headr[2]>>5)& 0x0F)); + + if ( ( headr[3] & 0x40 ) != 0 ){ + pic->closed_gop = 1; + } else { + pic->closed_gop = 0; + } + if (pr) printk("closed: %d", pic->closed_gop); + + if ( ( headr[3] & 0x20 ) != 0 ){ + pic->broken_link = 1; + } else { + pic->broken_link = 0; + } + if (pr) printk(" broken: %d\n", pic->broken_link); + + return 0; +} + +/* needs 8 byte input */ +int read_sequence_header(uint8_t *headr, VideoInfo *vi, int pr) +{ + int sw; + int form = -1; + + if (pr) printk("Reading sequence header\n"); + + vi->horizontal_size = ((headr[1] &0xF0) >> 4) | (headr[0] << 4); + vi->vertical_size = ((headr[1] &0x0F) << 8) | (headr[2]); + + sw = (int)((headr[3]&0xF0) >> 4) ; + + switch( sw ){ + case 1: + if (pr) + printk("Videostream: ASPECT: 1:1"); + vi->aspect_ratio = 100; + break; + case 2: + if (pr) + printk("Videostream: ASPECT: 4:3"); + vi->aspect_ratio = 133; + break; + case 3: + if (pr) + printk("Videostream: ASPECT: 16:9"); + vi->aspect_ratio = 177; + break; + case 4: + if (pr) + printk("Videostream: ASPECT: 2.21:1"); + vi->aspect_ratio = 221; + break; + + case 5 ... 15: + if (pr) + printk("Videostream: ASPECT: reserved"); + vi->aspect_ratio = 0; + break; + + default: + vi->aspect_ratio = 0; + return -1; + } + + if (pr) + printk(" Size = %dx%d",vi->horizontal_size,vi->vertical_size); + + sw = (int)(headr[3]&0x0F); + + switch ( sw ) { + case 1: + if (pr) + printk(" FRate: 23.976 fps"); + vi->framerate = 23976; + form = -1; + break; + case 2: + if (pr) + printk(" FRate: 24 fps"); + vi->framerate = 24000; + form = -1; + break; + case 3: + if (pr) + printk(" FRate: 25 fps"); + vi->framerate = 25000; + form = VIDEO_MODE_PAL; + break; + case 4: + if (pr) + printk(" FRate: 29.97 fps"); + vi->framerate = 29970; + form = VIDEO_MODE_NTSC; + break; + case 5: + if (pr) + printk(" FRate: 30 fps"); + vi->framerate = 30000; + form = VIDEO_MODE_NTSC; + break; + case 6: + if (pr) + printk(" FRate: 50 fps"); + vi->framerate = 50000; + form = VIDEO_MODE_PAL; + break; + case 7: + if (pr) + printk(" FRate: 60 fps"); + vi->framerate = 60000; + form = VIDEO_MODE_NTSC; + break; + } + + vi->bit_rate = (headr[4] << 10) | (headr[5] << 2) | (headr[6] & 0x03); + + vi->vbv_buffer_size + = (( headr[6] & 0xF8) >> 3 ) | (( headr[7] & 0x1F )<< 5); + + if (pr){ + printk(" BRate: %d Mbit/s",4*(vi->bit_rate)/10000); + printk(" vbvbuffer %d",16*1024*(vi->vbv_buffer_size)); + printk("\n"); + } + + vi->video_format = form; + + return 0; +} + +int get_vinfo(uint8_t *mbuf, int count, VideoInfo *vi, int pr) +{ + uint8_t *headr; + int found = 0; + int c = 0; + + while (found < 4 && c+4 < count){ + uint8_t *b; + + b = mbuf+c; + if ( b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01 + && b[3] == 0xb3) found = 4; + else { + c++; + } + } + + if (! found) return -1; + c += 4; + if (c+12 >= count) return -1; + headr = mbuf+c; + if (read_sequence_header(headr, vi, pr) < 0) return -1; + vi->off = c-4; + return 0; +} + +int get_ainfo(uint8_t *mbuf, int count, AudioInfo *ai, int pr) +{ + uint8_t *headr; + int found = 0; + int c = 0; + int fr = 0; + + while (found < 2 && c < count){ + uint8_t b[2]; + memcpy( b, mbuf+c, 2); + + if ( b[0] == 0xff && (b[1] & 0xf8) == 0xf8) + found = 2; + else { + c++; + } + } + + if (!found) return -1; + + if (c+3 >= count) return -1; + headr = mbuf+c; + + ai->layer = (headr[1] & 0x06) >> 1; + + if (pr) + printk("Audiostream: Layer: %d", 4-ai->layer); + + + ai->bit_rate = bitrates[(3-ai->layer)][(headr[2] >> 4 )]*1000; + + if (pr){ + if (ai->bit_rate == 0) + printk(" Bit rate: free"); + else if (ai->bit_rate == 0xf) + printk(" BRate: reserved"); + else + printk(" BRate: %d kb/s", ai->bit_rate/1000); + } + + fr = (headr[2] & 0x0c ) >> 2; + ai->frequency = freq[fr]*100; + if (pr){ + if (ai->frequency == 3) + printk(" Freq: reserved\n"); + else + printk(" Freq: %d kHz\n",ai->frequency); + + } + ai->off = c; + return 0; +} + +int get_ac3info(uint8_t *mbuf, int count, AudioInfo *ai, int pr) +{ + uint8_t *headr; + int found = 0; + int c = 0; + uint8_t frame = 0; + int fr = 0; + + while ( !found && c < count){ + uint8_t *b = mbuf+c; + + if ( b[0] == 0x0b && b[1] == 0x77 ) + found = 1; + else { + c++; + } + } + + if (!found) return -1; + if (pr) + printk("Audiostream: AC3"); + + ai->off = c; + if (c+5 >= count) return -1; + + ai->layer = 0; // 0 for AC3 + headr = mbuf+c+2; + + frame = (headr[2]&0x3f); + ai->bit_rate = ac3_bitrates[frame >> 1]*1000; + + if (pr) + printk(" BRate: %d kb/s", ai->bit_rate/1000); + + ai->frequency = (headr[2] & 0xc0 ) >> 6; + fr = (headr[2] & 0xc0 ) >> 6; + ai->frequency = freq[fr]*100; + if (pr) printk (" Freq: %d Hz\n", ai->frequency); + + + ai->framesize = ac3_frames[fr][frame >> 1]; + if ((frame & 1) && (fr == 1)) ai->framesize++; + ai->framesize = ai->framesize << 1; + if (pr) printk (" Framesize %d\n", ai->framesize); + + + return 0; +} + +uint8_t *skip_pes_header(uint8_t **bufp) +{ + uint8_t *inbuf = *bufp; + uint8_t *buf = inbuf; + uint8_t *pts = NULL; + int skip = 0; + +int mpeg1_skip_table[16] = { + 1, 0xffff, 5, 10, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff +}; + + + if ((inbuf[6] & 0xc0) == 0x80){ /* mpeg2 */ + if (buf[7] & PTS_ONLY) + pts = buf+9; + else pts = NULL; + buf = inbuf + 9 + inbuf[8]; + } else { /* mpeg1 */ + for (buf = inbuf + 6; *buf == 0xff; buf++) + if (buf == inbuf + 6 + 16) { + break; + } + if ((*buf & 0xc0) == 0x40) + buf += 2; + skip = mpeg1_skip_table [*buf >> 4]; + if (skip == 5 || skip == 10) pts = buf; + else pts = NULL; + + buf += mpeg1_skip_table [*buf >> 4]; + } + + *bufp = buf; + return pts; +} + + +void initialize_quant_matrix( uint32_t *matrix ) +{ + int i; + + matrix[0] = 0x08101013; + matrix[1] = 0x10131616; + matrix[2] = 0x16161616; + matrix[3] = 0x1a181a1b; + matrix[4] = 0x1b1b1a1a; + matrix[5] = 0x1a1a1b1b; + matrix[6] = 0x1b1d1d1d; + matrix[7] = 0x2222221d; + matrix[8] = 0x1d1d1b1b; + matrix[9] = 0x1d1d2020; + matrix[10] = 0x22222526; + matrix[11] = 0x25232322; + matrix[12] = 0x23262628; + matrix[13] = 0x28283030; + matrix[14] = 0x2e2e3838; + matrix[15] = 0x3a454553; + + for ( i = 16 ; i < 32 ; i++ ) + matrix[i] = 0x10101010; +} + +void initialize_mpg_picture(mpg_picture *pic) +{ + int i; + + /* set MPEG1 */ + pic->mpeg1_flag = 1; + pic->profile_and_level = 0x4A ; /* MP@LL */ + pic->progressive_sequence = 1; + pic->low_delay = 0; + + pic->sequence_display_extension_flag = 0; + for ( i = 0 ; i < 4 ; i++ ){ + pic->frame_centre_horizontal_offset[i] = 0; + pic->frame_centre_vertical_offset[i] = 0; + } + pic->last_frame_centre_horizontal_offset = 0; + pic->last_frame_centre_vertical_offset = 0; + + pic->picture_display_extension_flag[0] = 0; + pic->picture_display_extension_flag[1] = 0; + pic->sequence_header_flag = 0; + pic->gop_flag = 0; + pic->sequence_end_flag = 0; +} + + +void mpg_set_picture_parameter( int32_t field_type, mpg_picture *pic ) +{ + int16_t last_h_offset; + int16_t last_v_offset; + + int16_t *p_h_offset; + int16_t *p_v_offset; + + if ( pic->mpeg1_flag ){ + pic->picture_structure[field_type] = VIDEO_FRAME_PICTURE; + pic->top_field_first = 0; + pic->repeat_first_field = 0; + pic->progressive_frame = 1; + pic->picture_coding_parameter = 0x000010; + } + + /* Reset flag */ + pic->picture_display_extension_flag[field_type] = 0; + + last_h_offset = pic->last_frame_centre_horizontal_offset; + last_v_offset = pic->last_frame_centre_vertical_offset; + if ( field_type == FIRST_FIELD ){ + p_h_offset = pic->frame_centre_horizontal_offset; + p_v_offset = pic->frame_centre_vertical_offset; + *p_h_offset = last_h_offset; + *(p_h_offset + 1) = last_h_offset; + *(p_h_offset + 2) = last_h_offset; + *p_v_offset = last_v_offset; + *(p_v_offset + 1) = last_v_offset; + *(p_v_offset + 2) = last_v_offset; + } else { + pic->frame_centre_horizontal_offset[3] = last_h_offset; + pic->frame_centre_vertical_offset[3] = last_v_offset; + } +} + +void init_mpg_picture( mpg_picture *pic, int chan, int32_t field_type) +{ + pic->picture_header = 0; + pic->sequence_header_data + = ( INIT_HORIZONTAL_SIZE << 20 ) + | ( INIT_VERTICAL_SIZE << 8 ) + | ( INIT_ASPECT_RATIO << 4 ) + | ( INIT_FRAME_RATE ); + pic->mpeg1_flag = 0; + pic->vinfo.horizontal_size + = INIT_DISP_HORIZONTAL_SIZE; + pic->vinfo.vertical_size + = INIT_DISP_VERTICAL_SIZE; + pic->picture_display_extension_flag[field_type] + = 0; + pic->pts_flag[field_type] = 0; + + pic->sequence_gop_header = 0; + pic->picture_header = 0; + pic->sequence_header_flag = 0; + pic->gop_flag = 0; + pic->sequence_end_flag = 0; + pic->sequence_display_extension_flag = 0; + pic->last_frame_centre_horizontal_offset = 0; + pic->last_frame_centre_vertical_offset = 0; + pic->channel = chan; +} diff --git a/drivers/media/dvb/dvb-core/dvb_filter.h b/drivers/media/dvb/dvb-core/dvb_filter.h new file mode 100644 index 000000000000..062fdcae46a8 --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvb_filter.h @@ -0,0 +1,249 @@ +#ifndef _DVB_FILTER_H_ +#define _DVB_FILTER_H_ + +#include <linux/slab.h> +#include <linux/vmalloc.h> + +#include "demux.h" + +typedef int (pes2ts_cb_t) (void *, unsigned char *); + +typedef struct pes2ts_s { + unsigned char buf[188]; + unsigned char cc; + pes2ts_cb_t *cb; + void *priv; +} pes2ts_t; + +void pes2ts_init(pes2ts_t *p2ts, unsigned short pid, + pes2ts_cb_t *cb, void *priv); +int pes2ts(pes2ts_t *p2ts, unsigned char *pes, int len); + + +#define PROG_STREAM_MAP 0xBC +#define PRIVATE_STREAM1 0xBD +#define PADDING_STREAM 0xBE +#define PRIVATE_STREAM2 0xBF +#define AUDIO_STREAM_S 0xC0 +#define AUDIO_STREAM_E 0xDF +#define VIDEO_STREAM_S 0xE0 +#define VIDEO_STREAM_E 0xEF +#define ECM_STREAM 0xF0 +#define EMM_STREAM 0xF1 +#define DSM_CC_STREAM 0xF2 +#define ISO13522_STREAM 0xF3 +#define PROG_STREAM_DIR 0xFF + +#define PICTURE_START 0x00 +#define USER_START 0xb2 +#define SEQUENCE_HEADER 0xb3 +#define SEQUENCE_ERROR 0xb4 +#define EXTENSION_START 0xb5 +#define SEQUENCE_END 0xb7 +#define GOP_START 0xb8 +#define EXCEPT_SLICE 0xb0 + +#define SEQUENCE_EXTENSION 0x01 +#define SEQUENCE_DISPLAY_EXTENSION 0x02 +#define PICTURE_CODING_EXTENSION 0x08 +#define QUANT_MATRIX_EXTENSION 0x03 +#define PICTURE_DISPLAY_EXTENSION 0x07 + +#define I_FRAME 0x01 +#define B_FRAME 0x02 +#define P_FRAME 0x03 + +/* Initialize sequence_data */ +#define INIT_HORIZONTAL_SIZE 720 +#define INIT_VERTICAL_SIZE 576 +#define INIT_ASPECT_RATIO 0x02 +#define INIT_FRAME_RATE 0x03 +#define INIT_DISP_HORIZONTAL_SIZE 540 +#define INIT_DISP_VERTICAL_SIZE 576 + + +//flags2 +#define PTS_DTS_FLAGS 0xC0 +#define ESCR_FLAG 0x20 +#define ES_RATE_FLAG 0x10 +#define DSM_TRICK_FLAG 0x08 +#define ADD_CPY_FLAG 0x04 +#define PES_CRC_FLAG 0x02 +#define PES_EXT_FLAG 0x01 + +//pts_dts flags +#define PTS_ONLY 0x80 +#define PTS_DTS 0xC0 + +#define TS_SIZE 188 +#define TRANS_ERROR 0x80 +#define PAY_START 0x40 +#define TRANS_PRIO 0x20 +#define PID_MASK_HI 0x1F +//flags +#define TRANS_SCRMBL1 0x80 +#define TRANS_SCRMBL2 0x40 +#define ADAPT_FIELD 0x20 +#define PAYLOAD 0x10 +#define COUNT_MASK 0x0F + +// adaptation flags +#define DISCON_IND 0x80 +#define RAND_ACC_IND 0x40 +#define ES_PRI_IND 0x20 +#define PCR_FLAG 0x10 +#define OPCR_FLAG 0x08 +#define SPLICE_FLAG 0x04 +#define TRANS_PRIV 0x02 +#define ADAP_EXT_FLAG 0x01 + +// adaptation extension flags +#define LTW_FLAG 0x80 +#define PIECE_RATE 0x40 +#define SEAM_SPLICE 0x20 + + +#define MAX_PLENGTH 0xFFFF +#define MMAX_PLENGTH (256*MAX_PLENGTH) + +#ifndef IPACKS +#define IPACKS 2048 +#endif + +typedef struct ipack_s { + int size; + int found; + u8 *buf; + u8 cid; + uint32_t plength; + u8 plen[2]; + u8 flag1; + u8 flag2; + u8 hlength; + u8 pts[5]; + u16 *pid; + int mpeg; + u8 check; + int which; + int done; + void *data; + void (*func)(u8 *buf, int size, void *priv); + int count; + int repack_subids; +} ipack; + +typedef struct video_i{ + uint32_t horizontal_size; + uint32_t vertical_size; + uint32_t aspect_ratio; + uint32_t framerate; + uint32_t video_format; + uint32_t bit_rate; + uint32_t comp_bit_rate; + uint32_t vbv_buffer_size; + int16_t vbv_delay; + uint32_t CSPF; + uint32_t off; +} VideoInfo; + + +#define OFF_SIZE 4 +#define FIRST_FIELD 0 +#define SECOND_FIELD 1 +#define VIDEO_FRAME_PICTURE 0x03 + +typedef struct mpg_picture_s{ + int channel; + VideoInfo vinfo; + uint32_t *sequence_gop_header; + uint32_t *picture_header; + int32_t time_code; + int low_delay; + int closed_gop; + int broken_link; + int sequence_header_flag; + int gop_flag; + int sequence_end_flag; + + uint8_t profile_and_level; + int32_t picture_coding_parameter; + uint32_t matrix[32]; + int8_t matrix_change_flag; + + uint8_t picture_header_parameter; + /* bit 0 - 2: bwd f code + bit 3 : fpb vector + bit 4 - 6: fwd f code + bit 7 : fpf vector */ + + int mpeg1_flag; + int progressive_sequence; + int sequence_display_extension_flag; + uint32_t sequence_header_data; + int16_t last_frame_centre_horizontal_offset; + int16_t last_frame_centre_vertical_offset; + + uint32_t pts[2]; /* [0] 1st field, [1] 2nd field */ + int top_field_first; + int repeat_first_field; + int progressive_frame; + int bank; + int forward_bank; + int backward_bank; + int compress; + int16_t frame_centre_horizontal_offset[OFF_SIZE]; + /* [0-2] 1st field, [3] 2nd field */ + int16_t frame_centre_vertical_offset[OFF_SIZE]; + /* [0-2] 1st field, [3] 2nd field */ + int16_t temporal_reference[2]; + /* [0] 1st field, [1] 2nd field */ + + int8_t picture_coding_type[2]; + /* [0] 1st field, [1] 2nd field */ + int8_t picture_structure[2]; + /* [0] 1st field, [1] 2nd field */ + int8_t picture_display_extension_flag[2]; + /* [0] 1st field, [1] 2nd field */ + /* picture_display_extenion() 0:no 1:exit*/ + int8_t pts_flag[2]; + /* [0] 1st field, [1] 2nd field */ +} mpg_picture; + + + + +typedef struct audio_i{ + int layer ; + uint32_t bit_rate ; + uint32_t frequency ; + uint32_t mode ; + uint32_t mode_extension ; + uint32_t emphasis ; + uint32_t framesize; + uint32_t off; +} AudioInfo; + + +void reset_ipack(ipack *p); +int instant_repack(u8 *buf, int count, ipack *p); +void init_ipack(ipack *p, int size, + void (*func)(u8 *buf, int size, void *priv)); +void free_ipack(ipack * p); +void setup_ts2pes(ipack *pa, ipack *pv, u16 *pida, u16 *pidv, + void (*pes_write)(u8 *buf, int count, void *data), + void *priv); +void ts_to_pes(ipack *p, u8 *buf); +void send_ipack(ipack *p); +void send_ipack_rest(ipack *p); +int get_ainfo(uint8_t *mbuf, int count, AudioInfo *ai, int pr); +int get_ac3info(uint8_t *mbuf, int count, AudioInfo *ai, int pr); +int get_vinfo(uint8_t *mbuf, int count, VideoInfo *vi, int pr); +uint8_t *skip_pes_header(uint8_t **bufp); +void initialize_quant_matrix( uint32_t *matrix ); +void initialize_mpg_picture(mpg_picture *pic); +void init_mpg_picture( mpg_picture *pic, int chan, int32_t field_type); +void mpg_set_picture_parameter( int32_t field_type, mpg_picture *pic ); +int read_sequence_header(uint8_t *headr, VideoInfo *vi, int pr); +int read_gop_header(uint8_t *headr, mpg_picture *pic, int pr); +int read_picture_header(uint8_t *headr, mpg_picture *pic, int field, int pr); +#endif diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c new file mode 100644 index 000000000000..f64279a047a4 --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c @@ -0,0 +1,938 @@ +/* + * dvb-core.c: DVB core driver + * + * Copyright (C) 1999-2001 Ralph Metzler + * Marcus Metzler + * Holger Waechtler + * for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Or, point your browser to http://www.gnu.org/copyleft/gpl.html + */ + +#include <linux/sched.h> +#include <linux/smp_lock.h> +#include <linux/slab.h> +#include <linux/poll.h> +#include <linux/module.h> +#include <linux/compatmac.h> +#include <linux/list.h> + +#include "compat.h" +#include "dvb_frontend.h" +#include "dvbdev.h" + + +static int dvb_frontend_debug = 0; +static int dvb_shutdown_timeout = 0; + +#define dprintk if (dvb_frontend_debug) printk + +#define MAX_EVENT 8 + +struct dvb_fe_events { + struct dvb_frontend_event events[MAX_EVENT]; + int eventw; + int eventr; + int overflow; + wait_queue_head_t wait_queue; + struct semaphore sem; +}; + + +struct dvb_fe_notifier_callbacks { + struct list_head list_head; + void (*callback) (fe_status_t s, void *data); + void *data; +}; + + +struct dvb_frontend_data { + struct dvb_frontend_info *info; + struct dvb_frontend frontend; + struct dvb_device *dvbdev; + struct list_head notifier_callbacks; + struct dvb_frontend_parameters parameters; + struct dvb_fe_events events; + struct semaphore sem; + struct list_head list_head; + wait_queue_head_t wait_queue; + struct task_struct *thread; + unsigned long release_jiffies; + unsigned long lost_sync_jiffies; + int bending; + int lnb_drift; + int timeout_count; + int lost_sync_count; + int exit; + fe_status_t status; +}; + + +struct dvb_frontend_ioctl_data { + struct list_head list_head; + struct dvb_adapter_s *adapter; + int (*before_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg); + int (*after_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg); + void *before_after_data; +}; + + +static LIST_HEAD(frontend_list); +static LIST_HEAD(frontend_ioctl_list); + +static DECLARE_MUTEX(frontend_mutex); + + +static +inline void ddelay (int ms) +{ + current->state=TASK_INTERRUPTIBLE; + schedule_timeout((HZ*ms)/1000); +} + + +static +int dvb_frontend_internal_ioctl (struct dvb_frontend *frontend, + unsigned int cmd, void *arg) +{ + int err = -EOPNOTSUPP; + + dprintk ("%s\n", __FUNCTION__); + + if (frontend->before_ioctl) + err = frontend->before_ioctl (frontend, cmd, arg); + + if (err) { + err = frontend->ioctl (frontend, cmd, arg); + + if (err && frontend->after_ioctl) + err = frontend->after_ioctl (frontend, cmd, arg); + } + + return err; +} + + +/** + * if 2 tuners are located side by side you can get interferences when + * they try to tune to the same frequency, so both lose sync. + * We will slightly mistune in this case. The AFC of the demodulator + * should make it still possible to receive the requested transponder + * on both tuners... + */ +static +void dvb_bend_frequency (struct dvb_frontend_data *this_fe, int recursive) +{ + struct list_head *entry; + int stepsize = this_fe->info->frequency_stepsize; + int frequency; + + if (!stepsize || recursive > 10) { + printk ("%s: too deep recursion, check frequency_stepsize " + "in your frontend code!\n", __FUNCTION__); + return; + } + + dprintk ("%s\n", __FUNCTION__); + + if (!recursive) { + if (down_interruptible (&frontend_mutex)) + return; + this_fe->bending = 0; + } + + list_for_each (entry, &frontend_list) { + struct dvb_frontend_data *fe; + int f; + + fe = list_entry (entry, struct dvb_frontend_data, list_head); + + f = fe->parameters.frequency; + f += fe->lnb_drift; + f += fe->bending; + + frequency = this_fe->parameters.frequency; + frequency += this_fe->lnb_drift; + frequency += this_fe->bending; + + if (this_fe != fe && + frequency > f - stepsize && frequency < f + stepsize) + { + if (recursive % 2) + this_fe->bending += stepsize; + else + this_fe->bending = -this_fe->bending; + + dvb_bend_frequency (this_fe, recursive + 1); + goto done; + } + } +done: + if (!recursive) + up (&frontend_mutex); +} + + +static +void dvb_call_frontend_notifiers (struct dvb_frontend_data *fe, + fe_status_t s) +{ + struct list_head *e; + struct dvb_fe_notifier_callbacks *c; + + dprintk ("%s\n", __FUNCTION__); + + if ((fe->status & FE_HAS_LOCK) && !(s & FE_HAS_LOCK)) + fe->lost_sync_jiffies = jiffies; + + if (((s ^ fe->status) & FE_HAS_LOCK) && (s & FE_HAS_LOCK)) + ddelay (fe->info->notifier_delay); + + fe->status = s; + + if (!(s & FE_HAS_LOCK) && (fe->info->caps & FE_CAN_MUTE_TS)) + return; + + /** + * now tell the Demux about the TS status changes... + */ + list_for_each (e, &fe->notifier_callbacks) { + c = list_entry (e, struct dvb_fe_notifier_callbacks, list_head); + c->callback (fe->status, c->data); + } +} + + +static +void dvb_frontend_add_event (struct dvb_frontend_data *fe, fe_status_t status) +{ + struct dvb_fe_events *events = &fe->events; + struct dvb_frontend_event *e; + int wp; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&events->sem)) + return; + + wp = (events->eventw + 1) % MAX_EVENT; + + if (wp == events->eventr) { + events->overflow = 1; + events->eventr = (events->eventr + 1) % MAX_EVENT; + } + + e = &events->events[events->eventw]; + + memcpy (&e->parameters, &fe->parameters, + sizeof (struct dvb_frontend_parameters)); + + if (status & FE_HAS_LOCK) + dvb_frontend_internal_ioctl (&fe->frontend, + FE_GET_FRONTEND, + &e->parameters); + events->eventw = wp; + + up (&events->sem); + + e->status = status; + dvb_call_frontend_notifiers (fe, status); + + wake_up_interruptible (&events->wait_queue); +} + + +static +int dvb_frontend_get_event (struct dvb_frontend_data *fe, + struct dvb_frontend_event *event, int flags) +{ + struct dvb_fe_events *events = &fe->events; + + dprintk ("%s\n", __FUNCTION__); + + if (events->overflow) { + events->overflow = 0; + return -EOVERFLOW; + } + + if (events->eventw == events->eventr) { + int ret; + + if (flags & O_NONBLOCK) + return -EWOULDBLOCK; + + ret = wait_event_interruptible (events->wait_queue, + events->eventw != events->eventr); + if (ret < 0) + return ret; + } + + if (down_interruptible (&events->sem)) + return -ERESTARTSYS; + + memcpy (event, &events->events[events->eventr], + sizeof(struct dvb_frontend_event)); + + events->eventr = (events->eventr + 1) % MAX_EVENT; + + up (&events->sem); + + return 0; +} + + +static +struct dvb_frontend_parameters default_param [] = { + { /* NTV on Astra */ + frequency: 12669500-10600000, + inversion: INVERSION_OFF, + { qpsk: { symbol_rate: 22000000, fec_inner: FEC_AUTO } } + }, + { /* Cable */ + frequency: 394000000, + inversion: INVERSION_OFF, + { qam: { symbol_rate: 6900000, + fec_inner: FEC_AUTO, + modulation: QAM_64 + } + } + }, + { /* DVB-T */ + frequency: 730000000, + inversion: INVERSION_OFF, + { ofdm: { bandwidth: BANDWIDTH_8_MHZ, + code_rate_HP: FEC_2_3, + code_rate_LP: FEC_1_2, + constellation: QAM_16, + transmission_mode: TRANSMISSION_MODE_2K, + guard_interval: GUARD_INTERVAL_1_8, + hierarchy_information: HIERARCHY_NONE + } + } + } +}; + + +static +int dvb_frontend_set_parameters (struct dvb_frontend_data *fe, + struct dvb_frontend_parameters *param, + int first_trial) +{ + struct dvb_frontend *frontend = &fe->frontend; + int err; + + dprintk ("%s: f == %i, drift == %i\n", + __FUNCTION__, param->frequency, fe->lnb_drift); + + dvb_bend_frequency (fe, 0); + + if (first_trial) { + fe->timeout_count = 0; + fe->lost_sync_count = 0; + fe->lost_sync_jiffies = jiffies; + fe->lnb_drift = 0; + if (fe->status & ~FE_TIMEDOUT) + dvb_frontend_add_event (fe, 0); + memcpy (&fe->parameters, param, + sizeof (struct dvb_frontend_parameters)); + } + + param->frequency += fe->lnb_drift + fe->bending; + err = dvb_frontend_internal_ioctl (frontend, FE_SET_FRONTEND, param); + param->frequency -= fe->lnb_drift + fe->bending; + + wake_up_interruptible (&fe->wait_queue); + + return err; +} + +static +void dvb_frontend_init (struct dvb_frontend_data *fe) +{ + struct dvb_frontend *frontend = &fe->frontend; + struct dvb_frontend_parameters *init_param; + + printk ("%s: initialising frontend %i:%i (%s)...\n", __FUNCTION__, + frontend->i2c->adapter->num, frontend->i2c->id, + fe->info->name); + + dvb_frontend_internal_ioctl (frontend, FE_INIT, NULL); + + if (fe->info->type == FE_QPSK) { + dvb_frontend_internal_ioctl (frontend, FE_SET_VOLTAGE, + (void*) SEC_VOLTAGE_13); + dvb_frontend_internal_ioctl (frontend, FE_SET_TONE, + (void*) SEC_TONE_ON); + } + + init_param = &default_param[fe->info->type-FE_QPSK]; + + dvb_frontend_set_parameters (fe, init_param, 1); +} + + +static +void update_delay (int *quality, int *delay, int locked) +{ + int q2; + + dprintk ("%s\n", __FUNCTION__); + + if (locked) + (*quality) = (*quality * 220 + 36*256) / 256; + else + (*quality) = (*quality * 220 + 0) / 256; + + q2 = *quality - 128; + q2 *= q2; + + *delay = HZ/20 + q2 * HZ / (128*128); +} + + +#define LNB_DRIFT 1024 /* max. tolerated LNB drift, XXX FIXME: adjust! */ +#define TIMEOUT 2*HZ + +/** + * here we only come when we have lost the lock bit, + * let's try to do something useful... + */ +static +void dvb_frontend_recover (struct dvb_frontend_data *fe) +{ + dprintk ("%s\n", __FUNCTION__); + +#if 0 + if (fe->timeout_count > 3) { + printk ("%s: frontend seems dead, reinitializing...\n", + __FUNCTION__); + dvb_call_frontend_notifiers (fe, 0); + dvb_frontend_internal_ioctl (&fe->frontend, FE_INIT, NULL); + dvb_frontend_set_parameters (fe, &fe->parameters, 1); + dvb_frontend_add_event (fe, FE_REINIT); + fe->lost_sync_jiffies = jiffies; + fe->timeout_count = 0; + return; + } +#endif + + /** + * let's start a zigzag scan to compensate LNB drift... + */ + { + int j = fe->lost_sync_count; + int stepsize = fe->info->frequency_stepsize; + + if (j % 32 == 0) + fe->lnb_drift = 0; + + if (j % 2) + fe->lnb_drift += stepsize * ((j+1)/2); + else + fe->lnb_drift = -fe->lnb_drift; + + dvb_frontend_set_parameters (fe, &fe->parameters, 0); + } + + dvb_frontend_internal_ioctl (&fe->frontend, FE_RESET, NULL); +} + + + +static +int dvb_frontend_is_exiting (struct dvb_frontend_data *fe) +{ + if (fe->exit) + return 1; + + if (fe->dvbdev->users == 0 && dvb_shutdown_timeout) + if (jiffies - fe->release_jiffies > dvb_shutdown_timeout * HZ) + return 1; + + return 0; +} + + +static +int dvb_frontend_thread (void *data) +{ + struct dvb_frontend_data *fe = (struct dvb_frontend_data *) data; + int quality = 0, delay = 3*HZ; + fe_status_t s; + + dprintk ("%s\n", __FUNCTION__); + + lock_kernel (); + daemonize (); + sigfillset (¤t->blocked); + strncpy (current->comm, "kdvb-fe", sizeof (current->comm)); + fe->thread = current; + unlock_kernel (); + + dvb_call_frontend_notifiers (fe, 0); + dvb_frontend_init (fe); + + while (!dvb_frontend_is_exiting (fe)) { + up (&fe->sem); /* is locked when we enter the thread... */ + + interruptible_sleep_on_timeout (&fe->wait_queue, delay); + + if (down_interruptible (&fe->sem)) { + fe->thread = NULL; + return -ERESTARTSYS; + } + + if (dvb_frontend_is_exiting (fe)) + break; + + dvb_frontend_internal_ioctl (&fe->frontend, FE_READ_STATUS, &s); + + update_delay (&quality, &delay, s & FE_HAS_LOCK); + + s &= ~FE_TIMEDOUT; + + if (s & FE_HAS_LOCK) { + fe->timeout_count = 0; + fe->lost_sync_count = 0; + } else { + fe->lost_sync_count++; + + dvb_frontend_recover (fe); + delay = HZ/5; + if (jiffies - fe->lost_sync_jiffies > TIMEOUT) { + s |= FE_TIMEDOUT; + if ((fe->status & FE_TIMEDOUT) == 0) + fe->timeout_count++; + } + } + + if (s != fe->status) + dvb_frontend_add_event (fe, s); + }; + + dvb_frontend_internal_ioctl (&fe->frontend, FE_SLEEP, NULL); + up (&fe->sem); + fe->thread = NULL; + return 0; +} + + +static +void dvb_frontend_start (struct dvb_frontend_data *fe) +{ + dprintk ("%s\n", __FUNCTION__); + + if (!fe->exit && !fe->thread) { + if (down_interruptible (&fe->sem)) + return; + kernel_thread (dvb_frontend_thread, fe, 0); + } +} + + +static +void dvb_frontend_stop (struct dvb_frontend_data *fe) +{ + dprintk ("%s\n", __FUNCTION__); + + fe->exit = 1; + wake_up_interruptible (&fe->wait_queue); + + while (fe->thread) { + current->state = TASK_INTERRUPTIBLE; + schedule_timeout (5); + }; +} + + +static +int dvb_frontend_ioctl (struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + struct dvb_device *dvbdev = file->private_data; + struct dvb_frontend_data *fe = dvbdev->priv; + int err = 0; + + dprintk ("%s\n", __FUNCTION__); + + if (!fe || !fe->frontend.ioctl || fe->exit) + return -ENODEV; + + if (down_interruptible (&fe->sem)) + return -ERESTARTSYS; + + switch (cmd) { + case FE_DISEQC_SEND_MASTER_CMD: + case FE_DISEQC_SEND_BURST: + case FE_SET_TONE: + if (fe->status) + dvb_call_frontend_notifiers (fe, 0); + dvb_frontend_internal_ioctl (&fe->frontend, cmd, parg); + break; + case FE_SET_FRONTEND: + err = dvb_frontend_set_parameters (fe, parg, 1); + break; + case FE_GET_EVENT: + err = dvb_frontend_get_event (fe, parg, file->f_flags); + break; + case FE_GET_FRONTEND: + memcpy (parg, &fe->parameters, + sizeof (struct dvb_frontend_parameters)); + /* fall-through... */ + default: + dvb_frontend_internal_ioctl (&fe->frontend, cmd, parg); + }; + + up (&fe->sem); + + return err; +} + + +static +unsigned int dvb_frontend_poll (struct file *file, struct poll_table_struct *wait) +{ + struct dvb_device *dvbdev = file->private_data; + struct dvb_frontend_data *fe = dvbdev->priv; + + dprintk ("%s\n", __FUNCTION__); + + if (fe->events.eventw != fe->events.eventr) + return (POLLIN | POLLRDNORM | POLLPRI); + + poll_wait (file, &fe->events.wait_queue, wait); + + if (fe->events.eventw != fe->events.eventr) + return (POLLIN | POLLRDNORM | POLLPRI); + + return 0; +} + + +static +int dvb_frontend_open (struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev = file->private_data; + struct dvb_frontend_data *fe = dvbdev->priv; + int ret; + + dprintk ("%s\n", __FUNCTION__); + + if ((ret = dvb_generic_open (inode, file)) < 0) + return ret; + + dvb_frontend_start (fe); + + /* empty event queue */ + fe->events.eventr = fe->events.eventw; + + return ret; +} + + +static +int dvb_frontend_release (struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev = file->private_data; + struct dvb_frontend_data *fe = dvbdev->priv; + + dprintk ("%s\n", __FUNCTION__); + + fe->release_jiffies = jiffies; + + return dvb_generic_release (inode, file); +} + + + +int +dvb_add_frontend_ioctls (struct dvb_adapter_s *adapter, + int (*before_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + int (*after_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + void *before_after_data) +{ + struct dvb_frontend_ioctl_data *ioctl; + struct list_head *entry; + int frontend_count = 0; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&frontend_mutex)) + return -ERESTARTSYS; + + ioctl = kmalloc (sizeof(struct dvb_frontend_ioctl_data), GFP_KERNEL); + + if (!ioctl) { + up (&frontend_mutex); + return -ENOMEM; + } + + ioctl->adapter = adapter; + ioctl->before_ioctl = before_ioctl; + ioctl->after_ioctl = after_ioctl; + ioctl->before_after_data = before_after_data; + + list_add_tail (&ioctl->list_head, &frontend_ioctl_list); + + list_for_each (entry, &frontend_list) { + struct dvb_frontend_data *fe; + + fe = list_entry (entry, struct dvb_frontend_data, list_head); + + if (fe->frontend.i2c->adapter == adapter && + fe->frontend.before_ioctl == NULL && + fe->frontend.after_ioctl == NULL) + { + fe->frontend.before_ioctl = before_ioctl; + fe->frontend.after_ioctl = after_ioctl; + fe->frontend.before_after_data = before_after_data; + dvb_frontend_start (fe); + frontend_count++; + } + } + + up (&frontend_mutex); + + return frontend_count; +} + + +void +dvb_remove_frontend_ioctls (struct dvb_adapter_s *adapter, + int (*before_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + int (*after_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg)) +{ + struct list_head *entry; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&frontend_mutex)) + return; + + list_for_each (entry, &frontend_list) { + struct dvb_frontend_data *fe; + + fe = list_entry (entry, struct dvb_frontend_data, list_head); + + if (fe->frontend.i2c->adapter == adapter && + fe->frontend.before_ioctl == before_ioctl && + fe->frontend.after_ioctl == after_ioctl) + { + fe->frontend.before_ioctl = NULL; + fe->frontend.after_ioctl = NULL; + + } + } + + up (&frontend_mutex); +} + + +int +dvb_add_frontend_notifier (struct dvb_adapter_s *adapter, + void (*callback) (fe_status_t s, void *data), + void *data) +{ + struct list_head *entry; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&frontend_mutex)) + return -ERESTARTSYS; + + list_for_each (entry, &frontend_list) { + struct dvb_frontend_data *fe; + + fe = list_entry (entry, struct dvb_frontend_data, list_head); + + if (fe->frontend.i2c->adapter == adapter) { + struct dvb_fe_notifier_callbacks *e; + + e = kmalloc (sizeof(struct dvb_fe_notifier_callbacks), + GFP_KERNEL); + + if (!e) { + up (&frontend_mutex); + return -ENOMEM; + } + + e->callback = callback; + e->data = data; + list_add_tail (&e->list_head, &fe->notifier_callbacks); + + up (&frontend_mutex); + return 0; + } + } + + up (&frontend_mutex); + + return -ENODEV; +} + + +void +dvb_remove_frontend_notifier (struct dvb_adapter_s *adapter, + void (*callback) (fe_status_t s, void *data)) +{ + struct list_head *entry; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&frontend_mutex)) + return; + + list_for_each (entry, &frontend_list) { + struct dvb_frontend_data *fe; + + fe = list_entry (entry, struct dvb_frontend_data, list_head); + + if (fe->frontend.i2c->adapter == adapter) { + struct list_head *e0, *n0; + + list_for_each_safe (e0, n0, &fe->notifier_callbacks) { + struct dvb_fe_notifier_callbacks *e; + + e = list_entry (e0, + struct dvb_fe_notifier_callbacks, + list_head); + list_del (&e->list_head); + kfree (e); + } + } + } + + up (&frontend_mutex); +} + + +static +struct file_operations dvb_frontend_fops = { + owner: THIS_MODULE, + ioctl: dvb_generic_ioctl, + poll: dvb_frontend_poll, + open: dvb_frontend_open, + release: dvb_frontend_release +}; + + + +int +dvb_register_frontend (int (*ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + struct dvb_i2c_bus *i2c, + void *data, + struct dvb_frontend_info *info) +{ + struct list_head *entry; + struct dvb_frontend_data *fe; + dvb_device_t dvbdev_template = { users: 1, writers: 1, + fops: &dvb_frontend_fops, + kernel_ioctl: dvb_frontend_ioctl + }; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&frontend_mutex)) + return -ERESTARTSYS; + + if (!(fe = kmalloc (sizeof (struct dvb_frontend_data), GFP_KERNEL))) { + up (&frontend_mutex); + return -ENOMEM; + } + + memset (fe, 0, sizeof (struct dvb_frontend_data)); + + init_MUTEX (&fe->sem); + init_waitqueue_head (&fe->wait_queue); + init_waitqueue_head (&fe->events.wait_queue); + init_MUTEX (&fe->events.sem); + fe->events.eventw = fe->events.eventr = 0; + fe->events.overflow = 0; + INIT_LIST_HEAD (&fe->notifier_callbacks); + + fe->frontend.ioctl = ioctl; + fe->frontend.i2c = i2c; + fe->frontend.data = data; + fe->info = info; + + list_for_each (entry, &frontend_ioctl_list) { + struct dvb_frontend_ioctl_data *ioctl; + + ioctl = list_entry (entry, struct dvb_frontend_ioctl_data, list_head); + + if (ioctl->adapter == i2c->adapter) { + fe->frontend.before_ioctl = ioctl->before_ioctl; + fe->frontend.after_ioctl = ioctl->after_ioctl; + fe->frontend.before_after_data = ioctl->before_after_data; + dvb_frontend_start (fe); + break; + } + } + + list_add_tail (&fe->list_head, &frontend_list); + + dvb_register_device (i2c->adapter, &fe->dvbdev, &dvbdev_template, + fe, DVB_DEVICE_FRONTEND); + + up (&frontend_mutex); + + return 0; +} + + +int dvb_unregister_frontend (int (*ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + struct dvb_i2c_bus *i2c) +{ + struct list_head *entry, *n; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&frontend_mutex)) + return -ERESTARTSYS; + + list_for_each_safe (entry, n, &frontend_list) { + struct dvb_frontend_data *fe; + + fe = list_entry (entry, struct dvb_frontend_data, list_head); + + if (fe->frontend.ioctl == ioctl && fe->frontend.i2c == i2c) { + dvb_unregister_device (fe->dvbdev); + + list_del (entry); + up (&frontend_mutex); + + dvb_frontend_stop (fe); + kfree (fe); + return 0; + } + } + + up (&frontend_mutex); + return -EINVAL; +} + +MODULE_PARM(dvb_frontend_debug,"i"); +MODULE_PARM(dvb_shutdown_timeout,"i"); +MODULE_PARM_DESC(dvb_frontend_debug, "enable verbose debug messages"); +MODULE_PARM_DESC(dvb_shutdown_timeout, "wait <shutdown_timeout> seconds after close() before suspending hardware"); diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h new file mode 100644 index 000000000000..9a65459e69f3 --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvb_frontend.h @@ -0,0 +1,117 @@ +/* + * dvb-core.h + * + * Copyright (C) 2001 Ralph Metzler <ralph@convergence.de> + * overhauled by Holger Waechtler <holger@convergence.de> + * for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVB_FRONTEND_H_ +#define _DVB_FRONTEND_H_ + +#include <asm/types.h> +#include <linux/sched.h> +#include <linux/ioctl.h> +#include <linux/i2c.h> +#include <linux/module.h> + +#ifndef MODULE_LICENSE +#define MODULE_LICENSE(x) +#endif + +#include <linux/dvb/frontend.h> + +#include "dvb_i2c.h" +#include "dvbdev.h" + + + + +/** + * when before_ioctl is registered and returns value 0, ioctl and after_ioctl + * are not executed. + */ + +struct dvb_frontend { + int (*before_ioctl) (struct dvb_frontend *frontend, unsigned int cmd, void *arg); + int (*ioctl) (struct dvb_frontend *frontend, unsigned int cmd, void *arg); + int (*after_ioctl) (struct dvb_frontend *frontend, unsigned int cmd, void *arg); + struct dvb_i2c_bus *i2c; + void *before_after_data; /* can be used by hardware module... */ + void *data; /* can be used by hardware module... */ +}; + + +/** + * private frontend command ioctl's. + * keep them in sync with the public ones defined in linux/dvb/frontend.h + */ +#define FE_SLEEP _IO('v', 80) +#define FE_INIT _IO('v', 81) +#define FE_RESET _IO('v', 82) + + +extern int +dvb_register_frontend (int (*ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + struct dvb_i2c_bus *i2c, + void *data, + struct dvb_frontend_info *info); + +extern int +dvb_unregister_frontend (int (*ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + struct dvb_i2c_bus *i2c); + + +/** + * Add special ioctl code performed before and after the main ioctl + * to all frontend devices on the specified DVB adapter. + * This is necessairy because the 22kHz/13V-18V/DiSEqC stuff depends + * heavily on the hardware around the frontend, the same tuner can create + * these signals on about a million different ways... + * + * Return value: number of frontends where the ioctl's were applied. + */ +extern int +dvb_add_frontend_ioctls (struct dvb_adapter_s *adapter, + int (*before_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + int (*after_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + void *before_after_data); + + +extern void +dvb_remove_frontend_ioctls (struct dvb_adapter_s *adapter, + int (*before_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + int (*after_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg)); + +extern int +dvb_add_frontend_notifier (struct dvb_adapter_s *adapter, + void (*callback) (fe_status_t s, void *data), + void *data); +extern void +dvb_remove_frontend_notifier (struct dvb_adapter_s *adapter, + void (*callback) (fe_status_t s, void *data)); + +#endif + diff --git a/drivers/media/dvb/dvb-core/dvb_i2c.c b/drivers/media/dvb/dvb-core/dvb_i2c.c new file mode 100644 index 000000000000..7aae8c93dc5c --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvb_i2c.c @@ -0,0 +1,301 @@ +/* + * dvb_i2c.h: simplified i2c interface for DVB adapters to get rid of i2c-core.c + * + * Copyright (C) 2002 Holger Waechtler for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Or, point your browser to http://www.gnu.org/copyleft/gpl.html + */ + +#include <linux/slab.h> +#include <linux/list.h> +#include <linux/module.h> + +#include "compat.h" +#include "dvb_i2c.h" + + +struct dvb_i2c_device { + struct list_head list_head; + struct module *owner; + int (*attach) (struct dvb_i2c_bus *i2c); + void (*detach) (struct dvb_i2c_bus *i2c); +}; + + +LIST_HEAD(dvb_i2c_buslist); +LIST_HEAD(dvb_i2c_devicelist); + +DECLARE_MUTEX(dvb_i2c_mutex); + + +static +int register_i2c_client (struct dvb_i2c_bus *i2c, struct dvb_i2c_device *dev) +{ + struct dvb_i2c_device *client; + + if (!(client = kmalloc (sizeof (struct dvb_i2c_device), GFP_KERNEL))) + return -ENOMEM; + + client->detach = dev->detach; + client->owner = dev->owner; + + INIT_LIST_HEAD(&client->list_head); + + list_add_tail (&client->list_head, &i2c->client_list); + + return 0; +} + + +static +void try_attach_device (struct dvb_i2c_bus *i2c, struct dvb_i2c_device *dev) +{ + if (dev->owner) { + if (!MOD_CAN_QUERY(dev->owner)) + return; + + __MOD_INC_USE_COUNT(dev->owner); + } + + if (dev->attach (i2c) == 0) { + register_i2c_client (i2c, dev); + } else { + if (dev->owner) + __MOD_DEC_USE_COUNT(dev->owner); + } +} + + +static +void detach_device (struct dvb_i2c_bus *i2c, struct dvb_i2c_device *dev) +{ + dev->detach (i2c); + + if (dev->owner) + __MOD_DEC_USE_COUNT(dev->owner); +} + + +static +void unregister_i2c_client_from_bus (struct dvb_i2c_device *dev, + struct dvb_i2c_bus *i2c) +{ + struct list_head *entry; + + list_for_each (entry, &i2c->client_list) { + struct dvb_i2c_device *client; + + client = list_entry (entry, struct dvb_i2c_device, list_head); + + if (client->detach == dev->detach) + detach_device (i2c, dev); + } +} + + +static +void unregister_i2c_client_from_all_busses (struct dvb_i2c_device *dev) +{ + struct list_head *entry; + + list_for_each (entry, &dvb_i2c_buslist) { + struct dvb_i2c_bus *i2c; + + i2c = list_entry (entry, struct dvb_i2c_bus, list_head); + + unregister_i2c_client_from_bus (dev, i2c); + } +} + + +static +void unregister_all_clients_from_bus (struct dvb_i2c_bus *i2c) +{ + struct list_head *entry, *n; + + list_for_each_safe (entry, n, &(i2c->client_list)) { + struct dvb_i2c_device *client; + + client = list_entry (entry, struct dvb_i2c_device, list_head); + + detach_device (i2c, client); + + list_del (entry); + } +} + + + +static +void probe_device_on_all_busses (struct dvb_i2c_device *dev) +{ + struct list_head *entry; + + list_for_each (entry, &dvb_i2c_buslist) { + struct dvb_i2c_bus *i2c; + + i2c = list_entry (entry, struct dvb_i2c_bus, list_head); + + try_attach_device (i2c, dev); + } +} + + +static +void probe_devices_on_bus (struct dvb_i2c_bus *i2c) +{ + struct list_head *entry; + + list_for_each (entry, &dvb_i2c_devicelist) { + struct dvb_i2c_device *dev; + + dev = list_entry (entry, struct dvb_i2c_device, list_head); + + try_attach_device (i2c, dev); + } +} + + +struct dvb_i2c_bus* +dvb_register_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, + struct i2c_msg msgs[], int num), + void *data, + struct dvb_adapter_s *adapter, + int id) +{ + struct dvb_i2c_bus *i2c; + + if (!(i2c = kmalloc (sizeof (struct dvb_i2c_bus), GFP_KERNEL))) + return NULL; + + INIT_LIST_HEAD(&i2c->list_head); + INIT_LIST_HEAD(&i2c->client_list); + + i2c->xfer = xfer; + i2c->data = data; + i2c->adapter = adapter; + i2c->id = id; + + probe_devices_on_bus (i2c); + + list_add_tail (&i2c->list_head, &dvb_i2c_buslist); + + return i2c; +} + + +struct dvb_i2c_bus* +dvb_find_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, + struct i2c_msg msgs[], int num), + struct dvb_adapter_s *adapter, + int id) +{ + struct list_head *entry; + + if (down_interruptible (&dvb_i2c_mutex)) + return NULL; + + list_for_each (entry, &dvb_i2c_buslist) { + struct dvb_i2c_bus *i2c; + + i2c = list_entry (entry, struct dvb_i2c_bus, list_head); + + if (i2c->xfer == xfer && + i2c->adapter == adapter && + i2c->id == id) + { + up (&dvb_i2c_mutex); + return i2c; + } + } + + up (&dvb_i2c_mutex); + + return NULL; +} + + + +void dvb_unregister_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, + struct i2c_msg msgs[], int num), + struct dvb_adapter_s *adapter, + int id) +{ + struct dvb_i2c_bus *i2c = dvb_find_i2c_bus (xfer, adapter, id); + + if (i2c) { + unregister_all_clients_from_bus (i2c); + list_del (&i2c->list_head); + kfree (i2c); + } +} + + +int dvb_register_i2c_device (struct module *owner, + int (*attach) (struct dvb_i2c_bus *i2c), + void (*detach) (struct dvb_i2c_bus *i2c)) +{ + struct dvb_i2c_device *entry; + + if (down_interruptible (&dvb_i2c_mutex)) + return -ERESTARTSYS; + + if (!(entry = kmalloc (sizeof (struct dvb_i2c_device), GFP_KERNEL))) + return -ENOMEM; + + entry->owner = owner; + entry->attach = attach; + entry->detach = detach; + + INIT_LIST_HEAD(&entry->list_head); + + probe_device_on_all_busses (entry); + + list_add_tail (&entry->list_head, &dvb_i2c_devicelist); + + up (&dvb_i2c_mutex); + + return 0; +} + + +int dvb_unregister_i2c_device (int (*attach) (struct dvb_i2c_bus *i2c)) +{ + struct list_head *entry, *n; + + if (down_interruptible (&dvb_i2c_mutex)) + return -ERESTARTSYS; + + list_for_each_safe (entry, n, &dvb_i2c_devicelist) { + struct dvb_i2c_device *dev; + + dev = list_entry (entry, struct dvb_i2c_device, list_head); + + if (dev->attach == attach) { + list_del (entry); + unregister_i2c_client_from_all_busses (dev); + kfree (entry); + up (&dvb_i2c_mutex); + return 0; + } + } + + up (&dvb_i2c_mutex); + + return -EINVAL; +} + + diff --git a/drivers/media/dvb/dvb-core/dvb_i2c.h b/drivers/media/dvb/dvb-core/dvb_i2c.h new file mode 100644 index 000000000000..c06e4d1bceaa --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvb_i2c.h @@ -0,0 +1,63 @@ +/* + * dvb_i2c.h: i2c interface to get rid of i2c-core.c + * + * Copyright (C) 2002 Holger Waechtler for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Or, point your browser to http://www.gnu.org/copyleft/gpl.html + */ + +#ifndef _DVB_I2C_H_ +#define _DVB_I2C_H_ + +#include <linux/list.h> +#include <linux/i2c.h> + +#include "dvbdev.h" + + +struct dvb_i2c_bus { + struct list_head list_head; + int (*xfer) (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num); + void *data; + struct dvb_adapter_s *adapter; + int id; + struct list_head client_list; +}; + + +extern +struct dvb_i2c_bus* dvb_register_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, + struct i2c_msg msgs[], + int num), + void *data, + struct dvb_adapter_s *adapter, + int id); + +extern +void dvb_unregister_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, + struct i2c_msg msgs[], int num), + struct dvb_adapter_s *adapter, + int id); + + +extern int dvb_register_i2c_device (struct module *owner, + int (*attach) (struct dvb_i2c_bus *i2c), + void (*detach) (struct dvb_i2c_bus *i2c)); + +extern int dvb_unregister_i2c_device (int (*attach) (struct dvb_i2c_bus *i2c)); + +#endif + diff --git a/drivers/media/dvb/dvb-core/dvb_ksyms.c b/drivers/media/dvb/dvb-core/dvb_ksyms.c new file mode 100644 index 000000000000..619ec95b66ef --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvb_ksyms.c @@ -0,0 +1,49 @@ +#include <linux/module.h> + +#include "dmxdev.h" +#include "dvb_filter.h" +#include "dvb_frontend.h" +#include "dvb_i2c.h" +#include "dvbdev.h" +#include "dvb_demux.h" +#include "dvb_net.h" + + +EXPORT_SYMBOL(DmxDevInit); +EXPORT_SYMBOL(DmxDevRelease); +EXPORT_SYMBOL(DvbDmxInit); +EXPORT_SYMBOL(DvbDmxRelease); +EXPORT_SYMBOL(DvbDmxSWFilterPackets); + +EXPORT_SYMBOL(dvb_register_frontend); +EXPORT_SYMBOL(dvb_unregister_frontend); +EXPORT_SYMBOL(dvb_add_frontend_ioctls); +EXPORT_SYMBOL(dvb_remove_frontend_ioctls); +EXPORT_SYMBOL(dvb_add_frontend_notifier); +EXPORT_SYMBOL(dvb_remove_frontend_notifier); + +EXPORT_SYMBOL(dvb_register_i2c_bus); +EXPORT_SYMBOL(dvb_unregister_i2c_bus); +EXPORT_SYMBOL(dvb_register_i2c_device); +EXPORT_SYMBOL(dvb_unregister_i2c_device); + +EXPORT_SYMBOL(dvb_net_init); +EXPORT_SYMBOL(dvb_net_release); + +EXPORT_SYMBOL(dvb_register_adapter); +EXPORT_SYMBOL(dvb_unregister_adapter); +EXPORT_SYMBOL(dvb_register_device); +EXPORT_SYMBOL(dvb_unregister_device); +EXPORT_SYMBOL(dvb_generic_ioctl); +EXPORT_SYMBOL(dvb_generic_open); +EXPORT_SYMBOL(dvb_generic_release); +EXPORT_SYMBOL(generic_usercopy); + +EXPORT_SYMBOL(init_ipack); +EXPORT_SYMBOL(reset_ipack); +EXPORT_SYMBOL(free_ipack); +EXPORT_SYMBOL(send_ipack_rest); +EXPORT_SYMBOL(instant_repack); +EXPORT_SYMBOL(pes2ts_init); +EXPORT_SYMBOL(pes2ts); + diff --git a/drivers/media/dvb/dvb-core/dvb_net.c b/drivers/media/dvb/dvb-core/dvb_net.c new file mode 100644 index 000000000000..6553682a8a37 --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvb_net.c @@ -0,0 +1,507 @@ +/* + * dvb_net.c + * + * Copyright (C) 2001 Convergence integrated media GmbH + * Ralph Metzler <ralph@convergence.de> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include <linux/dvb/net.h> + +#include <asm/uaccess.h> +#include "demux.h" +#include "dvb_net.h" + +/* + * Determine the packet's protocol ID. The rule here is that we + * assume 802.3 if the type field is short enough to be a length. + * This is normal practice and works for any 'now in use' protocol. + * + * stolen from eth.c out of the linux kernel, hacked for dvb-device + * by Michael Holzt <kju@debian.org> + */ + +unsigned short my_eth_type_trans(struct sk_buff *skb, struct net_device *dev) +{ + struct ethhdr *eth; + unsigned char *rawp; + + skb->mac.raw=skb->data; + skb_pull(skb,dev->hard_header_len); + eth= skb->mac.ethernet; + + if(*eth->h_dest&1) + { + if(memcmp(eth->h_dest,dev->broadcast, ETH_ALEN)==0) + skb->pkt_type=PACKET_BROADCAST; + else + skb->pkt_type=PACKET_MULTICAST; + } + + if (ntohs(eth->h_proto) >= 1536) + return eth->h_proto; + + rawp = skb->data; + + /* + * This is a magic hack to spot IPX packets. Older Novell breaks + * the protocol design and runs IPX over 802.3 without an 802.2 LLC + * layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This + * won't work for fault tolerant netware but does for the rest. + */ + if (*(unsigned short *)rawp == 0xFFFF) + return htons(ETH_P_802_3); + + /* + * Real 802.2 LLC + */ + return htons(ETH_P_802_2); +} + +static void +dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len) +{ + u8 *eth; + struct sk_buff *skb; + + if (pkt_len<13) { + printk("%s: IP/MPE packet length = %d too small.\n", dev->name, pkt_len); + return; + } + skb = dev_alloc_skb(pkt_len+2); + if (skb == NULL) { + printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", + dev->name); + ((dvb_net_priv_t *)dev->priv)->stats.rx_dropped++; + return; + } + eth=(u8 *) skb_put(skb, pkt_len+2); + memcpy(eth+14, (void*)pkt+12, pkt_len-12); + + eth[0]=pkt[0x0b]; + eth[1]=pkt[0x0a]; + eth[2]=pkt[0x09]; + eth[3]=pkt[0x08]; + eth[4]=pkt[0x04]; + eth[5]=pkt[0x03]; + eth[6]=eth[7]=eth[8]=eth[9]=eth[10]=eth[11]=0; + eth[12]=0x08; eth[13]=0x00; + + skb->protocol=my_eth_type_trans(skb,dev); + skb->dev=dev; + + ((dvb_net_priv_t *)dev->priv)->stats.rx_packets++; + ((dvb_net_priv_t *)dev->priv)->stats.rx_bytes+=skb->len; + //sti(); + netif_rx(skb); +} + +static int +dvb_net_callback(u8 *buffer1, size_t buffer1_len, + u8 *buffer2, size_t buffer2_len, + dmx_section_filter_t *filter, + dmx_success_t success) +{ + struct net_device *dev=(struct net_device *) filter->priv; + + /* FIXME: this only works if exactly one complete section is + delivered in buffer1 only */ + dvb_net_sec(dev, buffer1, buffer1_len); + return 0; +} + +static int +dvb_net_tx(struct sk_buff *skb, struct net_device *dev) +{ + return 0; +} + +#define MASK 0x00; + +static int +dvb_net_filter_set(struct net_device *dev, + dmx_section_filter_t **secfilter, + unsigned char *mac) +{ + dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv; + int ret; + + *secfilter=0; + ret=priv->secfeed->allocate_filter(priv->secfeed, secfilter); + if (ret<0) { + printk("%s: could not get filter\n", dev->name); + return ret; + } + + (*secfilter)->priv=(void *) dev; + + memset((*secfilter)->filter_value, 0, DMX_MAX_FILTER_SIZE); + memset((*secfilter)->filter_mask , 0, DMX_MAX_FILTER_SIZE); + + (*secfilter)->filter_value[0]=0x3e; + (*secfilter)->filter_mask[0]=MASK; + + (*secfilter)->filter_value[3]=mac[5]; + (*secfilter)->filter_mask[3]=MASK; + (*secfilter)->filter_value[4]=mac[4]; + (*secfilter)->filter_mask[4]=MASK; + (*secfilter)->filter_value[8]=mac[3]; + (*secfilter)->filter_mask[8]=MASK; + (*secfilter)->filter_value[9]=mac[2]; + (*secfilter)->filter_mask[9]=MASK; + + (*secfilter)->filter_value[10]=mac[1]; + (*secfilter)->filter_mask[10]=MASK; + (*secfilter)->filter_value[11]=mac[0]; + (*secfilter)->filter_mask[11]=MASK; + + printk("%s: filter mac=%02x %02x %02x %02x %02x %02x\n", + dev->name, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + return 0; +} + +static int +dvb_net_feed_start(struct net_device *dev) +{ + int ret, i; + dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv; + dmx_demux_t *demux=priv->demux; + unsigned char *mac=(unsigned char *) dev->dev_addr; + + priv->secfeed=0; + priv->secfilter=0; + + ret=demux->allocate_section_feed(demux, &priv->secfeed, + dvb_net_callback); + if (ret<0) { + printk("%s: could not get section feed\n", dev->name); + return ret; + } + + ret=priv->secfeed->set(priv->secfeed, priv->pid, 32768, 0, 0); + if (ret<0) { + printk("%s: could not set section feed\n", dev->name); + priv->demux-> + release_section_feed(priv->demux, priv->secfeed); + priv->secfeed=0; + return ret; + } + MOD_INC_USE_COUNT; + + dvb_net_filter_set(dev, &priv->secfilter, mac); + for (i=0; i<priv->multi_num; i++) + dvb_net_filter_set(dev, &priv->secfilter, + priv->multi_macs[i]); + + priv->secfeed->start_filtering(priv->secfeed); + printk("%s: feed_started\n", dev->name); + return 0; +} + +static void +dvb_net_feed_stop(struct net_device *dev) +{ + dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv; + int i; + + if (priv->secfeed) { + if (priv->secfeed->is_filtering) + priv->secfeed->stop_filtering(priv->secfeed); + printk("%s: feed_stopped\n", dev->name); + if (priv->secfilter) + priv->secfeed-> + release_filter(priv->secfeed, + priv->secfilter); + priv->secfilter=0; + + for (i=0; i<priv->multi_num; i++) { + if (priv->multi_secfilter[i]) + priv->secfeed-> + release_filter(priv->secfeed, + priv->multi_secfilter[i]); + priv->multi_secfilter[i]=0; + } + priv->demux-> + release_section_feed(priv->demux, priv->secfeed); + priv->secfeed=0; + MOD_DEC_USE_COUNT; + } else + printk("%s: no feed to stop\n", dev->name); +} + +static int +dvb_set_mc_filter(struct net_device *dev, struct dev_mc_list *mc) +{ + dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv; + + if (priv->multi_num==DVB_NET_MULTICAST_MAX) + return -ENOMEM; + + printk("%s: set_mc_filter %d: %02x %02x %02x %02x %02x %02x\n", + dev->name, + priv->multi_num, + mc->dmi_addr[0], + mc->dmi_addr[1], + mc->dmi_addr[2], + mc->dmi_addr[3], + mc->dmi_addr[4], + mc->dmi_addr[5]); + memcpy(priv->multi_macs[priv->multi_num], mc->dmi_addr, 6); + + priv->multi_num++; + return 0; +} + +static void +dvb_net_set_multi(struct net_device *dev) +{ + dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv; + + printk("%s: set_multi()\n", dev->name); + dvb_net_feed_stop(dev); + + if (dev->flags&IFF_PROMISC) { + /* Enable promiscuous mode */ + printk("%s: promiscuous mode\n", dev->name); + } else if((dev->flags&IFF_ALLMULTI)) { + /* Disable promiscuous mode, use normal mode. */ + printk("%s: normal mode\n", dev->name); + } else if(dev->mc_count) { + int mci; + struct dev_mc_list *mc; + + printk("%s: set_mc_list, %d entries\n", + dev->name, dev->mc_count); + priv->multi_num=0; + for (mci=0, mc=dev->mc_list; + mci<dev->mc_count; + mc=mc->next, mci++) { + dvb_set_mc_filter(dev, mc); + } + } + dvb_net_feed_start(dev); +} + +static int +dvb_net_set_config(struct net_device *dev, struct ifmap *map) +{ + if (netif_running(dev)) + return -EBUSY; + return 0; +} + +static int +dvb_net_set_mac(struct net_device *dev, void *p) +{ + struct sockaddr *addr=p; + + memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); + if (netif_running(dev)) { + dvb_net_feed_stop(dev); + dvb_net_feed_start(dev); + } + return 0; +} + + +static int +dvb_net_open(struct net_device *dev) +{ + dvb_net_feed_start(dev); + return 0; +} + +static int +dvb_net_stop(struct net_device *dev) +{ + dvb_net_feed_stop(dev); + return 0; +} + +static struct net_device_stats * +dvb_net_get_stats(struct net_device *dev) +{ + return &((dvb_net_priv_t *)dev->priv)->stats; +} + + +static int +dvb_net_init_dev(struct net_device *dev) +{ + printk("dvb_net: dvb_net_init_dev()\n"); + + ether_setup(dev); + + dev->open = dvb_net_open; + dev->stop = dvb_net_stop; + dev->hard_start_xmit = dvb_net_tx; + dev->get_stats = dvb_net_get_stats; + dev->set_multicast_list = dvb_net_set_multi; + dev->set_config = dvb_net_set_config; + dev->set_mac_address = dvb_net_set_mac; + dev->mtu = 4096; + + dev->flags |= IFF_NOARP; + dev->hard_header_cache = NULL; + + //SET_MODULE_OWNER(dev); + + return 0; +} + +static int +get_if(dvb_net_t *dvbnet) +{ + int i; + + for (i=0; i<dvbnet->dev_num; i++) + if (!dvbnet->state[i]) + break; + if (i==dvbnet->dev_num) + return -1; + dvbnet->state[i]=1; + return i; +} + + +int +dvb_net_add_if(dvb_net_t *dvbnet, u16 pid) +{ + struct net_device *net; + dmx_demux_t *demux; + int result; + int if_num; + + if_num=get_if(dvbnet); + if (if_num<0) + return -EINVAL; + + net=&dvbnet->device[if_num]; + demux=dvbnet->demux; + + net->base_addr = 0; + net->irq = 0; + net->dma = 0; + net->mem_start = 0; + memcpy(net->name, "dvb0_0", 7); + net->name[3]=dvbnet->card_num+0x30; + net->name[5]=if_num+0x30; + net->next = NULL; + net->init = dvb_net_init_dev; + net->priv = kmalloc(sizeof(dvb_net_priv_t), GFP_KERNEL); + if (net->priv == NULL) + return -ENOMEM; + memset(net->priv, 0, sizeof(dvb_net_priv_t)); + + ((dvb_net_priv_t *)net->priv)->demux=demux; + ((dvb_net_priv_t *)net->priv)->pid=pid; + + net->base_addr=pid; + + if ((result = register_netdev(net)) < 0) { + return result; + } + MOD_INC_USE_COUNT; + return if_num; +} + +int +dvb_net_remove_if(dvb_net_t *dvbnet, int num) +{ + if (!dvbnet->state[num]) + return -EINVAL; + dvb_net_stop(&dvbnet->device[num]); + kfree(dvbnet->device[num].priv); + unregister_netdev(&dvbnet->device[num]); + dvbnet->state[num]=0; + MOD_DEC_USE_COUNT; + return 0; +} + +int dvb_net_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dvb_net_t *dvbnet=(dvb_net_t *) dvbdev->priv; + + if (((file->f_flags&O_ACCMODE)==O_RDONLY)) + return -EPERM; + + switch (cmd) { + case NET_ADD_IF: + { + struct dvb_net_if *dvbnetif=(struct dvb_net_if *)parg; + int result; + + result=dvb_net_add_if(dvbnet, dvbnetif->pid); + if (result<0) + return result; + dvbnetif->if_num=result; + break; + } + case NET_REMOVE_IF: + return dvb_net_remove_if(dvbnet, (int) parg); + default: + return -EINVAL; + } + return 0; +} + +static struct file_operations dvb_net_fops = { + owner: THIS_MODULE, + read: 0, + write: 0, + ioctl: dvb_generic_ioctl, + open: dvb_generic_open, + release: dvb_generic_release, + poll: 0, +}; + +static dvb_device_t dvbdev_net = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_net_fops, + kernel_ioctl: dvb_net_ioctl, +}; + +void +dvb_net_release(dvb_net_t *dvbnet) +{ + int i; + + dvb_unregister_device(dvbnet->dvbdev); + for (i=0; i<dvbnet->dev_num; i++) { + if (!dvbnet->state[i]) + continue; + dvb_net_remove_if(dvbnet, i); + } +} + +int +dvb_net_init(dvb_adapter_t *adap, dvb_net_t *dvbnet, dmx_demux_t *demux) +{ + int i; + + dvbnet->demux=demux; + dvbnet->dev_num=DVB_NET_DEVICES_MAX; + for (i=0; i<dvbnet->dev_num; i++) + dvbnet->state[i]=0; + dvb_register_device(adap, &dvbnet->dvbdev, &dvbdev_net, dvbnet, DVB_DEVICE_NET); + return 0; +} + diff --git a/drivers/media/dvb/dvb-core/dvb_net.h b/drivers/media/dvb/dvb-core/dvb_net.h new file mode 100644 index 000000000000..714c095655f4 --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvb_net.h @@ -0,0 +1,63 @@ +/* + * dvb_net.h + * + * Copyright (C) 2001 Convergence integrated media GmbH + * Ralph Metzler <ralph@convergence.de> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVB_NET_H_ +#define _DVB_NET_H_ + +#include <linux/module.h> +#include <linux/netdevice.h> +#include <linux/inetdevice.h> +#include <linux/etherdevice.h> +#include <linux/skbuff.h> + +#include "dvbdev.h" + +#define DVB_NET_DEVICES_MAX 10 +#define DVB_NET_MULTICAST_MAX 10 + +typedef struct dvb_net_priv_s { + struct net_device_stats stats; + char name[6]; + u16 pid; + dmx_demux_t *demux; + dmx_section_feed_t *secfeed; + dmx_section_filter_t *secfilter; + int multi_num; + dmx_section_filter_t *multi_secfilter[DVB_NET_MULTICAST_MAX]; + unsigned char multi_macs[DVB_NET_MULTICAST_MAX][6]; +} dvb_net_priv_t; + +typedef struct dvb_net_s { + dvb_device_t *dvbdev; + + int card_num; + int dev_num; + struct net_device device[DVB_NET_DEVICES_MAX]; + int state[DVB_NET_DEVICES_MAX]; + dmx_demux_t *demux; +} dvb_net_t; + + +void dvb_net_release(dvb_net_t *); +int dvb_net_init(dvb_adapter_t *, dvb_net_t *, dmx_demux_t *); + +#endif diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c new file mode 100644 index 000000000000..b38cfdc6a75f --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvbdev.c @@ -0,0 +1,434 @@ +/* + * dvbdev.c + * + * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de> + * & Marcus Metzler <marcus@convergence.de> + * for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +/*#define CONFIG_DVB_DEVFS_ONLY 1*/ + +#include <linux/config.h> +#include <linux/version.h> +#include <linux/module.h> +#include <linux/types.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/mm.h> +#include <linux/string.h> +#include <linux/errno.h> +#include <linux/init.h> +#include <asm/uaccess.h> +#include <asm/system.h> +#include <linux/kmod.h> +#include <linux/slab.h> + +#include "compat.h" +#include "dvbdev.h" + +static int dvbdev_debug = 0; +#define dprintk if (dvbdev_debug) printk + +static devfs_handle_t dvb_devfs_handle; +static LIST_HEAD(dvb_adapter_list); +static DECLARE_MUTEX(dvbdev_register_lock); + + +static char *dnames[] = { + "video", "audio", "sec", "frontend", "demux", "dvr", "ca", + "net", "osd" +}; + + +#ifdef CONFIG_DVB_DEVFS_ONLY + + #define DVB_MAX_IDS ~0 + #define nums2minor(num,type,id) 0 + #define DVB_DEVFS_FLAGS (DEVFS_FL_DEFAULT|DEVFS_FL_AUTO_DEVNUM) + +#else + + #define DVB_MAX_IDS 4 + #define nums2minor(num,type,id) ((num << 6) | (id << 4) | type) + #define DVB_DEVFS_FLAGS (DEVFS_FL_DEFAULT) + + +static +dvb_device_t* dvbdev_find_device (int minor) +{ + struct list_head *entry; + + list_for_each (entry, &dvb_adapter_list) { + struct list_head *entry0; + dvb_adapter_t *adap; + adap = list_entry (entry, dvb_adapter_t, list_head); + list_for_each (entry0, &adap->device_list) { + dvb_device_t *dev; + dev = list_entry (entry0, dvb_device_t, list_head); + if (nums2minor(adap->num, dev->type, dev->id) == minor) + return dev; + } + } + + return NULL; +} + + +static +int dvb_device_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev; + + dvbdev = dvbdev_find_device (minor(inode->i_rdev)); + + if (dvbdev && dvbdev->fops) { + int err = 0; + struct file_operations *old_fops; + + file->private_data = dvbdev; + old_fops = file->f_op; + file->f_op = fops_get(dvbdev->fops); + if(file->f_op->open) + err = file->f_op->open(inode,file); + if (err) { + fops_put(file->f_op); + file->f_op = fops_get(old_fops); + } + fops_put(old_fops); + return err; + } + return -ENODEV; +} + + +static struct file_operations dvb_device_fops = +{ + owner: THIS_MODULE, + read: NULL, + write: NULL, + ioctl: NULL, + open: dvb_device_open, + release: NULL, + poll: NULL, +}; +#endif /* CONFIG_DVB_DEVFS_ONLY */ + + + +int dvb_generic_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev = file->private_data; + + if (!dvbdev) + return -ENODEV; + + if (!dvbdev->users) + return -EBUSY; + + if ((file->f_flags & O_ACCMODE) != O_RDONLY) { + if (!dvbdev->writers) + return -EBUSY; + dvbdev->writers--; + } + + dvbdev->users--; + return 0; +} + + +int dvb_generic_release(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev = file->private_data; + + if (!dvbdev) + return -ENODEV; + + if ((file->f_flags & O_ACCMODE) != O_RDONLY) + dvbdev->writers++; + + dvbdev->users++; + return 0; +} + + +/* + * helper function -- handles userspace copying for ioctl arguments + */ +int +generic_usercopy(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg, + int (*func)(struct inode *inode, struct file *file, + unsigned int cmd, void *arg)) +{ + char sbuf[128]; + void *mbuf = NULL; + void *parg = NULL; + int err = -EINVAL; + + /* Copy arguments into temp kernel buffer */ + switch (_IOC_DIR(cmd)) { + case _IOC_NONE: + parg = (void *)arg; + break; + case _IOC_READ: /* some v4l ioctls are marked wrong ... */ + case _IOC_WRITE: + case (_IOC_WRITE | _IOC_READ): + if (_IOC_SIZE(cmd) <= sizeof(sbuf)) { + parg = sbuf; + } else { + /* too big to allocate from stack */ + mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL); + if (NULL == mbuf) + return -ENOMEM; + parg = mbuf; + } + + err = -EFAULT; + if (copy_from_user(parg, (void *)arg, _IOC_SIZE(cmd))) + goto out; + break; + } + + /* call driver */ + if ((err = func(inode, file, cmd, parg)) == -ENOIOCTLCMD) + err = -EINVAL; + + if (err < 0) + goto out; + + /* Copy results into user buffer */ + switch (_IOC_DIR(cmd)) + { + case _IOC_READ: + case (_IOC_WRITE | _IOC_READ): + if (copy_to_user((void *)arg, parg, _IOC_SIZE(cmd))) + err = -EFAULT; + break; + } + +out: + if (mbuf) + kfree(mbuf); + + return err; +} + + +int dvb_generic_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + dvb_device_t *dvbdev = file->private_data; + + if (!dvbdev) + return -ENODEV; + + if (!dvbdev->kernel_ioctl) + return -EINVAL; + + return generic_usercopy (inode, file, cmd, arg, dvbdev->kernel_ioctl); +} + + +static +int dvbdev_get_free_id (struct dvb_adapter_s *adap, int type) +{ + u32 id = 0; + + while (id < DVB_MAX_IDS) { + struct list_head *entry; + list_for_each (entry, &adap->device_list) { + dvb_device_t *dev; + dev = list_entry (entry, dvb_device_t, list_head); + if (dev->type == type && dev->id == id) + goto skip; + } + return id; +skip: + id++; + } + return -ENFILE; +} + + +int dvb_register_device(dvb_adapter_t *adap, dvb_device_t **pdvbdev, + dvb_device_t *template, void *priv, int type) +{ + u32 id; + char name [20]; + dvb_device_t *dvbdev; + + if (down_interruptible (&dvbdev_register_lock)) + return -ERESTARTSYS; + + if ((id = dvbdev_get_free_id (adap, type)) < 0) { + up (&dvbdev_register_lock); + *pdvbdev = 0; + printk ("%s: could get find free device id...\n", __FUNCTION__); + return -ENFILE; + } + + *pdvbdev = dvbdev = kmalloc(sizeof(dvb_device_t), GFP_KERNEL); + + if (!dvbdev) { + up(&dvbdev_register_lock); + return -ENOMEM; + } + + up (&dvbdev_register_lock); + + memcpy(dvbdev, template, sizeof(dvb_device_t)); + dvbdev->type = type; + dvbdev->id = id; + dvbdev->adapter = adap; + dvbdev->priv = priv; + + list_add_tail (&dvbdev->list_head, &adap->device_list); + + sprintf(name, "%s%d", dnames[type], id); + dvbdev->devfs_handle = devfs_register(adap->devfs_handle, name, + DVB_DEVFS_FLAGS, + DVB_MAJOR, + nums2minor(adap->num, type, id), + S_IFCHR | S_IRUSR | S_IWUSR, + dvbdev->fops, dvbdev); + + dprintk("%s: register adapter%d/%s @ minor: %i (0x%02x) - dvbdev: %p\n", + __FUNCTION__, adap->num, name, nums2minor(adap->num, type, id), + nums2minor(adap->num, type, id), dvbdev); + + return 0; +} + + +void dvb_unregister_device(dvb_device_t *dvbdev) +{ + if (!dvbdev) + return; + + devfs_unregister(dvbdev->devfs_handle); + list_del (&dvbdev->list_head); + kfree (dvbdev); +} + + +static +int dvbdev_get_free_adapter_num (void) +{ + int num = 0; + + while (1) { + struct list_head *entry; + list_for_each (entry, &dvb_adapter_list) { + dvb_adapter_t *adap; + adap = list_entry (entry, dvb_adapter_t, list_head); + if (adap->num == num) + goto skip; + } + return num; +skip: + num++; + } + + return -ENFILE; +} + + +int dvb_register_adapter(dvb_adapter_t **padap, char *name) +{ + char dirname[10]; + dvb_adapter_t *adap; + int num; + + if (down_interruptible (&dvbdev_register_lock)) + return -ERESTARTSYS; + + if ((num = dvbdev_get_free_adapter_num ()) < 0) { + up (&dvbdev_register_lock); + return -ENFILE; + } + + if (!(*padap = adap = kmalloc(sizeof(dvb_adapter_t), GFP_KERNEL))) { + up(&dvbdev_register_lock); + return -ENOMEM; + } + + memset (adap, 0, sizeof(dvb_adapter_t)); + INIT_LIST_HEAD (&adap->device_list); + + MOD_INC_USE_COUNT; + + printk ("%s: registering new adapter (%s).\n", __FUNCTION__, name); + + sprintf(dirname, "adapter%d", num); + adap->devfs_handle = devfs_mk_dir(dvb_devfs_handle, dirname, NULL); + adap->num = num; + + list_add_tail (&adap->list_head, &dvb_adapter_list); + + up (&dvbdev_register_lock); + + return num; +} + + +int dvb_unregister_adapter(dvb_adapter_t *adap) +{ + devfs_unregister (adap->devfs_handle); + if (down_interruptible (&dvbdev_register_lock)) + return -ERESTARTSYS; + list_del (&adap->list_head); + up (&dvbdev_register_lock); + kfree (adap); + MOD_DEC_USE_COUNT; + return 0; +} + + +static +int __init init_dvbdev(void) +{ + dvb_devfs_handle = devfs_mk_dir (NULL, "dvb", NULL); +#ifndef CONFIG_DVB_DEVFS_ONLY + if(register_chrdev(DVB_MAJOR,"DVB", &dvb_device_fops)) { + printk("video_dev: unable to get major %d\n", DVB_MAJOR); + return -EIO; + } +#endif + return 0; +} + + +static +void __exit exit_dvbdev(void) +{ +#ifndef CONFIG_DVB_DEVFS_ONLY + unregister_chrdev(DVB_MAJOR, "DVB"); +#endif + devfs_unregister(dvb_devfs_handle); +} + +module_init(init_dvbdev); +module_exit(exit_dvbdev); + +MODULE_DESCRIPTION("DVB Core Driver"); +MODULE_AUTHOR("Marcus Metzler, Ralph Metzler, Holger Waechtler"); +MODULE_LICENSE("GPL"); + +MODULE_PARM(dvbdev_debug,"i"); +MODULE_PARM_DESC(dvbdev_debug, "enable verbose debug messages"); + diff --git a/drivers/media/dvb/dvb-core/dvbdev.h b/drivers/media/dvb/dvb-core/dvbdev.h new file mode 100644 index 000000000000..52b0f0d09b54 --- /dev/null +++ b/drivers/media/dvb/dvb-core/dvbdev.h @@ -0,0 +1,91 @@ +/* + * dvbdev.h + * + * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de> + * & Marcus Metzler <marcus@convergence.de> + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Lesser Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVBDEV_H_ +#define _DVBDEV_H_ + +#include <linux/types.h> +#include <linux/version.h> +#include <linux/poll.h> +#include <linux/devfs_fs_kernel.h> +#include <linux/list.h> + +#define DVB_MAJOR 250 + +#define DVB_DEVICE_VIDEO 0 +#define DVB_DEVICE_AUDIO 1 +#define DVB_DEVICE_SEC 2 +#define DVB_DEVICE_FRONTEND 3 +#define DVB_DEVICE_DEMUX 4 +#define DVB_DEVICE_DVR 5 +#define DVB_DEVICE_CA 6 +#define DVB_DEVICE_NET 7 +#define DVB_DEVICE_OSD 8 + + +typedef struct dvb_adapter_s +{ + int num; + devfs_handle_t devfs_handle; + struct list_head list_head; + struct list_head device_list; +} dvb_adapter_t; + + +typedef struct dvb_device +{ + struct list_head list_head; + struct file_operations *fops; + devfs_handle_t devfs_handle; + dvb_adapter_t *adapter; + int type; + u32 id; + + int users; + int writers; + + /* don't really need those !? */ + int (*kernel_ioctl)(struct inode *inode, struct file *file, + unsigned int cmd, void *arg); // FIXME: use generic_usercopy() + + void *priv; +} dvb_device_t; + + +int dvb_register_device(dvb_adapter_t *adap, dvb_device_t **pdvbdev, + dvb_device_t *template, void *priv, int type); +void dvb_unregister_device(struct dvb_device *dvbdev); + +int dvb_register_adapter(dvb_adapter_t **padap, char *name); +int dvb_unregister_adapter(dvb_adapter_t *adap); + +int dvb_generic_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg); +int dvb_generic_open(struct inode *inode, struct file *file); +int dvb_generic_release(struct inode *inode, struct file *file); +int generic_usercopy(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg, + int (*func)(struct inode *inode, struct file *file, + unsigned int cmd, void *arg)); + +#endif /* #ifndef __DVBDEV_H */ diff --git a/drivers/media/dvb/frontends/Config.help b/drivers/media/dvb/frontends/Config.help new file mode 100644 index 000000000000..dd7cdc2d8496 --- /dev/null +++ b/drivers/media/dvb/frontends/Config.help @@ -0,0 +1,39 @@ +CONFIG_DVB_ALPS_BSRU6 + A DVB-S tuner module. + + Say Y when you want to support this frontend. + + If you don't know what tuner module is soldered on your + DVB adapter simply enable all supported frontends, the + right one will get autodetected. + +CONFIG_DVB_ALPS_BSRV2 + A DVB-S tuner module. Say Y when you want to support this frontend. + + If you don't know what tuner module is soldered on your + DVB adapter simply enable all supported frontends, the + right one will get autodetected. + +CONFIG_DVB_GRUNDIG_29504_491 + A DVB-S tuner module. Say Y when you want to support this frontend. + + If you don't know what tuner module is soldered on your + DVB adapter simply enable all supported frontends, the + right one will get autodetected. + +CONFIG_DVB_GRUNDIG_29504_401 + A DVB-T tuner module. Say Y when you want to support this frontend. + + If you don't know what tuner module is soldered on your + DVB adapter simply enable all supported frontends, the + right one will get autodetected. + +CONFIG_DVB_VES1820 + The VES1820 Demodulator is used on many DVB-C PCI cards and in some + DVB-C SetTopBoxes. Say Y when you see this demodulator chip near your + tuner module. + + If you don't know what tuner module is soldered on your + DVB adapter simply enable all supported frontends, the + right one will get autodetected. + diff --git a/drivers/media/dvb/frontends/Config.in b/drivers/media/dvb/frontends/Config.in new file mode 100644 index 000000000000..638a9462ca04 --- /dev/null +++ b/drivers/media/dvb/frontends/Config.in @@ -0,0 +1,9 @@ + +comment 'Supported Frontend Modules' + +dep_tristate ' Alps BSRU6 (QPSK)' CONFIG_DVB_ALPS_BSRU6 $CONFIG_DVB_CORE +dep_tristate ' Alps BSRV2 (QPSK)' CONFIG_DVB_ALPS_BSRV2 $CONFIG_DVB_CORE +dep_tristate ' Grundig 29504-491 (QPSK)' CONFIG_DVB_GRUNDIG_29504_491 $CONFIG_DVB_CORE +dep_tristate ' Grundig 29504-401 (OFDM)' CONFIG_DVB_GRUNDIG_29504_401 $CONFIG_DVB_CORE +dep_tristate ' Frontends with external VES1820 demodulator (QAM)' CONFIG_DVB_VES1820 $CONFIG_DVB_CORE + diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile new file mode 100644 index 000000000000..3ee94a40a3ec --- /dev/null +++ b/drivers/media/dvb/frontends/Makefile @@ -0,0 +1,14 @@ +# +# Makefile for the kernel DVB frontend device drivers. +# + +EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ + +obj-$(CONFIG_DVB_ALPS_BSRU6) += alps_bsru6.o +obj-$(CONFIG_DVB_ALPS_BSRV2) += alps_bsrv2.o +obj-$(CONFIG_DVB_GRUNDIG_29504_491) += grundig_29504-491.o +obj-$(CONFIG_DVB_GRUNDIG_29504_401) += grundig_29504-401.o +obj-$(CONFIG_DVB_VES1820) += ves1820.o + +include $(TOPDIR)/Rules.make + diff --git a/drivers/media/dvb/frontends/alps_bsru6.c b/drivers/media/dvb/frontends/alps_bsru6.c new file mode 100644 index 000000000000..1d2c9983c6db --- /dev/null +++ b/drivers/media/dvb/frontends/alps_bsru6.c @@ -0,0 +1,700 @@ +/* + Alps BSRU6 DVB QPSK frontend driver + + Copyright (C) 2001-2002 Convergence Integrated Media GmbH + <ralph@convergence.de>, <holger@convergence.de> + + 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 <linux/init.h> +#include <linux/module.h> + +#include "compat.h" +#include "dvb_frontend.h" + + +static int debug = 0; +#define dprintk if (debug) printk + + +#define M_CLK (88000000UL) + +/* M=21, K=0, P=0, f_VCO = 4MHz*4*(M+1)/(K+1) = 352 MHz */ + +static +struct dvb_frontend_info bsru6_info = { + name: "Alps BSRU6", + type: FE_QPSK, + frequency_min: 950000, + frequency_max: 2150000, + frequency_stepsize: 125, /* kHz for QPSK frontends */ + frequency_tolerance: M_CLK/2000, + symbol_rate_min: 1000000, + symbol_rate_max: 45000000, + symbol_rate_tolerance: 500, /* ppm */ + notifier_delay: 0, + caps: FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | + FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | + FE_CAN_QPSK +}; + + +static +u8 init_tab [] = { + 0x01, 0x15, // M: 0x15 DIRCLK: 0 K:0 + 0x02, 0x30, // P: 0 SERCLK: 0 VCO:ON STDBY:0 + + 0x03, 0x00, + 0x04, 0x7d, // F22FR, F22=22kHz + 0x05, 0x35, // SDAT:0 SCLT:0 I2CT:1 + 0x06, 0x00, // DAC mode and MSB + 0x07, 0x00, // DAC LSB + 0x08, 0x43, // DiSEqC + 0x09, 0x00, + 0x0a, 0x42, + 0x0c, 0x51, // QPSK reverse:1 Nyquist:0 OP0 val:1 OP0 con:1 OP1 val:1 OP1 con:1 + 0x0d, 0x82, + 0x0e, 0x23, + 0x0f, 0x52, + + 0x10, 0x3d, // AGC2 + 0x11, 0x84, + 0x12, 0xb5, // Lock detect: -64 Carrier freq detect:on + 0x13, 0xb6, // alpha_car b:4 a:0 noise est:256ks derot:on + 0x14, 0x93, // beat carc:0 d:0 e:0xf phase detect algo: 1 + 0x15, 0xc9, // lock detector threshold + + 0x16, 0x1d, + 0x17, 0x0, + 0x18, 0x14, + 0x19, 0xf2, + + 0x1a, 0x11, + + 0x1b, 0x9c, + 0x1c, 0x0, + 0x1d, 0x0, + 0x1e, 0xb, + + 0x22, 0x00, + 0x23, 0x00, + 0x24, 0xff, + 0x25, 0xff, + 0x26, 0xff, + + 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0 + 0x29, 0x1e, // 1/2 threshold + 0x2a, 0x14, // 2/3 threshold + 0x2b, 0x0f, // 3/4 threshold + 0x2c, 0x09, // 5/6 threshold + 0x2d, 0x05, // 7/8 threshold + 0x2e, 0x01, + + 0x31, 0x1f, // test all FECs + + 0x32, 0x19, // viterbi and synchro search + 0x33, 0xfc, // rs control + 0x34, 0x93, // error control + + + 0x0b, 0x00, + 0x27, 0x00, 0x2f, 0x00, 0x30, 0x00, + 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, + 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, + 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, + 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, + 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, + 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, + 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00 +}; + + +static +int stv0299_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data) +{ + int ret; + u8 buf [] = { reg, data }; + struct i2c_msg msg = { addr: 0x68, flags: 0, buf: buf, len: 2 }; + + dprintk ("%s\n", __FUNCTION__); + + ret = i2c->xfer (i2c, &msg, 1); + + if (ret != 1) + dprintk("%s: writereg error (reg == 0x%02x, val == 0x%02x, ret == %i)\n", + __FUNCTION__, reg, data, ret); + + return (ret != 1) ? -1 : 0; +} + + +static +u8 stv0299_readreg (struct dvb_i2c_bus *i2c, u8 reg) +{ + int ret; + u8 b0 [] = { reg }; + u8 b1 [] = { 0 }; + struct i2c_msg msg [] = { { addr: 0x68, flags: 0, buf: b0, len: 1 }, + { addr: 0x68, flags: I2C_M_RD, buf: b1, len: 1 } }; + + dprintk ("%s\n", __FUNCTION__); + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); + + return b1[0]; +} + + +static +int stv0299_readregs (struct dvb_i2c_bus *i2c, u8 reg1, u8 *b, u8 len) +{ + int ret; + struct i2c_msg msg [] = { { addr: 0x68, flags: 0, buf: ®1, len: 1 }, + { addr: 0x68, flags: I2C_M_RD, buf: b, len: len } }; + + dprintk ("%s\n", __FUNCTION__); + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); + + return ret == 2 ? 0 : -1; +} + + + +static +int tsa5059_write (struct dvb_i2c_bus *i2c, u8 data [4]) +{ + int ret; + u8 rpt1 [] = { 0x05, 0xb5 }; /* enable i2c repeater on stv0299 */ + struct i2c_msg msg [] = {{ addr: 0x68, flags: 0, buf: rpt1, len: 2 }, + { addr: 0x61, flags: 0, buf: data, len: 4 }}; + + dprintk ("%s\n", __FUNCTION__); + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret); + + return (ret != 2) ? -1 : 0; +} + + +/** + * set up the downconverter frequency divisor for a + * reference clock comparision frequency of 125 kHz. + */ +static +int tsa5059_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, u8 pwr) +{ + u32 div = freq / 125; + u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, 0x84, (pwr << 5) | 0x20 }; + + dprintk ("%s\n", __FUNCTION__); + + return tsa5059_write (i2c, buf); +} + + +static +int stv0299_init (struct dvb_i2c_bus *i2c) +{ + int i; + + dprintk("stv0299: init chip\n"); + + for (i=0; i<sizeof(init_tab); i+=2) + stv0299_writereg (i2c, init_tab[i], init_tab[i+1]); + + return 0; +} + + +static +int stv0299_set_inversion (struct dvb_i2c_bus *i2c, int inversion) +{ + u8 val; + + dprintk ("%s\n", __FUNCTION__); + + switch (inversion) { + case INVERSION_AUTO: + return -EOPNOTSUPP; + case INVERSION_OFF: + val = stv0299_readreg (i2c, 0x0c); + return stv0299_writereg (i2c, 0x0c, val | 0x01); + case INVERSION_ON: + val = stv0299_readreg (i2c, 0x0c); + return stv0299_writereg (i2c, 0x0c, val & 0xfe); + default: + return -EINVAL; + } +} + + +static +int stv0299_set_FEC (struct dvb_i2c_bus *i2c, fe_code_rate_t fec) +{ + dprintk ("%s\n", __FUNCTION__); + + switch (fec) { + case FEC_AUTO: + return stv0299_writereg (i2c, 0x31, 0x1f); + case FEC_1_2: + return stv0299_writereg (i2c, 0x31, 0x01); + case FEC_2_3: + return stv0299_writereg (i2c, 0x31, 0x02); + case FEC_3_4: + return stv0299_writereg (i2c, 0x31, 0x04); + case FEC_5_6: + return stv0299_writereg (i2c, 0x31, 0x08); + case FEC_7_8: + return stv0299_writereg (i2c, 0x31, 0x10); + default: + return -EINVAL; + } +} + + +static +fe_code_rate_t stv0299_get_FEC (struct dvb_i2c_bus *i2c) +{ + static fe_code_rate_t fec_tab [] = { FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_1_2 }; + u8 index; + + dprintk ("%s\n", __FUNCTION__); + + index = stv0299_readreg (i2c, 0x1b); + index &= 0x7; + + if (index > 4) + return FEC_AUTO; + + return fec_tab [index]; +} + + +static +int stv0299_wait_diseqc_fifo (struct dvb_i2c_bus *i2c, int timeout) +{ + unsigned long start = jiffies; + + dprintk ("%s\n", __FUNCTION__); + + while (stv0299_readreg(i2c, 0x0a) & 1) { + if (jiffies - start > timeout) { + dprintk ("%s: timeout!!\n", __FUNCTION__); + return -ETIMEDOUT; + } + current->state = TASK_INTERRUPTIBLE; + schedule_timeout (1); + }; + + return 0; +} + + +static +int stv0299_wait_diseqc_idle (struct dvb_i2c_bus *i2c, int timeout) +{ + unsigned long start = jiffies; + + dprintk ("%s\n", __FUNCTION__); + + while ((stv0299_readreg(i2c, 0x0a) & 3) != 2 ) { + if (jiffies - start > timeout) { + dprintk ("%s: timeout!!\n", __FUNCTION__); + return -ETIMEDOUT; + } + current->state = TASK_INTERRUPTIBLE; + schedule_timeout (1); + }; + + return 0; +} + + +static +int stv0299_send_diseqc_msg (struct dvb_i2c_bus *i2c, + struct dvb_diseqc_master_cmd *m) +{ + u8 val; + int i; + + dprintk ("%s\n", __FUNCTION__); + + val = stv0299_readreg (i2c, 0x08); + + if (stv0299_writereg (i2c, 0x08, (val & ~0x7) | 0x6)) /* DiSEqC mode */ + return -EREMOTEIO; + + for (i=0; i<m->msg_len; i++) { + if (stv0299_wait_diseqc_fifo (i2c, 100) < 0) + return -ETIMEDOUT; + + if (stv0299_writereg (i2c, 0x09, m->msg[i])) + return -EREMOTEIO; + } + + /* Shouldn't we wait for idle state (FE=1, FF=0) here to + make certain all bytes have been sent ? + Hmm, actually we should do that before all mode changes too ... + if (stv0299_wait_diseqc_idle (i2c, 100) < 0) */ + + if (stv0299_wait_diseqc_fifo (i2c, 100) < 0) + return -ETIMEDOUT; + + return 0; +} + + +static +int stv0299_send_diseqc_burst (struct dvb_i2c_bus *i2c, fe_sec_mini_cmd_t burst) +{ + u8 val; + + dprintk ("%s\n", __FUNCTION__); + + val = stv0299_readreg (i2c, 0x08); + + if (stv0299_wait_diseqc_fifo (i2c, 100) < 0) + return -ETIMEDOUT; + + if (stv0299_writereg (i2c, 0x08, (val & ~0x7) | 0x2)) /* burst mode */ + return -EREMOTEIO; + + if (stv0299_writereg (i2c, 0x09, burst == SEC_MINI_A ? 0x00 : 0xff)) + return -EREMOTEIO; + + if (stv0299_wait_diseqc_fifo (i2c, 100) < 0) + return -ETIMEDOUT; + + if (stv0299_writereg (i2c, 0x08, val)) + return -EREMOTEIO; + + return 0; +} + + +static +int stv0299_set_tone (struct dvb_i2c_bus *i2c, fe_sec_tone_mode_t tone) +{ + u8 val; + + dprintk ("%s\n", __FUNCTION__); + + val = stv0299_readreg (i2c, 0x08); + + switch (tone) { + case SEC_TONE_ON: + return stv0299_writereg (i2c, 0x08, val | 0x3); + case SEC_TONE_OFF: + return stv0299_writereg (i2c, 0x08, (val & ~0x3) | 0x02); + default: + return -EINVAL; + }; +} + + +static +int stv0299_set_voltage (struct dvb_i2c_bus *i2c, fe_sec_voltage_t voltage) +{ + u8 val; + + dprintk ("%s\n", __FUNCTION__); + + val = stv0299_readreg (i2c, 0x0c); + val &= 0x0f; + val |= 0x40; + + switch (voltage) { + case SEC_VOLTAGE_13: + return stv0299_writereg (i2c, 0x0c, val); + case SEC_VOLTAGE_18: + return stv0299_writereg (i2c, 0x0c, val | 0x10); + default: + return -EINVAL; + }; +} + + +static +int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate) +{ + u32 ratio; + u32 tmp; + u8 aclk = 0xb4, bclk = 0x51; + + dprintk ("%s\n", __FUNCTION__); + + if (srate > M_CLK) + srate = M_CLK; + if (srate < 500000) + srate = 500000; + + if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; } + if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; } + if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; } + if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; } + if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; } + +#define FIN (M_CLK >> 4) + + tmp = srate << 4; + ratio = tmp / FIN; + + tmp = (tmp % FIN) << 8; + ratio = (ratio << 8) + tmp / FIN; + + tmp = (tmp % FIN) << 8; + ratio = (ratio << 8) + tmp / FIN; + + stv0299_writereg (i2c, 0x13, aclk); + stv0299_writereg (i2c, 0x14, bclk); + stv0299_writereg (i2c, 0x1f, (ratio >> 16) & 0xff); + stv0299_writereg (i2c, 0x20, (ratio >> 8) & 0xff); + stv0299_writereg (i2c, 0x21, (ratio ) & 0xf0); + + return 0; +} + + + +static +int stv0299_get_symbolrate (struct dvb_i2c_bus *i2c) +{ + u32 Mclk = M_CLK / 4096L; + u32 srate; + s32 offset; + u8 sfr[3]; + s8 rtf; + + dprintk ("%s\n", __FUNCTION__); + + stv0299_readregs (i2c, 0x1f, sfr, 3); + stv0299_readregs (i2c, 0x1a, &rtf, 1); + + srate = (sfr[0] << 8) | sfr[1]; + srate *= Mclk; + srate /= 16; + srate += (sfr[2] >> 4) * Mclk / 256; + + offset = (s32) rtf * (srate / 4096L); + offset /= 128; + + srate += offset; + + srate += 1000; + srate /= 2000; + srate *= 2000; + + return srate; +} + + +static +int bsru6_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg) +{ + struct dvb_i2c_bus *i2c = fe->i2c; + + dprintk ("%s\n", __FUNCTION__); + + switch (cmd) { + case FE_GET_INFO: + memcpy (arg, &bsru6_info, sizeof(struct dvb_frontend_info)); + break; + + case FE_READ_STATUS: + { + fe_status_t *status = (fe_status_t *) arg; + u8 signal = 0xff - stv0299_readreg (i2c, 0x18); + u8 sync = stv0299_readreg (i2c, 0x1b); + + *status = 0; + + if (signal > 10) + *status |= FE_HAS_SIGNAL; + + if (sync & 0x80) + *status |= FE_HAS_CARRIER; + + if (sync & 0x10) + *status |= FE_HAS_VITERBI; + + if (sync & 0x08) + *status |= FE_HAS_SYNC; + + if ((sync & 0x98) == 0x98) + *status |= FE_HAS_LOCK; + + break; + } + + case FE_READ_BER: + *((u32*) arg) = (stv0299_readreg (i2c, 0x1d) << 8) + | stv0299_readreg (i2c, 0x1e); + break; + + case FE_READ_SIGNAL_STRENGTH: + { + s32 signal = 0xffff - ((stv0299_readreg (i2c, 0x18) << 8) + | stv0299_readreg (i2c, 0x19)); + signal = signal * 5 / 4; + *((u16*) arg) = (signal > 0xffff) ? 0xffff : + (signal < 0) ? 0 : signal; + break; + } + case FE_READ_SNR: + { + s32 snr = 0xffff - ((stv0299_readreg (i2c, 0x24) << 8) + | stv0299_readreg (i2c, 0x25)); + snr = 3 * (snr - 0xa100); + *((u16*) arg) = (snr > 0xffff) ? 0xffff : + (snr < 0) ? 0 : snr; + break; + } + case FE_READ_UNCORRECTED_BLOCKS: + *((u32*) arg) = 0; /* the stv0299 can't measure BER and */ + return -EOPNOTSUPP; /* errors at the same time.... */ + + case FE_SET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + + tsa5059_set_tv_freq (i2c, p->frequency, 3); + stv0299_set_inversion (i2c, p->inversion); + stv0299_set_FEC (i2c, p->u.qpsk.fec_inner); + stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate); + tsa5059_set_tv_freq (i2c, p->frequency, 0); + stv0299_writereg (i2c, 0x22, 0x00); + stv0299_writereg (i2c, 0x23, 0x00); + stv0299_readreg (i2c, 0x23); + stv0299_writereg (i2c, 0x12, 0xb9); + break; + } + + case FE_GET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + s32 derot_freq; + + derot_freq = (s32)(s16) ((stv0299_readreg (i2c, 0x22) << 8) + | stv0299_readreg (i2c, 0x23)); + + derot_freq *= (M_CLK >> 16); + derot_freq += 500; + derot_freq /= 1000; + + p->frequency += derot_freq; + p->inversion = (stv0299_readreg (i2c, 0x0c) & 1) ? + INVERSION_OFF : INVERSION_ON; + p->u.qpsk.fec_inner = stv0299_get_FEC (i2c); + p->u.qpsk.symbol_rate = stv0299_get_symbolrate (i2c); + break; + } + + case FE_SLEEP: + stv0299_writereg (i2c, 0x0c, 0x00); /* LNB power off! */ + stv0299_writereg (i2c, 0x02, 0x80); + break; + + case FE_INIT: + return stv0299_init (i2c); + + case FE_RESET: + stv0299_writereg (i2c, 0x22, 0x00); + stv0299_writereg (i2c, 0x23, 0x00); + stv0299_readreg (i2c, 0x23); + stv0299_writereg (i2c, 0x12, 0xb9); + break; + + case FE_DISEQC_SEND_MASTER_CMD: + return stv0299_send_diseqc_msg (i2c, arg); + + case FE_DISEQC_SEND_BURST: + return stv0299_send_diseqc_burst (i2c, (fe_sec_mini_cmd_t) arg); + + case FE_SET_TONE: + return stv0299_set_tone (i2c, (fe_sec_tone_mode_t) arg); + + case FE_SET_VOLTAGE: + return stv0299_set_voltage (i2c, (fe_sec_voltage_t) arg); + + default: + return -EOPNOTSUPP; + }; + + return 0; +} + + + +static +int bsru6_attach (struct dvb_i2c_bus *i2c) +{ + dprintk ("%s\n", __FUNCTION__); + + if ((stv0299_readreg (i2c, 0x00)) != 0xa1) + return -ENODEV; + + dvb_register_frontend (bsru6_ioctl, i2c, NULL, &bsru6_info); + + return 0; +} + + +static +void bsru6_detach (struct dvb_i2c_bus *i2c) +{ + dprintk ("%s\n", __FUNCTION__); + + dvb_unregister_frontend (bsru6_ioctl, i2c); +} + + +static +int __init init_bsru6 (void) +{ + dprintk ("%s\n", __FUNCTION__); + + return dvb_register_i2c_device (THIS_MODULE, bsru6_attach, bsru6_detach); +} + + +static +void __exit exit_bsru6 (void) +{ + dprintk ("%s\n", __FUNCTION__); + + dvb_unregister_i2c_device (bsru6_attach); +} + +module_init (init_bsru6); +module_exit (exit_bsru6); + +MODULE_PARM(debug,"i"); +MODULE_PARM_DESC(debug, "enable verbose debug messages"); +MODULE_DESCRIPTION("BSRU6 DVB Frontend driver"); +MODULE_AUTHOR("Ralph Metzler, Holger Waechtler"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/media/dvb/frontends/alps_bsrv2.c b/drivers/media/dvb/frontends/alps_bsrv2.c new file mode 100644 index 000000000000..8da1f5bb5183 --- /dev/null +++ b/drivers/media/dvb/frontends/alps_bsrv2.c @@ -0,0 +1,470 @@ +/* + Driver for Alps BSRV2 QPSK Frontend + + Copyright (C) 1999 Convergence Integrated Media GmbH <ralph@convergence.de> + + 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 <linux/module.h> +#include <linux/init.h> + +#include "compat.h" +#include "dvb_frontend.h" + +static int debug = 0; +#define dprintk if (debug) printk + + +static +struct dvb_frontend_info bsrv2_info = { + name: "Alps BSRV2", + type: FE_QPSK, + frequency_min: 950000, + frequency_max: 2150000, + frequency_stepsize: 250, /* kHz for QPSK frontends */ + frequency_tolerance: 29500, + symbol_rate_min: 1000000, + symbol_rate_max: 45000000, +/* symbol_rate_tolerance: ???,*/ + notifier_delay: 50, /* 1/20 s */ + caps: FE_CAN_INVERSION_AUTO | + FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | + FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | + FE_CAN_QPSK +}; + + + +static +u8 init_1893_tab [] = { + 0x01, 0xA4, 0x35, 0x81, 0x2A, 0x0d, 0x55, 0xC4, + 0x09, 0x69, 0x00, 0x86, 0x4c, 0x28, 0x7F, 0x00, + 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x31, 0xb0, 0x14, 0x00, 0xDC, 0x20, + 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x00, 0x00, 0x7f, 0x00 +}; + + +static +u8 init_1893_wtab[] = +{ + 1,1,1,1,1,1,1,1, 1,1,0,0,1,1,0,0, + 0,1,0,0,0,0,0,0, 1,0,1,1,0,0,0,1, + 1,1,1,0,0,0,0,0, 0,0,1,1,0,0,0,0, + 1,1,1,0,1,1 +}; + + +static +int ves1893_writereg (struct dvb_i2c_bus *i2c, int reg, int data) +{ + u8 buf [] = { 0x00, reg, data }; + struct i2c_msg msg = { addr: 0x08, flags: 0, buf: buf, len: 3 }; + int err; + + if ((err = i2c->xfer (i2c, &msg, 1)) != 1) { + dprintk ("%s: writereg error (err == %i, reg == 0x%02x, data == 0x%02x)\n", __FUNCTION__, err, reg, data); + return -EREMOTEIO; + } + + return 0; +} + + +static +u8 ves1893_readreg (struct dvb_i2c_bus *i2c, u8 reg) +{ + int ret; + u8 b0 [] = { 0x00, reg }; + u8 b1 [] = { 0 }; + struct i2c_msg msg [] = { { addr: 0x08, flags: 0, buf: b0, len: 2 }, + { addr: 0x08, flags: I2C_M_RD, buf: b1, len: 1 } }; + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); + + return b1[0]; +} + + +static +int sp5659_write (struct dvb_i2c_bus *i2c, u8 data [4]) +{ + int ret; + struct i2c_msg msg = { addr: 0x61, flags: 0, buf: data, len: 4 }; + + ret = i2c->xfer (i2c, &msg, 1); + + if (ret != 1) + printk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret); + + return (ret != 1) ? -1 : 0; +} + + + +/** + * set up the downconverter frequency divisor for a + * reference clock comparision frequency of 125 kHz. + */ +static +int sp5659_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, u8 pwr) +{ + u32 div = (freq + 479500) / 125; + u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, 0x95, (pwr << 5) | 0x30 }; + + return sp5659_write (i2c, buf); +} + + +static +int ves1893_init (struct dvb_i2c_bus *i2c) +{ + int i; + + dprintk("%s: init chip\n", __FUNCTION__); + + for (i=0; i<54; i++) + if (init_1893_wtab[i]) + ves1893_writereg (i2c, i, init_1893_tab[i]); + + return 0; +} + + +static +int ves1893_clr_bit (struct dvb_i2c_bus *i2c) +{ + ves1893_writereg (i2c, 0, init_1893_tab[0] & 0xfe); + ves1893_writereg (i2c, 0, init_1893_tab[0]); + ves1893_writereg (i2c, 3, 0x00); + return ves1893_writereg (i2c, 3, init_1893_tab[3]); +} + + +static +int ves1893_set_inversion (struct dvb_i2c_bus *i2c, fe_spectral_inversion_t inversion) +{ + u8 val; + + switch (inversion) { + case INVERSION_OFF: + val = 0xc0; + break; + case INVERSION_ON: + val = 0x80; + break; + case INVERSION_AUTO: + val = 0x40; + break; + default: + return -EINVAL; + } + + return ves1893_writereg (i2c, 0x0c, (init_1893_tab[0x0c] & 0x3f) | val); +} + + +static +int ves1893_set_fec (struct dvb_i2c_bus *i2c, fe_code_rate_t fec) +{ + if (fec == FEC_AUTO) + return ves1893_writereg (i2c, 0x0d, 0x08); + else if (fec < FEC_1_2 || fec > FEC_8_9) + return -EINVAL; + else + return ves1893_writereg (i2c, 0x0d, fec - FEC_1_2); +} + + +static +fe_code_rate_t ves1893_get_fec (struct dvb_i2c_bus *i2c) +{ + return FEC_1_2 + ((ves1893_readreg (i2c, 0x0d) >> 4) & 0x7); +} + + +static +int ves1893_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate) +{ + u32 BDR; + u32 ratio; + u8 ADCONF, FCONF, FNR; + u32 BDRI; + u32 tmp; + + dprintk("%s: srate == %d\n", __FUNCTION__, srate); + + if (srate > 90100000UL/2) + srate = 90100000UL/2; + + if (srate < 500000) + srate = 500000; + +#define MUL (1UL<<26) +#define FIN (90106000UL>>4) + + tmp = srate << 6; + ratio = tmp / FIN; + + tmp = (tmp % FIN) << 8; + ratio = (ratio << 8) + tmp / FIN; + + tmp = (tmp % FIN) << 8; + ratio = (ratio << 8) + tmp / FIN; + + FNR = 0xff; + + if (ratio < MUL/3) FNR = 0; + if (ratio < (MUL*11)/50) FNR = 1; + if (ratio < MUL/6) FNR = 2; + if (ratio < MUL/9) FNR = 3; + if (ratio < MUL/12) FNR = 4; + if (ratio < (MUL*11)/200) FNR = 5; + if (ratio < MUL/24) FNR = 6; + if (ratio < (MUL*27)/1000) FNR = 7; + if (ratio < MUL/48) FNR = 8; + if (ratio < (MUL*137)/10000) FNR = 9; + + if (FNR == 0xff) { + ADCONF = 0x89; + FCONF = 0x80; + FNR = 0; + } else { + ADCONF = 0x81; + FCONF = 0x88 | (FNR >> 1) | ((FNR & 0x01) << 5); + } + + BDR = (( (ratio << (FNR >> 1)) >> 4) + 1) >> 1; + BDRI = ( ((FIN << 8) / ((srate << (FNR >> 1)) >> 2)) + 1) >> 1; + + dprintk("FNR= %d\n", FNR); + dprintk("ratio= %08x\n", ratio); + dprintk("BDR= %08x\n", BDR); + dprintk("BDRI= %02x\n", BDRI); + + if (BDRI > 0xff) + BDRI = 0xff; + + ves1893_writereg (i2c, 0x06, 0xff & BDR); + ves1893_writereg (i2c, 0x07, 0xff & (BDR >> 8)); + ves1893_writereg (i2c, 0x08, 0x0f & (BDR >> 16)); + + ves1893_writereg (i2c, 0x09, BDRI); + ves1893_writereg (i2c, 0x20, ADCONF); + ves1893_writereg (i2c, 0x21, FCONF); + + if (srate < 6000000) + ves1893_writereg (i2c, 0x05, init_1893_tab[0x05] | 0x80); + else + ves1893_writereg (i2c, 0x05, init_1893_tab[0x05] & 0x7f); + + ves1893_writereg (i2c, 0x00, 0x00); + ves1893_writereg (i2c, 0x00, 0x01); + + ves1893_clr_bit (i2c); + + return 0; +} + + +static +int ves1893_set_voltage (struct dvb_i2c_bus *i2c, fe_sec_voltage_t voltage) +{ + switch (voltage) { + case SEC_VOLTAGE_13: + return ves1893_writereg (i2c, 0x1f, 0x20); + case SEC_VOLTAGE_18: + return ves1893_writereg (i2c, 0x1f, 0x30); + default: + return -EINVAL; + }; +} + + +static +int bsrv2_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg) +{ + struct dvb_i2c_bus *i2c = fe->i2c; + + switch (cmd) { + case FE_GET_INFO: + memcpy (arg, &bsrv2_info, sizeof(struct dvb_frontend_info)); + break; + + case FE_READ_STATUS: + { + fe_status_t *status = arg; + int sync = ves1893_readreg (i2c, 0x0e); + + *status = 0; + + if (sync & 1) + *status |= FE_HAS_SIGNAL; + + if (sync & 2) + *status |= FE_HAS_CARRIER; + + if (sync & 4) + *status |= FE_HAS_VITERBI; + + if (sync & 8) + *status |= FE_HAS_SYNC; + + if ((sync & 0x1f) == 0x1f) + *status |= FE_HAS_LOCK; + + break; + } + + case FE_READ_BER: + { + u32 *ber = (u32 *) arg; + + *ber = ves1893_readreg (i2c, 0x15); + *ber |= (ves1893_readreg (i2c, 0x16) << 8); + *ber |= (ves1893_readreg (i2c, 0x17) << 16); + *ber *= 10; + break; + } + + case FE_READ_SIGNAL_STRENGTH: + { + u8 signal = ~ves1893_readreg (i2c, 0x0b); + *((u16*) arg) = (signal << 8) | signal; + break; + } + + case FE_READ_SNR: + { + u8 snr = ~ves1893_readreg (i2c, 0x1c); + *(u16*) arg = (snr << 8) | snr; + break; + } + + case FE_READ_UNCORRECTED_BLOCKS: + { + *(u32*) arg = ves1893_readreg (i2c, 0x18) & 0x7f; + + if (*(u32*) arg == 0x7f) + *(u32*) arg = 0xffffffff; /* counter overflow... */ + + ves1893_writereg (i2c, 0x18, 0x00); /* reset the counter */ + ves1893_writereg (i2c, 0x18, 0x80); /* dto. */ + break; + } + + case FE_SET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + + sp5659_set_tv_freq (i2c, p->frequency, 0); + ves1893_set_inversion (i2c, p->inversion); + ves1893_set_fec (i2c, p->u.qpsk.fec_inner); +// sp5659_set_tv_freq (i2c, p->frequency, 0); + ves1893_set_symbolrate (i2c, p->u.qpsk.symbol_rate); + break; + } + + case FE_GET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + s32 afc; + + afc = ((int)((char)(ves1893_readreg (i2c, 0x0a) << 1)))/2; + afc = (afc * (int)(p->u.qpsk.symbol_rate/8))/16; + + p->frequency += afc; + p->inversion = (ves1893_readreg (i2c, 0x0f) & 2) ? + INVERSION_ON : INVERSION_OFF; + p->u.qpsk.fec_inner = ves1893_get_fec (i2c); + /* XXX FIXME: timing offset !! */ + break; + } + + case FE_SLEEP: + ves1893_writereg (i2c, 0x1f, 0x00); /* LNB power off */ + return ves1893_writereg (i2c, 0x00, 0x08); + + case FE_INIT: + return ves1893_init (i2c); + + case FE_RESET: + return ves1893_clr_bit (i2c); + + case FE_SET_TONE: + return -EOPNOTSUPP; /* the ves1893 can generate the 22k */ + /* let's implement this when we have */ + /* a box that uses the 22K_0 pin... */ + case FE_SET_VOLTAGE: + return ves1893_set_voltage (i2c, (fe_sec_voltage_t) arg); + + default: + return -EOPNOTSUPP; + }; + + return 0; +} + + +static +int bsrv2_attach (struct dvb_i2c_bus *i2c) +{ + if ((ves1893_readreg (i2c, 0x1e) & 0xf0) != 0xd0) + return -ENODEV; + + dvb_register_frontend (bsrv2_ioctl, i2c, NULL, &bsrv2_info); + + return 0; +} + + +static +void bsrv2_detach (struct dvb_i2c_bus *i2c) +{ + dvb_unregister_frontend (bsrv2_ioctl, i2c); +} + + +static +int __init init_bsrv2 (void) +{ + return dvb_register_i2c_device (THIS_MODULE, bsrv2_attach, bsrv2_detach); +} + + +static +void __exit exit_bsrv2 (void) +{ + dvb_unregister_i2c_device (bsrv2_attach); +} + + +module_init(init_bsrv2); +module_exit(exit_bsrv2); + + +MODULE_DESCRIPTION("BSRV2 DVB-S Frontend"); +MODULE_AUTHOR("Ralph Metzler"); +MODULE_LICENSE("GPL"); +MODULE_PARM(debug,"i"); + diff --git a/drivers/media/dvb/frontends/grundig_29504-401.c b/drivers/media/dvb/frontends/grundig_29504-401.c new file mode 100644 index 000000000000..a65e9843f747 --- /dev/null +++ b/drivers/media/dvb/frontends/grundig_29504-401.c @@ -0,0 +1,484 @@ +/* + driver for Grundig 29504-401 DVB-T Frontends based on + LSI L64781 COFDM demodulator as used in Technotrend DVB-T cards + + Copyright (C) 2001 Holger Waechtler <holger@convergence.de> + for Convergence Integrated Media GmbH + Marko Kohtala <marko.kohtala@nokia.com> + + 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 <linux/module.h> +#include <linux/init.h> + +#include "compat.h" +#include "dvb_frontend.h" + +static int debug = 0; + +#define dprintk if (debug) printk + + +struct dvb_frontend_info grundig_29504_401_info = { + name: "Grundig 29504-401", + type: FE_OFDM, +/* frequency_min: ???,*/ +/* frequency_max: ???,*/ + frequency_stepsize: 166666, +/* frequency_tolerance: ???,*/ +/* symbol_rate_tolerance: ???,*/ + notifier_delay: 0, + caps: FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | + FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | + FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | + FE_CAN_MUTE_TS +}; + + +static +int l64781_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data) +{ + int ret; + u8 buf [] = { reg, data }; + struct i2c_msg msg = { addr: 0x55, flags: 0, buf: buf, len: 2 }; + + if ((ret = i2c->xfer (i2c, &msg, 1)) != 1) + dprintk ("%s: write_reg error (reg == %02x) = %02x!\n", + __FUNCTION__, reg, ret); + + return (ret != 1) ? -1 : 0; +} + + +static +u8 l64781_readreg (struct dvb_i2c_bus *i2c, u8 reg) +{ + int ret; + u8 b0 [] = { reg }; + u8 b1 [] = { 0 }; + struct i2c_msg msg [] = { { addr: 0x55, flags: 0, buf: b0, len: 1 }, + { addr: 0x55, flags: I2C_M_RD, buf: b1, len: 1 } }; + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); + + return b1[0]; +} + + +static +int tsa5060_write (struct dvb_i2c_bus *i2c, u8 data [4]) +{ + int ret; + struct i2c_msg msg = { addr: 0x61, flags: 0, buf: data, len: 4 }; + + if ((ret = i2c->xfer (i2c, &msg, 1)) != 1) + dprintk ("%s: write_reg error == %02x!\n", __FUNCTION__, ret); + + return (ret != 1) ? -1 : 0; +} + + +/** + * set up the downconverter frequency divisor for a + * reference clock comparision frequency of 166666 Hz. + * frequency offset is 36000000 Hz. + */ +static +int tsa5060_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, u8 pwr) +{ + u32 div; + u8 buf [4]; + u8 cfg; + + if (freq < 700000000) { + div = (36000000 + freq) / 31250; + cfg = 0x86; + } else { + div = (36000000 + freq) / 166666; + cfg = 0x88; + } + + buf [0] = (div >> 8) & 0x7f; + buf [1] = div & 0xff; + buf [2] = ((div >> 10) & 0x60) | cfg; + buf [3] = pwr << 6; + + return tsa5060_write (i2c, buf); +} + + +static +void apply_tps (struct dvb_i2c_bus *i2c) +{ + l64781_writereg (i2c, 0x2a, 0x00); + l64781_writereg (i2c, 0x2a, 0x01); + + /* This here is a little bit questionable because it enables + the automatic update of TPS registers. I think we'd need to + handle the IRQ from FE to update some other registers as + well, or at least implement some magic to tuning to correct + to the TPS received from transmission. */ + l64781_writereg (i2c, 0x2a, 0x02); +} + + +static +void reset_afc (struct dvb_i2c_bus *i2c) +{ + /* Set AFC stall for the AFC_INIT_FRQ setting, TIM_STALL for + timing offset */ + l64781_writereg (i2c, 0x07, 0x9e); /* stall AFC */ + l64781_writereg (i2c, 0x08, 0); /* AFC INIT FREQ */ + l64781_writereg (i2c, 0x09, 0); + l64781_writereg (i2c, 0x0a, 0); + l64781_writereg (i2c, 0x07, 0x8e); + l64781_writereg (i2c, 0x0e, 0); /* AGC gain to zero in beginning */ + l64781_writereg (i2c, 0x11, 0x80); /* stall TIM */ + l64781_writereg (i2c, 0x10, 0); /* TIM_OFFSET_LSB */ + l64781_writereg (i2c, 0x12, 0); + l64781_writereg (i2c, 0x13, 0); + l64781_writereg (i2c, 0x11, 0x00); +} + + +static +int apply_frontend_param (struct dvb_i2c_bus *i2c, + struct dvb_frontend_parameters *param) +{ + /* The coderates for FEC_NONE, FEC_4_5 and FEC_FEC_6_7 are arbitrary */ + static const u8 fec_tab[] = { 7, 0, 1, 2, 9, 3, 10, 4 }; + /* QPSK, QAM_16, QAM_64 */ + static const u8 qam_tab [] = { 2, 4, 0, 6 }; + static const u8 bw_tab [] = { 8, 7, 6 }; /* 8Mhz, 7MHz, 6MHz */ + static const u8 guard_tab [] = { 1, 2, 4, 8 }; + /* The Grundig 29504-401.04 Tuner comes with 18.432MHz crystal. */ + static const u32 ppm = 8000; + struct dvb_ofdm_parameters *p = ¶m->u.ofdm; + u32 ddfs_offset_fixed; +/* u32 ddfs_offset_variable = 0x6000-((1000000UL+ppm)/ */ +/* bw_tab[p->bandWidth]<<10)/15625; */ + u32 init_freq; + u32 spi_bias; + u8 val0x04; + u8 val0x05; + u8 val0x06; + + if (param->inversion != INVERSION_ON && + param->inversion != INVERSION_OFF) + return -EINVAL; + + if (p->bandwidth < BANDWIDTH_8_MHZ || p->bandwidth > BANDWIDTH_6_MHZ) + return -EINVAL; + + if (p->code_rate_HP != FEC_1_2 && p->code_rate_HP != FEC_2_3 && + p->code_rate_HP != FEC_3_4 && p->code_rate_HP != FEC_5_6 && + p->code_rate_HP != FEC_7_8) + return -EINVAL; + + if (p->hierarchy_information != HIERARCHY_NONE && + (p->code_rate_LP != FEC_1_2 && p->code_rate_LP != FEC_2_3 && + p->code_rate_LP != FEC_3_4 && p->code_rate_LP != FEC_5_6 && + p->code_rate_LP != FEC_7_8)) + return -EINVAL; + + if (p->constellation != QPSK && p->constellation != QAM_16 && + p->constellation != QAM_64) + return -EINVAL; + + if (p->transmission_mode != TRANSMISSION_MODE_2K && + p->transmission_mode != TRANSMISSION_MODE_8K) + return -EINVAL; + + if (p->guard_interval < GUARD_INTERVAL_1_32 || + p->guard_interval > GUARD_INTERVAL_1_4) + return -EINVAL; + + if (p->hierarchy_information < HIERARCHY_NONE || + p->hierarchy_information > HIERARCHY_4) + return -EINVAL; + + ddfs_offset_fixed = 0x4000-(ppm<<16)/bw_tab[p->bandwidth]/1000000; + + /* This works up to 20000 ppm, it overflows if too large ppm! */ + init_freq = (((8UL<<25) + (8UL<<19) / 25*ppm / (15625/25)) / + bw_tab[p->bandwidth] & 0xFFFFFF); + + /* SPI bias calculation is slightly modified to fit in 32bit */ + /* will work for high ppm only... */ + spi_bias = 378 * (1 << 10); + spi_bias *= 16; + spi_bias *= bw_tab[p->bandwidth]; + spi_bias *= qam_tab[p->constellation]; + spi_bias /= p->code_rate_HP + 1; + spi_bias /= (guard_tab[p->guard_interval] + 32); + spi_bias *= 1000ULL; + spi_bias /= 1000ULL + ppm/1000; + spi_bias *= p->code_rate_HP; + + val0x04 = (p->transmission_mode << 2) | p->guard_interval; + val0x05 = fec_tab[p->code_rate_HP]; + if (p->hierarchy_information != HIERARCHY_NONE) + val0x05 |= (p->code_rate_LP - FEC_1_2) << 3; + + val0x06 = (p->hierarchy_information << 2) | p->constellation; + + l64781_writereg (i2c, 0x04, val0x04); + l64781_writereg (i2c, 0x05, val0x05); + l64781_writereg (i2c, 0x06, val0x06); + + reset_afc (i2c); + + /* Technical manual section 2.6.1, TIM_IIR_GAIN optimal values */ + l64781_writereg (i2c, 0x15, + p->transmission_mode == TRANSMISSION_MODE_2K ? 1 : 3); + l64781_writereg (i2c, 0x16, init_freq & 0xff); + l64781_writereg (i2c, 0x17, (init_freq >> 8) & 0xff); + l64781_writereg (i2c, 0x18, (init_freq >> 16) & 0xff); + + l64781_writereg (i2c, 0x1b, spi_bias & 0xff); + l64781_writereg (i2c, 0x1c, (spi_bias >> 8) & 0xff); + l64781_writereg (i2c, 0x1d, ((spi_bias >> 16) & 0x7f) | + (param->inversion == INVERSION_ON ? 0x80 : 0x00)); + + l64781_writereg (i2c, 0x22, ddfs_offset_fixed & 0xff); + l64781_writereg (i2c, 0x23, (ddfs_offset_fixed >> 8) & 0x3f); + + l64781_readreg (i2c, 0x00); /* clear interrupt registers... */ + l64781_readreg (i2c, 0x01); /* dto. */ + + apply_tps (i2c); + + return 0; +} + + +static +void reset_and_configure (struct dvb_i2c_bus *i2c) +{ + u8 buf [] = { 0x06 }; + struct i2c_msg msg = { addr: 0x00, flags: 0, buf: buf, len: 1 }; + + i2c->xfer (i2c, &msg, 1); +} + + + +static +int init (struct dvb_i2c_bus *i2c) +{ + reset_and_configure (i2c); + + /* Power up */ + l64781_writereg (i2c, 0x3e, 0xa5); + + /* Reset hard */ + l64781_writereg (i2c, 0x2a, 0x04); + l64781_writereg (i2c, 0x2a, 0x00); + + /* Set tuner specific things */ + /* AFC_POL, set also in reset_afc */ + l64781_writereg (i2c, 0x07, 0x8e); + + /* Use internal ADC */ + l64781_writereg (i2c, 0x0b, 0x81); + + /* AGC loop gain, and polarity is positive */ + l64781_writereg (i2c, 0x0c, 0x84); + + /* Internal ADC outputs two's complement */ + l64781_writereg (i2c, 0x0d, 0x8c); + + /* With ppm=8000, it seems the DTR_SENSITIVITY will result in + value of 2 with all possible bandwidths and guard + intervals, which is the initial value anyway. */ + /*l64781_writereg (i2c, 0x19, 0x92);*/ + + /* Everything is two's complement, soft bit and CSI_OUT too */ + l64781_writereg (i2c, 0x1e, 0x49); + + return 0; +} + + +static +int grundig_29504_401_ioctl (struct dvb_frontend *fe, + unsigned int cmd, void *arg) +{ + struct dvb_i2c_bus *i2c = fe->i2c; + switch (cmd) { + case FE_GET_INFO: + memcpy (arg, &grundig_29504_401_info, + sizeof(struct dvb_frontend_info)); + break; + + case FE_READ_STATUS: + { + fe_status_t *status = (fe_status_t *) arg; + int sync = l64781_readreg (i2c, 0x32); + int gain = l64781_readreg (i2c, 0x0e); + + l64781_readreg (i2c, 0x00); /* clear interrupt registers... */ + l64781_readreg (i2c, 0x01); /* dto. */ + + *status = 0; + + if (gain > 5) + *status |= FE_HAS_SIGNAL; + + if (sync & 0x02) /* VCXO locked, this criteria should be ok */ + *status |= FE_HAS_CARRIER; + + if (sync & 0x20) + *status |= FE_HAS_VITERBI; + + if (sync & 0x40) + *status |= FE_HAS_SYNC; + + if (sync == 0x7f) + *status |= FE_HAS_LOCK; + + break; + } + + case FE_READ_BER: + { + /* XXX FIXME: set up counting period (reg 0x26...0x28) + */ + u32 *ber = (u32 *) arg; + *ber = l64781_readreg (i2c, 0x39) + | (l64781_readreg (i2c, 0x3a) << 8); + break; + } + + case FE_READ_SIGNAL_STRENGTH: + { + u8 gain = l64781_readreg (i2c, 0x0e); + *(u16 *) arg = (gain << 8) | gain; + break; + } + + case FE_READ_SNR: + { + u16 *snr = (u16 *) arg; + u8 avg_quality = 0xff - l64781_readreg (i2c, 0x33); + *snr = (avg_quality << 8) | avg_quality; /* not exact, but...*/ + break; + } + + case FE_READ_UNCORRECTED_BLOCKS: + { + u32 *ub = (u32 *) arg; + *ub = l64781_readreg (i2c, 0x37) + | (l64781_readreg (i2c, 0x38) << 8); + break; + } + + case FE_SET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + + tsa5060_set_tv_freq (i2c, p->frequency, 3); + apply_frontend_param (i2c, p); +// tsa5060_set_tv_freq (i2c, p->frequency, 0); + } + case FE_GET_FRONTEND: + /* we could correct the frequency here, but... + * (...do you want to implement this?;) + */ + return 0; + + case FE_SLEEP: + /* Power down */ + return l64781_writereg (i2c, 0x3e, 0x5a); + + case FE_INIT: + return init (i2c); + + case FE_RESET: + //reset_afc (i2c); + apply_tps (i2c); + l64781_readreg (i2c, 0x00); /* clear interrupt registers... */ + l64781_readreg (i2c, 0x01); /* dto. */ + break; + + default: + dprintk ("%s: unknown command !!!\n", __FUNCTION__); + return -EINVAL; + }; + + return 0; +} + + +static +int l64781_attach (struct dvb_i2c_bus *i2c) +{ + u8 b0 [] = { 0x1a }; + u8 b1 [] = { 0x00 }; + struct i2c_msg msg [] = { { addr: 0x55, flags: 0, buf: b0, len: 1 }, + { addr: 0x55, flags: I2C_M_RD, buf: b1, len: 1 } }; + + if (i2c->xfer (i2c, msg, 2) == 2) /* probably an EEPROM... */ + return -ENODEV; + + reset_and_configure (i2c); + + if (i2c->xfer (i2c, msg, 2) != 2) /* nothing... */ + return -ENODEV; + + if (b1[0] != 0xa1) + return -ENODEV; + + dvb_register_frontend (grundig_29504_401_ioctl, i2c, NULL, + &grundig_29504_401_info); + return 0; +} + + +static +void l64781_detach (struct dvb_i2c_bus *i2c) +{ + dvb_unregister_frontend (grundig_29504_401_ioctl, i2c); +} + + +static +int __init init_grundig_29504_401 (void) +{ + return dvb_register_i2c_device (THIS_MODULE, + l64781_attach, l64781_detach); +} + + +static +void __exit exit_grundig_29504_401 (void) +{ + dvb_unregister_i2c_device (l64781_attach); +} + +module_init(init_grundig_29504_401); +module_exit(exit_grundig_29504_401); + +MODULE_PARM(debug,"i"); +MODULE_PARM_DESC(debug, "enable verbose debug messages"); +MODULE_DESCRIPTION("Grundig 29504-401 DVB-T Frontend"); +MODULE_AUTHOR("Holger Waechtler, Marko Kohtala"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/media/dvb/frontends/grundig_29504-491.c b/drivers/media/dvb/frontends/grundig_29504-491.c new file mode 100644 index 000000000000..563377137648 --- /dev/null +++ b/drivers/media/dvb/frontends/grundig_29504-491.c @@ -0,0 +1,496 @@ +/* + Driver for Grundig 29504-491, a Philips TDA8083 based QPSK Frontend + + Copyright (C) 2001 Convergence Integrated Media GmbH + + written by Ralph Metzler <ralph@convergence.de> + + adoption to the new DVB frontend API and diagnostic ioctl's + by Holger Waechtler <holger@convergence.de> + + 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 <linux/init.h> +#include <linux/module.h> + +#include "compat.h" +#include "dvb_frontend.h" + +static int debug = 0; +#define dprintk if (debug) printk + + +static +struct dvb_frontend_info grundig_29504_491_info = { + name: "Grundig 29504-491, (TDA8083 based)", + type: FE_QPSK, + frequency_min: 950000, /* FIXME: guessed! */ + frequency_max: 1400000, /* FIXME: guessed! */ + frequency_stepsize: 125, /* kHz for QPSK frontends */ +/* frequency_tolerance: ???,*/ + symbol_rate_min: 1000000, /* FIXME: guessed! */ + symbol_rate_max: 45000000, /* FIXME: guessed! */ +/* symbol_rate_tolerance: ???,*/ + notifier_delay: 0, + caps: FE_CAN_INVERSION_AUTO | + FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | + FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 | + FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO | + FE_CAN_QPSK | + FE_CAN_MUTE_TS +}; + + + +static +u8 tda8083_init_tab [] = { + 0x04, 0x00, 0x4a, 0x79, 0x04, 0x00, 0xff, 0xea, + 0x48, 0x42, 0x79, 0x60, 0x70, 0x52, 0x9a, 0x10, + 0x0e, 0x10, 0xf2, 0xa7, 0x93, 0x0b, 0x05, 0xc8, + 0x9d, 0x00, 0x42, 0x80, 0x00, 0x60, 0x40, 0x00, + 0x00, 0x75, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + + + +static +int tda8083_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data) +{ + int ret; + u8 buf [] = { reg, data }; + struct i2c_msg msg = { addr: 0x68, flags: 0, buf: buf, len: 2 }; + + ret = i2c->xfer (i2c, &msg, 1); + + if (ret != 1) + dprintk ("%s: writereg error (reg %02x, ret == %i)\n", + __FUNCTION__, reg, ret); + + return (ret != 1) ? -1 : 0; +} + + +static +int tda8083_readregs (struct dvb_i2c_bus *i2c, u8 reg1, u8 *b, u8 len) +{ + int ret; + struct i2c_msg msg [] = { { addr: 0x68, flags: 0, buf: ®1, len: 1 }, + { addr: 0x68, flags: I2C_M_RD, buf: b, len: len } }; + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk ("%s: readreg error (reg %02x, ret == %i)\n", + __FUNCTION__, reg1, ret); + + return ret == 2 ? 0 : -1; +} + + +static inline +u8 tda8083_readreg (struct dvb_i2c_bus *i2c, u8 reg) +{ + u8 val; + + tda8083_readregs (i2c, reg, &val, 1); + + return val; +} + + +static +int tsa5522_write (struct dvb_i2c_bus *i2c, u8 data [4]) +{ + int ret; + struct i2c_msg msg = { addr: 0x61, flags: 0, buf: data, len: 4 }; + + ret = i2c->xfer (i2c, &msg, 1); + + if (ret != 1) + dprintk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret); + + return (ret != 1) ? -1 : 0; +} + + +/** + * set up the downconverter frequency divisor for a + * reference clock comparision frequency of 125 kHz. + */ +static +int tsa5522_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq) +{ + u32 div = freq / 125; + u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, 0x8e, 0x00 }; + + return tsa5522_write (i2c, buf); +} + + +static int +tda8083_init (struct dvb_i2c_bus *i2c) +{ + int i; + + dprintk("%s: init TDA8083\n", __FILE__); + + for (i=0; i<44; i++) + tda8083_writereg (i2c, i, tda8083_init_tab[i]); + + return 0; +} + + +static int +tda8083_set_inversion (struct dvb_i2c_bus *i2c, fe_spectral_inversion_t inversion) +{ + /* XXX FIXME: implement other modes than FEC_AUTO */ + if (inversion == INVERSION_AUTO) + return 0; + + return -EINVAL; +} + + +static int +tda8083_set_fec (struct dvb_i2c_bus *i2c, fe_code_rate_t fec) +{ + if (fec == FEC_AUTO) + return tda8083_writereg (i2c, 0x07, 0xff); + + if (fec >= FEC_1_2 && fec <= FEC_8_9) + return tda8083_writereg (i2c, 0x07, 1 << (FEC_8_9 - fec)); + + return -EINVAL; +} + + +static +fe_code_rate_t tda8083_get_fec (struct dvb_i2c_bus *i2c) +{ + u8 index; + static fe_code_rate_t fec_tab [] = { FEC_8_9, FEC_1_2, FEC_2_3, FEC_3_4, + FEC_4_5, FEC_5_6, FEC_6_7, FEC_7_8 }; + + index = tda8083_readreg (i2c, 0x0e) & 0x3; + + if (index > 7) + return FEC_NONE; + + return fec_tab [index]; +} + + +static +int tda8083_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate) +{ + u32 ratio; + u32 tmp; + u8 filter; + + if (srate > 32000000) + srate = 32000000; + if (srate < 500000) + srate = 500000; + + filter = 0; + if (srate < 24000000) + filter = 2; + if (srate < 16000000) + filter = 3; + + tmp = 31250 << 16; + ratio = tmp / srate; + + tmp = (tmp % srate) << 8; + ratio = (ratio << 8) + tmp / srate; + + tmp = (tmp % srate) << 8; + ratio = (ratio << 8) + tmp / srate; + + dprintk("tda8083: ratio == %08x\n", ratio); + + tda8083_writereg (i2c, 0x05, filter); + tda8083_writereg (i2c, 0x02, (ratio >> 16) & 0xff); + tda8083_writereg (i2c, 0x03, (ratio >> 8) & 0xff); + tda8083_writereg (i2c, 0x04, (ratio ) & 0xff); + + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + + return 1; +} + + +static +void tda8083_wait_diseqc_fifo (struct dvb_i2c_bus *i2c, int timeout) +{ + unsigned long start = jiffies; + + while (jiffies - start < timeout && + !(tda8083_readreg(i2c, 0x02) & 0x80)) + { + current->state = TASK_INTERRUPTIBLE; + schedule_timeout (5); + }; +} + + +static +int tda8083_send_diseqc_msg (struct dvb_i2c_bus *i2c, + struct dvb_diseqc_master_cmd *m) +{ + int i; + + tda8083_writereg (i2c, 0x29, (m->msg_len - 3) | (1 << 2)); /* enable */ + + for (i=0; i<m->msg_len; i++) + tda8083_writereg (i2c, 0x23 + i, m->msg[i]); + + tda8083_writereg (i2c, 0x29, (m->msg_len - 3) | (3 << 2)); /* send!! */ + + tda8083_wait_diseqc_fifo (i2c, 100); + + return 0; +} + + +static +int tda8083_send_diseqc_burst (struct dvb_i2c_bus *i2c, fe_sec_mini_cmd_t burst) +{ + switch (burst) { + case SEC_MINI_A: + tda8083_writereg (i2c, 0x29, (5 << 2)); /* send burst A */ + break; + case SEC_MINI_B: + tda8083_writereg (i2c, 0x29, (7 << 2)); /* send B */ + break; + default: + return -EINVAL; + }; + + tda8083_wait_diseqc_fifo (i2c, 100); + + return 0; +} + + +static +int tda8083_set_tone (struct dvb_i2c_bus *i2c, fe_sec_tone_mode_t tone) +{ + tda8083_writereg (i2c, 0x26, 0xf1); + + switch (tone) { + case SEC_TONE_OFF: + return tda8083_writereg (i2c, 0x29, 0x00); + case SEC_TONE_ON: + return tda8083_writereg (i2c, 0x29, 0x80); + default: + return -EINVAL; + }; +} + + +static +int tda8083_set_voltage (struct dvb_i2c_bus *i2c, fe_sec_voltage_t voltage) +{ + switch (voltage) { + case SEC_VOLTAGE_13: + return tda8083_writereg (i2c, 0x20, 0x00); + case SEC_VOLTAGE_18: + return tda8083_writereg (i2c, 0x20, 0x11); + default: + return -EINVAL; + }; +} + + +static +int grundig_29504_491_ioctl (struct dvb_frontend *fe, unsigned int cmd, + void *arg) +{ + struct dvb_i2c_bus *i2c = fe->i2c; + + switch (cmd) { + case FE_GET_INFO: + memcpy (arg, &grundig_29504_491_info, + sizeof(struct dvb_frontend_info)); + break; + + case FE_READ_STATUS: + { + fe_status_t *status=(fe_status_t *) arg; + u8 signal = ~tda8083_readreg (i2c, 0x01); + u8 sync = tda8083_readreg (i2c, 0x02); + + *status = 0; + + if (signal > 10) + *status |= FE_HAS_SIGNAL; + + if (sync & 0x01) + *status |= FE_HAS_CARRIER; + + if (sync & 0x02) + *status |= FE_HAS_VITERBI; + + if (sync & 0x10) + *status |= FE_HAS_SYNC; + + if ((sync & 0x1f) == 0x1f) + *status |= FE_HAS_LOCK; + + break; + } + + case FE_READ_BER: + *((u32*) arg) = 0; /* XXX FIXME: implement me!!! */ + return -EOPNOTSUPP; + + case FE_READ_SIGNAL_STRENGTH: + { + u8 signal = ~tda8083_readreg (i2c, 0x01); + *((u16*) arg) = (signal << 8) | signal; + break; + } + case FE_READ_SNR: + { + u8 snr = tda8083_readreg (i2c, 0x08); + *((u16*) arg) = (snr << 8) | snr; + break; + } + case FE_READ_UNCORRECTED_BLOCKS: + *((u32*) arg) = 0; /* XXX FIXME: implement me!!! */ + return -EOPNOTSUPP; + + + case FE_SET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + + tsa5522_set_tv_freq (i2c, p->frequency); + tda8083_set_inversion (i2c, p->inversion); + tda8083_set_fec (i2c, p->u.qpsk.fec_inner); + tda8083_set_symbolrate (i2c, p->u.qpsk.symbol_rate); + + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + + break; + } + + case FE_GET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + + /* FIXME: get symbolrate & frequency offset...*/ + /*p->frequency = ???;*/ + p->inversion = (tda8083_readreg (i2c, 0x0e) & 0x80) ? + INVERSION_ON : INVERSION_OFF; + p->u.qpsk.fec_inner = tda8083_get_fec (i2c); + /*p->u.qpsk.symbol_rate = tda8083_get_symbolrate (i2c);*/ + break; + } + + case FE_SLEEP: + tda8083_writereg (i2c, 0x00, 0x02); + break; + + case FE_INIT: + tda8083_init (i2c); + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + break; + + case FE_RESET: + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + break; + + case FE_DISEQC_SEND_MASTER_CMD: + return tda8083_send_diseqc_msg (i2c, arg); + + case FE_DISEQC_SEND_BURST: + tda8083_send_diseqc_burst (i2c, (fe_sec_mini_cmd_t) arg); + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + + break; + + case FE_SET_TONE: + tda8083_set_tone (i2c, (fe_sec_tone_mode_t) arg); + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + break; + + case FE_SET_VOLTAGE: + tda8083_set_voltage (i2c, (fe_sec_voltage_t) arg); + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + break; + + default: + return -EOPNOTSUPP; + }; + + return 0; +} + + +static +int tda8083_attach (struct dvb_i2c_bus *i2c) +{ + if ((tda8083_readreg (i2c, 0x00)) != 0x05) + return -ENODEV; + + dvb_register_frontend (grundig_29504_491_ioctl, i2c, NULL, + &grundig_29504_491_info); + + return 0; +} + + +static +void tda8083_detach (struct dvb_i2c_bus *i2c) +{ + dvb_unregister_frontend (grundig_29504_491_ioctl, i2c); +} + + +static +int __init init_tda8083 (void) +{ + return dvb_register_i2c_device (THIS_MODULE, + tda8083_attach, tda8083_detach); +} + + +static +void __exit exit_tda8083 (void) +{ + dvb_unregister_i2c_device (tda8083_attach); +} + +module_init(init_tda8083); +module_exit(exit_tda8083); + +MODULE_PARM(debug,"i"); +MODULE_DESCRIPTION("Grundig 29504-491 DVB frontend driver"); +MODULE_AUTHOR("Ralph Metzler, Holger Waechtler"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/media/dvb/frontends/ves1820.c b/drivers/media/dvb/frontends/ves1820.c new file mode 100644 index 000000000000..fe2c4e20d5dd --- /dev/null +++ b/drivers/media/dvb/frontends/ves1820.c @@ -0,0 +1,537 @@ +/* + VES1820 - Single Chip Cable Channel Receiver driver module + used on the the Siemens DVB-C cards + + Copyright (C) 1999 Convergence Integrated Media GmbH <ralph@convergence.de> + + 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 <linux/init.h> +#include <linux/module.h> +#include <linux/delay.h> + +#include "compat.h" +#include "dvb_frontend.h" + + +static int debug = 0; +#define dprintk if (debug) printk + + +/** + * since we need only a few bits to store internal state we don't allocate + * extra memory but use frontend->data as bitfield + */ + +#define SET_PWM(frontend,pwm) do { \ + (int) frontend->data &= ~0xff; \ + (int) frontend->data |= pwm; \ +} while (0) + +#define SET_REG0(frontend,reg0) do { \ + (int) frontend->data &= ~(0xff << 8); \ + (int) frontend->data |= reg0 << 8; \ +} while (0) + +#define SET_TUNER(frontend,type) do { \ + (int) frontend->data &= ~(0xff << 16); \ + (int) frontend->data |= type << 16; \ +} while (0) + +#define GET_PWM(frontend) ((u8) ((int) frontend->data & 0xff)) +#define GET_REG0(frontend) ((u8) (((int) frontend->data >> 8) & 0xff)) +#define GET_TUNER(frontend) ((u8) (((int) frontend->data >> 16) & 0xff)) + + + +static +struct dvb_frontend_info ves1820_info = { + name: "VES1820/Grundig tuner as used on the Siemens DVB-C card", + type: FE_QAM, + frequency_stepsize: 62500, + frequency_min: 51000000, + frequency_max: 858000000, +#if 0 + frequency_tolerance: ???, + symbol_rate_min: ???, + symbol_rate_max: ???, + symbol_rate_tolerance: ???, /* ppm */ /* == 8% (spec p. 5) */ + notifier_delay: ?, +#endif + caps: FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 | + FE_CAN_QAM_128 | FE_CAN_QAM_256 +}; + + + +static +u8 ves1820_inittab [] = +{ + 0x69, 0x6A, 0x9B, 0x0A, 0x52, 0x46, 0x26, 0x1A, + 0x43, 0x6A, 0xAA, 0xAA, 0x1E, 0x85, 0x43, 0x28, + 0xE0, 0x00, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40 +}; + + +static +int ves1820_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data) +{ + int ret; + u8 buf[] = { 0x00, reg, data }; + struct i2c_msg msg = { addr: 0x09, flags: 0, buf: buf, len: 3 }; + + ret = i2c->xfer (i2c, &msg, 1); + + if (ret != 1) + dprintk("%s: writereg error " + "(reg == 0x%02x, val == 0x%02x, ret == %i)\n", + __FUNCTION__, reg, data, ret); + + mdelay(10); + return (ret != 1) ? -EREMOTEIO : 0; +} + + +static +u8 ves1820_readreg (struct dvb_i2c_bus *i2c, u8 reg) +{ + int ret; + u8 b0 [] = { 0x00, reg }; + u8 b1 [] = { 0 }; + struct i2c_msg msg [] = { { addr: 0x09, flags: 0, buf: b0, len: 2 }, + { addr: 0x09, flags: I2C_M_RD, buf: b1, len: 1 } }; + + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); + + return b1[0]; +} + + +static +int tuner_write (struct dvb_i2c_bus *i2c, u8 addr, u8 data [4]) +{ + int ret; + struct i2c_msg msg = { addr: addr, flags: 0, buf: data, len: 4 }; + + ret = i2c->xfer (i2c, &msg, 1); + + if (ret != 1) + printk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret); + + return (ret != 1) ? -EREMOTEIO : 0; +} + + +/** + * set up the downconverter frequency divisor for a + * reference clock comparision frequency of 62.5 kHz. + */ +static +int tuner_set_tv_freq (struct dvb_frontend *frontend, u32 freq) +{ + u32 div; + static u8 addr [] = { 0x61, 0x62 }; + static u8 byte3 [] = { 0x8e, 0x85 }; + int tuner_type = GET_TUNER(frontend); + u8 buf [4]; + + div = (freq + 36250000 + 31250) / 62500; + buf[0] = (div >> 8) & 0x7f; + buf[1] = div & 0xff; + buf[2] = byte3[tuner_type]; + + if (tuner_type == 1) { + buf[2] |= (div >> 10) & 0x60; + buf[3] = (freq < 174000000 ? 0x88 : + freq < 470000000 ? 0x84 : 0x81); + } else { + buf[3] = (freq < 174000000 ? 0xa1 : + freq < 454000000 ? 0x92 : 0x34); + } + + return tuner_write (frontend->i2c, addr[tuner_type], buf); +} + + +static +int probe_tuner (struct dvb_frontend *frontend) +{ + struct dvb_i2c_bus *i2c = frontend->i2c; + struct i2c_msg msg = { addr: 0x61, flags: 0, buf: NULL, len: 0 }; + + if (i2c->xfer(i2c, &msg, 1) == 1) { + SET_TUNER(frontend,0); + printk ("%s: setup for tuner spXXXX\n", __FILE__); + } else { + SET_TUNER(frontend,1); + printk ("%s: setup for tuner sp5659c\n", __FILE__); + } + + return 0; +} + + +static +int ves1820_init (struct dvb_frontend *frontend) +{ + struct dvb_i2c_bus *i2c = frontend->i2c; + u8 b0 [] = { 0xff }; + u8 pwm; + int i; + struct i2c_msg msg [] = { { addr: 0x28, flags: 0, buf: b0, len: 1 }, + { addr: 0x28, flags: I2C_M_RD, buf: &pwm, len: 1 } }; + + dprintk("VES1820: init chip\n"); + + i2c->xfer (i2c, msg, 2); + + dprintk("VES1820: pwm=%02x\n", pwm); + + if (pwm == 0xff) + pwm=0x48; + + ves1820_writereg (i2c, 0, 0); + + for (i=0; i<53; i++) + ves1820_writereg (i2c, i, ves1820_inittab[i]); + + ves1820_writereg (i2c, 0x34, pwm); + + (int) frontend->data = 0; + SET_PWM(frontend,pwm); + + probe_tuner (frontend); + + return 0; +} + + +static +int ves1820_setup_reg0 (struct dvb_frontend *frontend, + u8 real_qam, fe_spectral_inversion_t inversion) +{ + struct dvb_i2c_bus *i2c = frontend->i2c; + u8 reg0 = (ves1820_inittab[0] & 0xe3) | (real_qam << 2); + + switch (inversion) { + case INVERSION_OFF: /* XXX FIXME: reversed?? p. 25 */ + reg0 |= 0x20; + break; + + case INVERSION_ON: + reg0 &= 0xdf; + break; + + default: + return -EINVAL; + } + + SET_REG0(frontend, reg0); + + ves1820_writereg (i2c, 0x00, reg0 & 0xfe); + ves1820_writereg (i2c, 0x00, reg0); + + return 0; +} + + +static +int ves1820_reset (struct dvb_frontend *frontend) +{ + struct dvb_i2c_bus *i2c = frontend->i2c; + u8 reg0 = GET_REG0(frontend); + + ves1820_writereg (i2c, 0x00, reg0 & 0xfe); + ves1820_writereg (i2c, 0x00, reg0); + + return 0; +} + + +static +void ves1820_reset_uncorrected_block_counter (struct dvb_i2c_bus *i2c) +{ + ves1820_writereg (i2c, 0x10, ves1820_inittab[0x10] & 0xdf); + ves1820_writereg (i2c, 0x10, ves1820_inittab[0x10]); +} + + +static +int ves1820_set_symbolrate (struct dvb_i2c_bus *i2c, u32 symbolrate) +{ + s32 BDR; + s32 BDRI; + s16 SFIL=0; + u16 NDEC = 0; + u32 tmp, ratio; + +#define XIN 57840000UL +#define FIN (57840000UL>>4) + + if (symbolrate > XIN/2) + symbolrate = XIN/2; + + if (symbolrate < 500000) + symbolrate = 500000; + + if (symbolrate < XIN/16) NDEC = 1; + if (symbolrate < XIN/32) NDEC = 2; + if (symbolrate < XIN/64) NDEC = 3; + + if (symbolrate < (u32)(XIN/12.3)) SFIL = 1; + if (symbolrate < (u32)(XIN/16)) SFIL = 0; + if (symbolrate < (u32)(XIN/24.6)) SFIL = 1; + if (symbolrate < (u32)(XIN/32)) SFIL = 0; + if (symbolrate < (u32)(XIN/49.2)) SFIL = 1; + if (symbolrate < (u32)(XIN/64)) SFIL = 0; + if (symbolrate < (u32)(XIN/98.4)) SFIL = 1; + + symbolrate <<= NDEC; + ratio = (symbolrate << 4) / FIN; + tmp = ((symbolrate << 4) % FIN) << 8; + ratio = (ratio << 8) + tmp / FIN; + tmp = (tmp % FIN) << 8; + ratio = (ratio << 8) + (tmp + FIN/2) / FIN; + + BDR = ratio; + BDRI = (((XIN << 5) / symbolrate) + 1) / 2; + + if (BDRI > 0xFF) + BDRI = 0xFF; + + SFIL = (SFIL << 4) | ves1820_inittab[0x0E]; + + NDEC = (NDEC << 6) | ves1820_inittab[0x03]; + + ves1820_writereg (i2c, 0x03, NDEC); + ves1820_writereg (i2c, 0x0a, BDR&0xff); + ves1820_writereg (i2c, 0x0b, (BDR>> 8)&0xff); + ves1820_writereg (i2c, 0x0c, (BDR>>16)&0x3f); + + ves1820_writereg (i2c, 0x0d, BDRI); + ves1820_writereg (i2c, 0x0e, SFIL); + + return 0; +} + + +static +void ves1820_reset_pwm (struct dvb_frontend *frontend) +{ + u8 pwm = GET_PWM(frontend); + + ves1820_writereg (frontend->i2c, 0x34, pwm); +} + + +typedef struct { + fe_modulation_t QAM_Mode; + int NoOfSym; + u8 Reg1; + u8 Reg5; + u8 Reg8; + u8 Reg9; +} QAM_SETTING; + + +QAM_SETTING QAM_Values[] = { + { QAM_16, 16, 140, 164, 162, 145 }, + { QAM_32, 32, 140, 120, 116, 150 }, + { QAM_64, 64, 106, 70, 67, 106 }, + { QAM_128, 128, 120, 54, 52, 126 }, + { QAM_256, 256, 92, 38, 35, 107 } +}; + + +static +int ves1820_set_parameters (struct dvb_frontend *frontend, + struct dvb_frontend_parameters *p) +{ + struct dvb_i2c_bus* i2c = frontend->i2c; + int real_qam; + + switch (p->u.qam.modulation) { + case QAM_16 : real_qam = 0; break; + case QAM_32 : real_qam = 1; break; + case QAM_64 : real_qam = 2; break; + case QAM_128: real_qam = 3; break; + case QAM_256: real_qam = 4; break; + default: + return -EINVAL; + } + + tuner_set_tv_freq (frontend, p->frequency); + ves1820_set_symbolrate (i2c, p->u.qam.symbol_rate); + ves1820_reset_pwm (frontend); + + ves1820_writereg (i2c, 0x01, QAM_Values[real_qam].Reg1); + ves1820_writereg (i2c, 0x05, QAM_Values[real_qam].Reg5); + ves1820_writereg (i2c, 0x08, QAM_Values[real_qam].Reg8); + ves1820_writereg (i2c, 0x09, QAM_Values[real_qam].Reg9); + + ves1820_setup_reg0 (frontend, real_qam, p->inversion); + + return 0; +} + + + +static +int ves1820_ioctl (struct dvb_frontend *frontend, unsigned int cmd, void *arg) +{ + switch (cmd) { + case FE_GET_INFO: + memcpy (arg, &ves1820_info, sizeof(struct dvb_frontend_info)); + break; + + case FE_READ_STATUS: + { + fe_status_t *status = (fe_status_t *) arg; + int sync; + + *status = 0; + + sync = ves1820_readreg (frontend->i2c, 0x11); + + if (sync & 2) + *status |= FE_HAS_SIGNAL; + + if (sync & 2) + *status |= FE_HAS_CARRIER; + + if (sync & 2) /* XXX FIXME! */ + *status |= FE_HAS_VITERBI; + + if (sync & 4) + *status |= FE_HAS_SYNC; + + if (sync & 8) + *status |= FE_HAS_LOCK; + + break; + } + + case FE_READ_BER: + *((u32*) arg) = ves1820_readreg(frontend->i2c, 0x14) | + (ves1820_readreg(frontend->i2c, 0x15) << 8) | + (ves1820_readreg(frontend->i2c, 0x16) << 16); + /* XXX FIXME: scale!!*/ + break; + + case FE_READ_SIGNAL_STRENGTH: + { + u8 gain = ves1820_readreg(frontend->i2c, 0x17); + *((u16*) arg) = (gain << 8) | gain; + break; + } + + case FE_READ_SNR: + { + u8 quality = ~ves1820_readreg(frontend->i2c, 0x18); + *((u16*) arg) = (quality << 8) | quality; + break; + } + + case FE_READ_UNCORRECTED_BLOCKS: + *((u32*) arg) = ves1820_readreg (frontend->i2c, 0x13) & 0x7f; + if (*((u32*) arg) == 0x7f) + *((u32*) arg) = 0xffffffff; + ves1820_reset_uncorrected_block_counter (frontend->i2c); + break; + + case FE_SET_FRONTEND: + return ves1820_set_parameters (frontend, arg); + + case FE_GET_FRONTEND: + /* XXX FIXME: implement! */ +/* + struct frontend *front = (struct frontend *)arg; + + front->afc=(int)((char)(readreg(client,0x19))); + front->afc=(front->afc*(int)(front->param.u.qam.SymbolRate/8))/128; +*/ + break; + + case FE_SLEEP: + ves1820_writereg (frontend->i2c, 0x1b, 0x02); /* pdown ADC */ + ves1820_writereg (frontend->i2c, 0x00, 0x80); /* standby */ + break; + + case FE_INIT: + return ves1820_init (frontend); + + case FE_RESET: + ves1820_reset (frontend); + break; + + default: + return -EINVAL; + } + + return 0; +} + + +static +int ves1820_attach (struct dvb_i2c_bus *i2c) +{ + if ((ves1820_readreg (i2c, 0x1a) & 0xf0) != 0x70) + return -ENODEV; + + dvb_register_frontend (ves1820_ioctl, i2c, NULL, &ves1820_info); + + return 0; +} + + +static +void ves1820_detach (struct dvb_i2c_bus *i2c) +{ + dvb_unregister_frontend (ves1820_ioctl, i2c); +} + + +static +int __init init_ves1820 (void) +{ + return dvb_register_i2c_device (THIS_MODULE, + ves1820_attach, ves1820_detach); +} + + +static +void __exit exit_ves1820 (void) +{ + dvb_unregister_i2c_device (ves1820_attach); +} + + +module_init(init_ves1820); +module_exit(exit_ves1820); + +MODULE_DESCRIPTION(""); +MODULE_AUTHOR("Ralph Metzler"); +MODULE_LICENSE("GPL"); +MODULE_PARM(debug,"i"); + diff --git a/drivers/media/video/adv7175.c b/drivers/media/video/adv7175.c index 32a110c9db8e..0b84b028e455 100644 --- a/drivers/media/video/adv7175.c +++ b/drivers/media/video/adv7175.c @@ -45,7 +45,7 @@ #include <linux/version.h> #include <asm/uaccess.h> -#include <linux/i2c-old.h> +#include <linux/i2c.h> #include <linux/video_encoder.h> @@ -55,28 +55,15 @@ #define DEBUG(x...) #endif -/* ----------------------------------------------------------------------- */ - -struct adv7175 { - struct i2c_bus *bus; - int addr; - unsigned char reg[128]; - - int norm; - int input; - int enable; - int bright; - int contrast; - int hue; - int sat; -}; +#define I2C_ADV7175 0xd4 +#define I2C_ADV7176 0x54 -#define I2C_ADV7175 0xd4 -#define I2C_ADV7176 0x54 +#define IF_NAME "adv7175" static char adv7175_name[] = "adv7175"; static char adv7176_name[] = "adv7176"; static char unknown_name[] = "UNKNOWN"; +char *dname; #if (DEBUGLEVEL > 0) static char *inputs[] = { "pass_through", "play_back", "color_bar" }; @@ -85,64 +72,34 @@ static char *norms[] = { "PAL", "NTSC", "SECAM->PAL (may not work!)" }; #define I2C_DELAY 10 -/* ----------------------------------------------------------------------- */ - -static int adv7175_write(struct adv7175 *dev, unsigned char subaddr, unsigned char data) -{ - int ack; - - LOCK_I2C_BUS(dev->bus); - - i2c_start(dev->bus); - i2c_sendbyte(dev->bus, dev->addr, I2C_DELAY); - i2c_sendbyte(dev->bus, subaddr, I2C_DELAY); - ack = i2c_sendbyte(dev->bus, data, I2C_DELAY); - dev->reg[subaddr] = data; - i2c_stop(dev->bus); - UNLOCK_I2C_BUS(dev->bus); - return ack; -} - -static unsigned char adv7175_read(struct adv7175 *dev, unsigned char subaddr) -{ - unsigned char data; - - LOCK_I2C_BUS(dev->bus); - - i2c_start(dev->bus); - i2c_sendbyte(dev->bus, dev->addr, I2C_DELAY); - i2c_sendbyte(dev->bus, subaddr, I2C_DELAY); - i2c_sendbyte(dev->bus, dev->addr + 1, I2C_DELAY); - data = i2c_readbyte(dev->bus, 1); - dev->reg[subaddr] = data; - i2c_stop(dev->bus); - UNLOCK_I2C_BUS(dev->bus); - return data; -} +static unsigned short normal_i2c[] = {I2C_ADV7175, I2C_CLIENT_END}; +static unsigned short normal_i2c_range[] = {I2C_CLIENT_END}; +static unsigned short probe[2] = {I2C_CLIENT_END, I2C_CLIENT_END}; +static unsigned short probe_range[2] = {I2C_CLIENT_END, I2C_CLIENT_END}; +static unsigned short ignore[2] = {I2C_CLIENT_END, I2C_CLIENT_END}; +static unsigned short ignore_range[2] = {I2C_CLIENT_END, I2C_CLIENT_END}; +static unsigned short force[2] = {I2C_CLIENT_END, I2C_CLIENT_END}; + +static struct i2c_client_address_data addr_data = { + normal_i2c, normal_i2c_range, + probe, probe_range, + ignore, ignore_range, + force}; +static struct i2c_client client_template; -static int adv7175_write_block(struct adv7175 *dev, - unsigned const char *data, unsigned int len) -{ - int ack = 0; - unsigned subaddr; - - while (len > 1) { - LOCK_I2C_BUS(dev->bus); - i2c_start(dev->bus); - i2c_sendbyte(dev->bus, dev->addr, I2C_DELAY); - ack = i2c_sendbyte(dev->bus, (subaddr = *data++), I2C_DELAY); - ack = i2c_sendbyte(dev->bus, (dev->reg[subaddr] = *data++), I2C_DELAY); - len -= 2; - while (len > 1 && *data == ++subaddr) { - data++; - ack = i2c_sendbyte(dev->bus, (dev->reg[subaddr] = *data++), I2C_DELAY); - len -= 2; - } - i2c_stop(dev->bus); - UNLOCK_I2C_BUS(dev->bus); - } - return ack; -} +struct adv7175 { + struct i2c_client *client; + int addr; + unsigned char reg[128]; + struct semaphore lock; + int norm; + int input; + int enable; + int bright; + int contrast; + int hue; + int sat; +}; /* ----------------------------------------------------------------------- */ // Output filter: S-Video Composite @@ -203,65 +160,87 @@ static const unsigned char init_ntsc[] = { 0x06, 0x1a, /* subc. phase */ }; -static int adv7175_attach(struct i2c_device *device) +static int adv717x_attach(struct i2c_adapter *adap, int addr, unsigned short flags, int kind) { - int i; struct adv7175 *encoder; - char *dname; + struct i2c_client *client; + int rv, i, x_common=39; /* x is number entries init_common - 1 */ - MOD_INC_USE_COUNT; + printk(KERN_INFO "adv717x: video chip found.\n"); + client=kmalloc(sizeof(*client), GFP_KERNEL); + if(client == NULL) + return -ENOMEM; - device->data = encoder = kmalloc(sizeof(struct adv7175), GFP_KERNEL); + client_template.adapter = adap; + client_template.addr = addr; + memcpy(client, &client_template, sizeof(*client)); + + encoder = kmalloc(sizeof(*encoder), GFP_KERNEL); if (encoder == NULL) { - MOD_DEC_USE_COUNT; + kfree(client); return -ENOMEM; } - - memset(encoder, 0, sizeof(struct adv7175)); - if ((device->addr == I2C_ADV7175) || (device->addr == (I2C_ADV7175 + 2))) { + memset(encoder, 0, sizeof(*encoder)); + if ((encoder->addr == I2C_ADV7175) || (encoder->addr == (I2C_ADV7175 + 2))) { dname = adv7175_name; - } else if ((device->addr == I2C_ADV7176) || (device->addr == (I2C_ADV7176 + 2))) { + } else if ((encoder->addr == I2C_ADV7176) || (encoder->addr == (I2C_ADV7176 + 2))) { dname = adv7176_name; } else { // We should never get here!!! dname = unknown_name; } - strcpy(device->name, dname); - encoder->bus = device->bus; - encoder->addr = device->addr; + strcpy(client->name, dname); + init_MUTEX(&encoder->lock); + encoder->client = client; + encoder->addr = addr; encoder->norm = VIDEO_MODE_PAL; encoder->input = 0; encoder->enable = 1; - i = adv7175_write_block(encoder, init_common, sizeof(init_common)); - if (i >= 0) { - i = adv7175_write(encoder, 0x07, TR0MODE | TR0RST); - i = adv7175_write(encoder, 0x07, TR0MODE); - i = adv7175_read(encoder, 0x12); - printk(KERN_INFO "%s_attach: %s rev. %d at 0x%02x\n", - device->name, dname, i & 1, device->addr); + for (i=1; i<x_common; i++) { + rv = i2c_smbus_write_byte(client,init_common[i]); + if (rv < 0) { + printk(KERN_ERR "%s_attach: init error %d\n", client->name, rv); + break; + } } - if (i < 0) { - printk(KERN_ERR "%s_attach: init error %d\n", device->name, - i); + + if (rv >= 0) { + i2c_smbus_write_byte_data(client,0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client,0x07, TR0MODE); + i2c_smbus_read_byte_data(client,0x12); + printk(KERN_INFO "%s_attach: %s rev. %d at 0x%02x\n", + client->name, dname, rv & 1, client->addr); } + i2c_attach_client(client); + return 0; } +static +int adv717x_probe(struct i2c_adapter *adap) +{ + return i2c_probe(adap, &addr_data, adv717x_attach); +} + -static int adv7175_detach(struct i2c_device *device) +static int adv717x_detach(struct i2c_client *client) { - kfree(device->data); - MOD_DEC_USE_COUNT; + i2c_detach_client(client); + kfree(client->data); + kfree(client); return 0; } -static int adv7175_command(struct i2c_device *device, unsigned int cmd, +static int adv717x_command(struct i2c_client *client, unsigned int cmd, void *arg) { - struct adv7175 *encoder = device->data; + struct adv7175 *encoder = client->data; + int i, x_ntsc=13, x_pal=13; + /* x_ntsc is number of entries in init_ntsc -1 */ + /* x_pal is number of entries in init_pal -1 */ switch (cmd) { @@ -286,29 +265,21 @@ static int adv7175_command(struct i2c_device *device, unsigned int cmd, switch (iarg) { case VIDEO_MODE_NTSC: - adv7175_write_block(encoder, - init_ntsc, - sizeof - (init_ntsc)); + for (i=1; i< x_ntsc; i++) + i2c_smbus_write_byte(client, init_ntsc[i]); if (encoder->input == 0) - adv7175_write(encoder, 0x0d, 0x4f); // Enable genlock - adv7175_write(encoder, 0x07, - TR0MODE | TR0RST); - adv7175_write(encoder, 0x07, - TR0MODE); + i2c_smbus_write_byte_data(client,0x0d, 0x4f); // Enable genlock + i2c_smbus_write_byte_data(client,0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client,0x07, TR0MODE); break; case VIDEO_MODE_PAL: - adv7175_write_block(encoder, - init_pal, - sizeof - (init_pal)); + for (i=1; i< x_pal; i++) + i2c_smbus_write_byte(client, init_pal[i]); if (encoder->input == 0) - adv7175_write(encoder, 0x0d, 0x4f); // Enable genlock - adv7175_write(encoder, 0x07, - TR0MODE | TR0RST); - adv7175_write(encoder, 0x07, - TR0MODE); + i2c_smbus_write_byte_data(client,0x0d, 0x4f); // Enable genlock + i2c_smbus_write_byte_data(client,0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client,0x07, TR0MODE); break; case VIDEO_MODE_SECAM: // WARNING! ADV7176 does not support SECAM. @@ -316,27 +287,23 @@ static int adv7175_command(struct i2c_device *device, unsigned int cmd, // it does not work due to genlock: when decoder // is in SECAM and encoder in in PAL the subcarrier // can not be syncronized with horizontal frequency) - adv7175_write_block(encoder, - init_pal, - sizeof - (init_pal)); + for (i=1; i< x_pal; i++) + i2c_smbus_write_byte(client, init_pal[i]); if (encoder->input == 0) - adv7175_write(encoder, 0x0d, 0x49); // Disable genlock - adv7175_write(encoder, 0x07, - TR0MODE | TR0RST); - adv7175_write(encoder, 0x07, - TR0MODE); + i2c_smbus_write_byte_data(client,0x0d, 0x49); // Disable genlock + i2c_smbus_write_byte_data(client,0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client,0x07, TR0MODE); break; default: printk(KERN_ERR "%s: illegal norm: %d\n", - device->name, iarg); + client->name, iarg); return -EINVAL; } DEBUG(printk (KERN_INFO "%s: switched to %s\n", - device->name, norms[iarg])); + client->name, norms[iarg])); encoder->norm = iarg; } } @@ -354,51 +321,45 @@ static int adv7175_command(struct i2c_device *device, unsigned int cmd, switch (iarg) { case 0: - adv7175_write(encoder, 0x01, 0x00); - adv7175_write(encoder, 0x0c, TR1CAPT); /* TR1 */ + i2c_smbus_write_byte_data(client, 0x01, 0x00); + i2c_smbus_write_byte_data(client, 0x0c, TR1CAPT); /* TR1 */ if (encoder->norm == VIDEO_MODE_SECAM) - adv7175_write(encoder, 0x0d, 0x49); // Disable genlock + i2c_smbus_write_byte_data(client, 0x0d, 0x49); // Disable genlock else - adv7175_write(encoder, 0x0d, 0x4f); // Enable genlock - adv7175_write(encoder, 0x07, - TR0MODE | TR0RST); - adv7175_write(encoder, 0x07, - TR0MODE); + i2c_smbus_write_byte_data(client, 0x0d, 0x4f); // Enable genlock + i2c_smbus_write_byte_data(client, 0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client, 0x07, TR0MODE); //udelay(10); break; case 1: - adv7175_write(encoder, 0x01, 0x00); - adv7175_write(encoder, 0x0c, TR1PLAY); /* TR1 */ - adv7175_write(encoder, 0x0d, 0x49); - adv7175_write(encoder, 0x07, - TR0MODE | TR0RST); - adv7175_write(encoder, 0x07, - TR0MODE); + i2c_smbus_write_byte_data(client, 0x01, 0x00); + i2c_smbus_write_byte_data(client, 0x0c, TR1PLAY); /* TR1 */ + i2c_smbus_write_byte_data(client, 0x0d, 0x49); + i2c_smbus_write_byte_data(client, 0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client, 0x07, TR0MODE); //udelay(10); break; case 2: - adv7175_write(encoder, 0x01, 0x80); - adv7175_write(encoder, 0x0d, 0x49); - adv7175_write(encoder, 0x07, - TR0MODE | TR0RST); - adv7175_write(encoder, 0x07, - TR0MODE); + i2c_smbus_write_byte_data(client, 0x01, 0x80); + i2c_smbus_write_byte_data(client, 0x0d, 0x49); + i2c_smbus_write_byte_data(client, 0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client, 0x07, TR0MODE); //udelay(10); break; default: printk(KERN_ERR "%s: illegal input: %d\n", - device->name, iarg); + client->name, iarg); return -EINVAL; } DEBUG(printk (KERN_INFO "%s: switched to %s\n", - device->name, inputs[iarg])); + client->name, inputs[iarg])); encoder->input = iarg; } } @@ -420,7 +381,7 @@ static int adv7175_command(struct i2c_device *device, unsigned int cmd, int *iarg = arg; encoder->enable = !!*iarg; - adv7175_write(encoder, 0x61, + i2c_smbus_write_byte_data(client, 0x61, (encoder-> reg[0x61] & 0xbf) | (encoder-> enable ? 0x00 : @@ -435,42 +396,60 @@ static int adv7175_command(struct i2c_device *device, unsigned int cmd, return 0; } +static void adv717x_inc_use(struct i2c_client *client) +{ + MOD_INC_USE_COUNT; +} + +static void adv717x_dec_use(struct i2c_client *client) +{ + MOD_DEC_USE_COUNT; +} + + /* ----------------------------------------------------------------------- */ static struct i2c_driver i2c_driver_adv7175 = { - "adv7175", /* name */ - I2C_DRIVERID_VIDEOENCODER, /* ID */ - I2C_ADV7175, I2C_ADV7175 + 3, - - adv7175_attach, - adv7175_detach, - adv7175_command + name: "adv7175", /* name */ + id: I2C_DRIVERID_ADV717x, /* ID */ + flags: I2C_DF_NOTIFY, //I2C_ADV7175, I2C_ADV7175 + 3, + attach_adapter: adv717x_probe, + detach_client: adv717x_detach, + command: adv717x_command, + inc_use: &adv717x_inc_use, + dec_use: &adv717x_dec_use }; static struct i2c_driver i2c_driver_adv7176 = { - "adv7175", /* name */ - I2C_DRIVERID_VIDEOENCODER, /* ID */ - I2C_ADV7176, I2C_ADV7176 + 3, + name: "adv7176", /* name */ + id: I2C_DRIVERID_ADV717x, /* ID */ + flags: I2C_DF_NOTIFY, //I2C_ADV7176, I2C_ADV7176 + 3, + attach_adapter: adv717x_probe, + detach_client: adv717x_detach, + command: adv717x_command, + inc_use: &adv717x_inc_use, + dec_use: &adv717x_dec_use +}; - adv7175_attach, - adv7175_detach, - adv7175_command +static struct i2c_client client_template = { + name: "adv7175_client", + driver: &i2c_driver_adv7175 }; -static int adv7175_init(void) +static int adv717x_init(void) { int res_adv7175 = 0, res_adv7176 = 0; - res_adv7175 = i2c_register_driver(&i2c_driver_adv7175); - res_adv7176 = i2c_register_driver(&i2c_driver_adv7176); + res_adv7175 = i2c_add_driver(&i2c_driver_adv7175); + res_adv7176 = i2c_add_driver(&i2c_driver_adv7176); return (res_adv7175 | res_adv7176); // Any idea how to make it better? } -static void adv7175_exit(void) +static void adv717x_exit(void) { - i2c_unregister_driver(&i2c_driver_adv7176); - i2c_unregister_driver(&i2c_driver_adv7175); + i2c_del_driver(&i2c_driver_adv7176); + i2c_del_driver(&i2c_driver_adv7175); } -module_init(adv7175_init); -module_exit(adv7175_exit); +module_init(adv717x_init); +module_exit(adv717x_exit); MODULE_LICENSE("GPL"); diff --git a/drivers/media/video/cpia.c b/drivers/media/video/cpia.c index 24b9f56023fb..d57cd471d6b4 100644 --- a/drivers/media/video/cpia.c +++ b/drivers/media/video/cpia.c @@ -6,6 +6,7 @@ * (C) Copyright 1999-2000 Peter Pregler * (C) Copyright 1999-2000 Scott J. Bertin * (C) Copyright 1999-2000 Johannes Erdfelt <johannes@erdfelt.com> + * (C) Copyright 2000 STMicroelectronics * * 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 @@ -30,7 +31,6 @@ #include <linux/init.h> #include <linux/fs.h> #include <linux/vmalloc.h> -#include <linux/delay.h> #include <linux/slab.h> #include <linux/proc_fs.h> #include <linux/ctype.h> @@ -101,6 +101,7 @@ MODULE_SUPPORTED_DEVICE("video"); #define CPIA_COMMAND_I2CRead (INPUT | CPIA_MODULE_SYSTEM | 13) #define CPIA_COMMAND_GetVPVersion (INPUT | CPIA_MODULE_VP_CTRL | 1) +#define CPIA_COMMAND_ResetFrameCounter (INPUT | CPIA_MODULE_VP_CTRL | 2) #define CPIA_COMMAND_SetColourParams (OUTPUT | CPIA_MODULE_VP_CTRL | 3) #define CPIA_COMMAND_SetExposure (OUTPUT | CPIA_MODULE_VP_CTRL | 4) #define CPIA_COMMAND_SetColourBalance (OUTPUT | CPIA_MODULE_VP_CTRL | 6) @@ -131,6 +132,7 @@ MODULE_SUPPORTED_DEVICE("video"); #define CPIA_COMMAND_SetYUVThresh (OUTPUT | CPIA_MODULE_CAPTURE | 12) #define CPIA_COMMAND_SetCompressionParams (OUTPUT | CPIA_MODULE_CAPTURE | 13) #define CPIA_COMMAND_DiscardFrame (OUTPUT | CPIA_MODULE_CAPTURE | 14) +#define CPIA_COMMAND_GrabReset (OUTPUT | CPIA_MODULE_CAPTURE | 15) #define CPIA_COMMAND_OutputRS232 (OUTPUT | CPIA_MODULE_DEBUG | 1) #define CPIA_COMMAND_AbortProcess (OUTPUT | CPIA_MODULE_DEBUG | 4) @@ -139,6 +141,7 @@ MODULE_SUPPORTED_DEVICE("video"); #define CPIA_COMMAND_StartDummyDtream (OUTPUT | CPIA_MODULE_DEBUG | 8) #define CPIA_COMMAND_AbortStream (OUTPUT | CPIA_MODULE_DEBUG | 9) #define CPIA_COMMAND_DownloadDRAM (OUTPUT | CPIA_MODULE_DEBUG | 10) +#define CPIA_COMMAND_Null (OUTPUT | CPIA_MODULE_DEBUG | 11) enum { FRAME_READY, /* Ready to grab into */ @@ -164,6 +167,25 @@ enum { #define COMMAND_SETFLICKERCTRL 0x2000 #define COMMAND_SETVLOFFSET 0x4000 #define COMMAND_SETLIGHTS 0x8000 + +#define ROUND_UP_EXP_FOR_FLICKER 15 + +/* Constants for automatic frame rate adjustment */ +#define MAX_EXP 302 +#define MAX_EXP_102 255 +#define LOW_EXP 140 +#define VERY_LOW_EXP 70 +#define TC 94 +#define EXP_ACC_DARK 50 +#define EXP_ACC_LIGHT 90 +#define HIGH_COMP_102 160 +#define MAX_COMP 239 +#define DARK_TIME 3 +#define LIGHT_TIME 3 + +/* Maximum number of 10ms loops to wait for the stream to become ready */ +#define READY_TIMEOUT 100 + /* Developer's Guide Table 5 p 3-34 * indexed by [mains][sensorFps.baserate][sensorFps.divisor]*/ static u8 flicker_jumps[2][2][4] = @@ -173,6 +195,10 @@ static u8 flicker_jumps[2][2][4] = /* forward declaration of local function */ static void reset_camera_struct(struct cam_data *cam); +static int find_over_exposure(int brightness); +static void set_flicker(struct cam_params *params, volatile u32 *command_flags, + int on); + /********************************************************************** * @@ -291,12 +317,6 @@ static int cpia_read_proc(char *page, char **start, off_t off, out += sprintf(out, "video_size: %s\n", cam->params.format.videoSize == VIDEOSIZE_CIF ? "CIF " : "QCIF"); - out += sprintf(out, "sub_sample: %s\n", - cam->params.format.subSample == SUBSAMPLE_420 ? - "420" : "422"); - out += sprintf(out, "yuv_order: %s\n", - cam->params.format.yuvOrder == YUVORDER_YUYV ? - "YUYV" : "UYVY"); out += sprintf(out, "roi: (%3d, %3d) to (%3d, %3d)\n", cam->params.roi.colStart*8, cam->params.roi.rowStart*4, @@ -331,11 +351,17 @@ static int cpia_read_proc(char *page, char **start, off_t off, 2*cam->params.streamStartLine, 0, cam->params.format.videoSize == VIDEOSIZE_CIF ? 288:144, cam->params.format.videoSize == VIDEOSIZE_CIF ? 240:120); + out += sprintf(out, "sub_sample: %8s %8s %8s %8s\n", + cam->params.format.subSample == SUBSAMPLE_420 ? + "420" : "422", "420", "422", "422"); + out += sprintf(out, "yuv_order: %8s %8s %8s %8s\n", + cam->params.format.yuvOrder == YUVORDER_YUYV ? + "YUYV" : "UYVY", "YUYV" , "UYVY", "YUYV"); out += sprintf(out, "ecp_timing: %8s %8s %8s %8s\n", cam->params.ecpTiming ? "slow" : "normal", "slow", "normal", "normal"); - if (cam->params.colourBalance.balanceModeIsAuto) { + if (cam->params.colourBalance.balanceMode == 2) { sprintf(tmpstr, "auto"); } else { sprintf(tmpstr, "manual"); @@ -385,31 +411,33 @@ static int cpia_read_proc(char *page, char **start, off_t off, 1<<cam->params.exposure.gain, 1, 1); if (cam->params.version.firmwareVersion == 1 && cam->params.version.firmwareRevision == 2) - /* 1-02 firmware limits fineExp to 127 */ - tmp = 255; + /* 1-02 firmware limits fineExp/2 to 127 */ + tmp = 254; else - tmp = 511; + tmp = 510; out += sprintf(out, "fine_exp: %8d %8d %8d %8d\n", cam->params.exposure.fineExp*2, 0, tmp, 0); if (cam->params.version.firmwareVersion == 1 && cam->params.version.firmwareRevision == 2) /* 1-02 firmware limits coarseExpHi to 0 */ - tmp = 255; + tmp = MAX_EXP_102; else - tmp = 65535; + tmp = MAX_EXP; out += sprintf(out, "coarse_exp: %8d %8d %8d" " %8d\n", cam->params.exposure.coarseExpLo+ 256*cam->params.exposure.coarseExpHi, 0, tmp, 185); out += sprintf(out, "red_comp: %8d %8d %8d %8d\n", - cam->params.exposure.redComp, 220, 255, 220); + cam->params.exposure.redComp, COMP_RED, 255, COMP_RED); out += sprintf(out, "green1_comp: %8d %8d %8d %8d\n", - cam->params.exposure.green1Comp, 214, 255, 214); + cam->params.exposure.green1Comp, COMP_GREEN1, 255, + COMP_GREEN1); out += sprintf(out, "green2_comp: %8d %8d %8d %8d\n", - cam->params.exposure.green2Comp, 214, 255, 214); + cam->params.exposure.green2Comp, COMP_GREEN2, 255, + COMP_GREEN2); out += sprintf(out, "blue_comp: %8d %8d %8d %8d\n", - cam->params.exposure.blueComp, 230, 255, 230); + cam->params.exposure.blueComp, COMP_BLUE, 255, COMP_BLUE); out += sprintf(out, "apcor_gain1: %#8x %#8x %#8x %#8x\n", cam->params.apcor.gain1, 0, 0xff, 0x1c); @@ -433,9 +461,14 @@ static int cpia_read_proc(char *page, char **start, off_t off, out += sprintf(out, "mains_frequency: %8d %8d %8d %8d" " only 50/60\n", cam->mainsFreq ? 60 : 50, 50, 60, 50); - out += sprintf(out, "allowable_overexposure: %8d %8d %8d %8d\n", - cam->params.flickerControl.allowableOverExposure, 0, - 255, 0); + if(cam->params.flickerControl.allowableOverExposure < 0) + out += sprintf(out, "allowable_overexposure: %4dauto auto %8d auto\n", + -cam->params.flickerControl.allowableOverExposure, + 255); + else + out += sprintf(out, "allowable_overexposure: %8d auto %8d auto\n", + cam->params.flickerControl.allowableOverExposure, + 255); out += sprintf(out, "compression_mode: "); switch(cam->params.compression.mode) { case CPIA_COMPRESSION_NONE: @@ -453,8 +486,8 @@ static int cpia_read_proc(char *page, char **start, off_t off, } out += sprintf(out, " none,auto,manual auto\n"); out += sprintf(out, "decimation_enable: %8s %8s %8s %8s\n", - cam->params.compression.decimation == - DECIMATION_ENAB ? "on":"off", "off", "off", + cam->params.compression.decimation == + DECIMATION_ENAB ? "on":"off", "off", "on", "off"); out += sprintf(out, "compression_target: %9s %9s %9s %9s\n", cam->params.compressionTarget.frTargeting == @@ -462,13 +495,13 @@ static int cpia_read_proc(char *page, char **start, off_t off, "framerate":"quality", "framerate", "quality", "quality"); out += sprintf(out, "target_framerate: %8d %8d %8d %8d\n", - cam->params.compressionTarget.targetFR, 0, 30, 7); + cam->params.compressionTarget.targetFR, 1, 30, 15); out += sprintf(out, "target_quality: %8d %8d %8d %8d\n", - cam->params.compressionTarget.targetQ, 0, 255, 10); + cam->params.compressionTarget.targetQ, 1, 64, 5); out += sprintf(out, "y_threshold: %8d %8d %8d %8d\n", - cam->params.yuvThreshold.yThreshold, 0, 31, 15); + cam->params.yuvThreshold.yThreshold, 0, 31, 6); out += sprintf(out, "uv_threshold: %8d %8d %8d %8d\n", - cam->params.yuvThreshold.uvThreshold, 0, 31, 15); + cam->params.yuvThreshold.uvThreshold, 0, 31, 6); out += sprintf(out, "hysteresis: %8d %8d %8d %8d\n", cam->params.compressionParams.hysteresis, 0, 255, 3); out += sprintf(out, "threshold_max: %8d %8d %8d %8d\n", @@ -511,6 +544,47 @@ static int cpia_read_proc(char *page, char **start, off_t off, return len; } + +static int match(char *checkstr, char **buffer, unsigned long *count, + int *find_colon, int *err) +{ + int ret, colon_found = 1; + int len = strlen(checkstr); + ret = (len <= *count && strncmp(*buffer, checkstr, len) == 0); + if (ret) { + *buffer += len; + *count -= len; + if (*find_colon) { + colon_found = 0; + while (*count && (**buffer == ' ' || **buffer == '\t' || + (!colon_found && **buffer == ':'))) { + if (**buffer == ':') + colon_found = 1; + --*count; + ++*buffer; + } + if (!*count || !colon_found) + *err = -EINVAL; + *find_colon = 0; + } + } + return ret; +} + +static unsigned long int value(char **buffer, unsigned long *count, int *err) +{ + char *p; + unsigned long int ret; + ret = simple_strtoul(*buffer, &p, 0); + if (p == *buffer) + *err = -EINVAL; + else { + *count -= p - *buffer; + *buffer = p; + } + return ret; +} + static int cpia_write_proc(struct file *file, const char *buf, unsigned long count, void *data) { @@ -565,45 +639,11 @@ static int cpia_write_proc(struct file *file, const char *buf, memcpy(&new_params, &cam->params, sizeof(struct cam_params)); new_mains = cam->mainsFreq; -#define MATCH(x) \ - ({ \ - int _len = strlen(x), _ret, _colon_found; \ - _ret = (_len <= count && strncmp(buffer, x, _len) == 0); \ - if (_ret) { \ - buffer += _len; \ - count -= _len; \ - if (find_colon) { \ - _colon_found = 0; \ - while (count && (*buffer == ' ' || *buffer == '\t' || \ - (!_colon_found && *buffer == ':'))) { \ - if (*buffer == ':') \ - _colon_found = 1; \ - --count; \ - ++buffer; \ - } \ - if (!count || !_colon_found) \ - retval = -EINVAL; \ - find_colon = 0; \ - } \ - } \ - _ret; \ - }) +#define MATCH(x) (match(x, &buffer, &count, &find_colon, &retval)) +#define VALUE (value(&buffer,&count, &retval)) #define FIRMWARE_VERSION(x,y) (new_params.version.firmwareVersion == (x) && \ new_params.version.firmwareRevision == (y)) -#define VALUE \ - ({ \ - char *_p; \ - unsigned long int _ret; \ - _ret = simple_strtoul(buffer, &_p, 0); \ - if (_p == buffer) \ - retval = -EINVAL; \ - else { \ - count -= _p - buffer; \ - buffer = _p; \ - } \ - _ret; \ - }) - + retval = 0; while (count && !retval) { find_colon = 1; @@ -618,6 +658,12 @@ static int cpia_write_proc(struct file *file, const char *buf, retval = -EINVAL; } command_flags |= COMMAND_SETCOLOURPARAMS; + if(new_params.flickerControl.allowableOverExposure < 0) + new_params.flickerControl.allowableOverExposure = + -find_over_exposure(new_params.colourParams.brightness); + if(new_params.flickerControl.flickerMode != 0) + command_flags |= COMMAND_SETFLICKERCTRL; + } else if (MATCH("contrast")) { if (!retval) val = VALUE; @@ -686,6 +732,7 @@ static int cpia_write_proc(struct file *file, const char *buf, command_flags |= COMMAND_SETFLICKERCTRL; } command_flags |= COMMAND_SETSENSORFPS; + cam->exposure_status = EXPOSURE_NORMAL; } else if (MATCH("stream_start_line")) { if (!retval) val = VALUE; @@ -700,6 +747,24 @@ static int cpia_write_proc(struct file *file, const char *buf, else retval = -EINVAL; } + } else if (MATCH("sub_sample")) { + if (!retval && MATCH("420")) + new_params.format.subSample = SUBSAMPLE_420; + else if (!retval && MATCH("422")) + new_params.format.subSample = SUBSAMPLE_422; + else + retval = -EINVAL; + + command_flags |= COMMAND_SETFORMAT; + } else if (MATCH("yuv_order")) { + if (!retval && MATCH("YUYV")) + new_params.format.yuvOrder = YUVORDER_YUYV; + else if (!retval && MATCH("UYVY")) + new_params.format.yuvOrder = YUVORDER_UYVY; + else + retval = -EINVAL; + + command_flags |= COMMAND_SETFORMAT; } else if (MATCH("ecp_timing")) { if (!retval && MATCH("normal")) new_params.ecpTiming = 0; @@ -711,9 +776,9 @@ static int cpia_write_proc(struct file *file, const char *buf, command_flags |= COMMAND_SETECPTIMING; } else if (MATCH("color_balance_mode")) { if (!retval && MATCH("manual")) - new_params.colourBalance.balanceModeIsAuto = 0; + new_params.colourBalance.balanceMode = 3; else if (!retval && MATCH("auto")) - new_params.colourBalance.balanceModeIsAuto = 1; + new_params.colourBalance.balanceMode = 2; else retval = -EINVAL; @@ -723,9 +788,10 @@ static int cpia_write_proc(struct file *file, const char *buf, val = VALUE; if (!retval) { - if (val <= 212) + if (val <= 212) { new_params.colourBalance.redGain = val; - else + new_params.colourBalance.balanceMode = 1; + } else retval = -EINVAL; } command_flags |= COMMAND_SETCOLOURBALANCE; @@ -734,9 +800,10 @@ static int cpia_write_proc(struct file *file, const char *buf, val = VALUE; if (!retval) { - if (val <= 212) + if (val <= 212) { new_params.colourBalance.greenGain = val; - else + new_params.colourBalance.balanceMode = 1; + } else retval = -EINVAL; } command_flags |= COMMAND_SETCOLOURBALANCE; @@ -745,9 +812,10 @@ static int cpia_write_proc(struct file *file, const char *buf, val = VALUE; if (!retval) { - if (val <= 212) + if (val <= 212) { new_params.colourBalance.blueGain = val; - else + new_params.colourBalance.balanceMode = 1; + } else retval = -EINVAL; } command_flags |= COMMAND_SETCOLOURBALANCE; @@ -784,8 +852,9 @@ static int cpia_write_proc(struct file *file, const char *buf, else if (!retval && MATCH("manual")) { if (new_params.exposure.expMode == 2) new_params.exposure.expMode = 3; + if(new_params.flickerControl.flickerMode != 0) + command_flags |= COMMAND_SETFLICKERCTRL; new_params.flickerControl.flickerMode = 0; - command_flags |= COMMAND_SETFLICKERCTRL; } else retval = -EINVAL; @@ -807,32 +876,24 @@ static int cpia_write_proc(struct file *file, const char *buf, switch(val) { case 1: new_params.exposure.gain = 0; - new_params.exposure.expMode = 1; - new_params.flickerControl.flickerMode = 0; - command_flags |= COMMAND_SETFLICKERCTRL; break; case 2: new_params.exposure.gain = 1; - new_params.exposure.expMode = 1; - new_params.flickerControl.flickerMode = 0; - command_flags |= COMMAND_SETFLICKERCTRL; break; case 4: new_params.exposure.gain = 2; - new_params.exposure.expMode = 1; - new_params.flickerControl.flickerMode = 0; - command_flags |= COMMAND_SETFLICKERCTRL; break; case 8: new_params.exposure.gain = 3; - new_params.exposure.expMode = 1; - new_params.flickerControl.flickerMode = 0; - command_flags |= COMMAND_SETFLICKERCTRL; break; default: retval = -EINVAL; break; } + new_params.exposure.expMode = 1; + if(new_params.flickerControl.flickerMode != 0) + command_flags |= COMMAND_SETFLICKERCTRL; + new_params.flickerControl.flickerMode = 0; command_flags |= COMMAND_SETEXPOSURE; if (new_params.exposure.gain > new_params.exposure.gainMode-1) @@ -840,16 +901,18 @@ static int cpia_write_proc(struct file *file, const char *buf, } } else if (MATCH("fine_exp")) { if (!retval) - val = VALUE; + val = VALUE/2; if (!retval) { if (val < 256) { - /* 1-02 firmware limits fineExp to 127*/ + /* 1-02 firmware limits fineExp/2 to 127*/ if (FIRMWARE_VERSION(1,2) && val > 127) val = 127; new_params.exposure.fineExp = val; new_params.exposure.expMode = 1; command_flags |= COMMAND_SETEXPOSURE; + if(new_params.flickerControl.flickerMode != 0) + command_flags |= COMMAND_SETFLICKERCTRL; new_params.flickerControl.flickerMode = 0; command_flags |= COMMAND_SETFLICKERCTRL; } else @@ -860,17 +923,18 @@ static int cpia_write_proc(struct file *file, const char *buf, val = VALUE; if (!retval) { - if (val < 65536) { - /* 1-02 firmware limits - * coarseExp to 255 */ - if (FIRMWARE_VERSION(1,2) && val > 255) - val = 255; + if (val <= MAX_EXP) { + if (FIRMWARE_VERSION(1,2) && + val > MAX_EXP_102) + val = MAX_EXP_102; new_params.exposure.coarseExpLo = val & 0xff; new_params.exposure.coarseExpHi = val >> 8; new_params.exposure.expMode = 1; command_flags |= COMMAND_SETEXPOSURE; + if(new_params.flickerControl.flickerMode != 0) + command_flags |= COMMAND_SETFLICKERCTRL; new_params.flickerControl.flickerMode = 0; command_flags |= COMMAND_SETFLICKERCTRL; } else @@ -881,8 +945,9 @@ static int cpia_write_proc(struct file *file, const char *buf, val = VALUE; if (!retval) { - if (val >= 220 && val <= 255) { + if (val >= COMP_RED && val <= 255) { new_params.exposure.redComp = val; + new_params.exposure.compMode = 1; command_flags |= COMMAND_SETEXPOSURE; } else retval = -EINVAL; @@ -892,8 +957,9 @@ static int cpia_write_proc(struct file *file, const char *buf, val = VALUE; if (!retval) { - if (val >= 214 && val <= 255) { + if (val >= COMP_GREEN1 && val <= 255) { new_params.exposure.green1Comp = val; + new_params.exposure.compMode = 1; command_flags |= COMMAND_SETEXPOSURE; } else retval = -EINVAL; @@ -903,8 +969,9 @@ static int cpia_write_proc(struct file *file, const char *buf, val = VALUE; if (!retval) { - if (val >= 214 && val <= 255) { + if (val >= COMP_GREEN2 && val <= 255) { new_params.exposure.green2Comp = val; + new_params.exposure.compMode = 1; command_flags |= COMMAND_SETEXPOSURE; } else retval = -EINVAL; @@ -914,8 +981,9 @@ static int cpia_write_proc(struct file *file, const char *buf, val = VALUE; if (!retval) { - if (val >= 230 && val <= 255) { + if (val >= COMP_BLUE && val <= 255) { new_params.exposure.blueComp = val; + new_params.exposure.compMode = 1; command_flags |= COMMAND_SETEXPOSURE; } else retval = -EINVAL; @@ -1010,12 +1078,10 @@ static int cpia_write_proc(struct file *file, const char *buf, command_flags |= COMMAND_SETVLOFFSET; } else if (MATCH("flicker_control")) { if (!retval && MATCH("on")) { - new_params.flickerControl.flickerMode = 1; - new_params.exposure.expMode = 2; - command_flags |= COMMAND_SETEXPOSURE; - } else if (!retval && MATCH("off")) - new_params.flickerControl.flickerMode = 0; - else + set_flicker(&new_params, &command_flags, 1); + } else if (!retval && MATCH("off")) { + set_flicker(&new_params, &command_flags, 0); + } else retval = -EINVAL; command_flags |= COMMAND_SETFLICKERCTRL; @@ -1039,16 +1105,24 @@ static int cpia_write_proc(struct file *file, const char *buf, } else retval = -EINVAL; } else if (MATCH("allowable_overexposure")) { - if (!retval) - val = VALUE; - - if (!retval) { - if (val <= 0xff) { - new_params.flickerControl. - allowableOverExposure = val; + if (!retval && MATCH("auto")) { + new_params.flickerControl.allowableOverExposure = + -find_over_exposure(new_params.colourParams.brightness); + if(new_params.flickerControl.flickerMode != 0) command_flags |= COMMAND_SETFLICKERCTRL; - } else - retval = -EINVAL; + } else { + if (!retval) + val = VALUE; + + if (!retval) { + if (val <= 0xff) { + new_params.flickerControl. + allowableOverExposure = val; + if(new_params.flickerControl.flickerMode != 0) + command_flags |= COMMAND_SETFLICKERCTRL; + } else + retval = -EINVAL; + } } } else if (MATCH("compression_mode")) { if (!retval && MATCH("none")) @@ -1067,6 +1141,8 @@ static int cpia_write_proc(struct file *file, const char *buf, } else if (MATCH("decimation_enable")) { if (!retval && MATCH("off")) new_params.compression.decimation = 0; + else if (!retval && MATCH("on")) + new_params.compression.decimation = 1; else retval = -EINVAL; @@ -1086,16 +1162,23 @@ static int cpia_write_proc(struct file *file, const char *buf, if (!retval) val = VALUE; - if (!retval) - new_params.compressionTarget.targetFR = val; + if (!retval) { + if(val > 0 && val <= 30) + new_params.compressionTarget.targetFR = val; + else + retval = -EINVAL; + } command_flags |= COMMAND_SETCOMPRESSIONTARGET; } else if (MATCH("target_quality")) { if (!retval) val = VALUE; - if (!retval) - new_params.compressionTarget.targetQ = val; - + if (!retval) { + if(val > 0 && val <= 64) + new_params.compressionTarget.targetQ = val; + else + retval = -EINVAL; + } command_flags |= COMMAND_SETCOMPRESSIONTARGET; } else if (MATCH("y_threshold")) { if (!retval) @@ -1247,10 +1330,8 @@ static int cpia_write_proc(struct file *file, const char *buf, } } #undef MATCH -#undef FIRMWARE_VERSION #undef VALUE -#undef FIND_VALUE -#undef FIND_END +#undef FIRMWARE_VERSION if (!retval) { if (command_flags & COMMAND_SETCOLOURPARAMS) { /* Adjust cam->vp to reflect these changes */ @@ -1261,7 +1342,10 @@ static int cpia_write_proc(struct file *file, const char *buf, cam->vp.colour = new_params.colourParams.saturation*65535/100; } - + if((command_flags & COMMAND_SETEXPOSURE) && + new_params.exposure.expMode == 2) + cam->exposure_status = EXPOSURE_NORMAL; + memcpy(&cam->params, &new_params, sizeof(struct cam_params)); cam->mainsFreq = new_mains; cam->cmd_queue |= command_flags; @@ -1294,11 +1378,11 @@ static void create_proc_cpia_cam(struct cam_data *cam) ent->read_proc = cpia_read_proc; ent->write_proc = cpia_write_proc; /* - size of the proc entry is 3672 bytes for the standard webcam; - the extra features of the QX3 microscope add 188 bytes. + size of the proc entry is 3736 bytes for the standard webcam; + the extra features of the QX3 microscope add 189 bytes. (we have not yet probed the camera to see which type it is). */ - ent->size = 3672 + 188; + ent->size = 3736 + 189; cam->proc_entry = ent; } @@ -1324,10 +1408,12 @@ static void proc_cpia_create(void) LOG("Unable to initialise /proc/cpia\n"); } +#ifdef MODULE static void proc_cpia_destroy(void) { remove_proc_entry("cpia", 0); } +#endif /*MODULE*/ #endif /* CONFIG_PROC_FS */ /* ----------------------- debug functions ---------------------- */ @@ -1410,9 +1496,7 @@ static void set_vw_size(struct cam_data *cam) cam->vw.height = 288; cam->params.format.videoSize=VIDEOSIZE_CIF; cam->params.roi.colStart=0; - cam->params.roi.colEnd=44; cam->params.roi.rowStart=0; - cam->params.roi.rowEnd=72; cam->params.streamStartLine = 120; break; case VIDEOSIZE_SIF: @@ -1420,9 +1504,7 @@ static void set_vw_size(struct cam_data *cam) cam->vw.height = 240; cam->params.format.videoSize=VIDEOSIZE_CIF; cam->params.roi.colStart=2; - cam->params.roi.colEnd=42; cam->params.roi.rowStart=6; - cam->params.roi.rowEnd=66; cam->params.streamStartLine = 120; break; case VIDEOSIZE_288_216: @@ -1430,9 +1512,7 @@ static void set_vw_size(struct cam_data *cam) cam->vw.height = 216; cam->params.format.videoSize=VIDEOSIZE_CIF; cam->params.roi.colStart=4; - cam->params.roi.colEnd=40; cam->params.roi.rowStart=9; - cam->params.roi.rowEnd=63; cam->params.streamStartLine = 120; break; case VIDEOSIZE_256_192: @@ -1440,9 +1520,7 @@ static void set_vw_size(struct cam_data *cam) cam->vw.height = 192; cam->params.format.videoSize=VIDEOSIZE_CIF; cam->params.roi.colStart=6; - cam->params.roi.colEnd=38; cam->params.roi.rowStart=12; - cam->params.roi.rowEnd=60; cam->params.streamStartLine = 120; break; case VIDEOSIZE_224_168: @@ -1450,9 +1528,7 @@ static void set_vw_size(struct cam_data *cam) cam->vw.height = 168; cam->params.format.videoSize=VIDEOSIZE_CIF; cam->params.roi.colStart=8; - cam->params.roi.colEnd=36; cam->params.roi.rowStart=15; - cam->params.roi.rowEnd=57; cam->params.streamStartLine = 120; break; case VIDEOSIZE_192_144: @@ -1460,9 +1536,7 @@ static void set_vw_size(struct cam_data *cam) cam->vw.height = 144; cam->params.format.videoSize=VIDEOSIZE_CIF; cam->params.roi.colStart=10; - cam->params.roi.colEnd=34; cam->params.roi.rowStart=18; - cam->params.roi.rowEnd=54; cam->params.streamStartLine = 120; break; case VIDEOSIZE_QCIF: @@ -1470,9 +1544,7 @@ static void set_vw_size(struct cam_data *cam) cam->vw.height = 144; cam->params.format.videoSize=VIDEOSIZE_QCIF; cam->params.roi.colStart=0; - cam->params.roi.colEnd=22; cam->params.roi.rowStart=0; - cam->params.roi.rowEnd=36; cam->params.streamStartLine = 60; break; case VIDEOSIZE_QSIF: @@ -1480,9 +1552,7 @@ static void set_vw_size(struct cam_data *cam) cam->vw.height = 120; cam->params.format.videoSize=VIDEOSIZE_QCIF; cam->params.roi.colStart=1; - cam->params.roi.colEnd=21; cam->params.roi.rowStart=3; - cam->params.roi.rowEnd=33; cam->params.streamStartLine = 60; break; case VIDEOSIZE_128_96: @@ -1490,9 +1560,7 @@ static void set_vw_size(struct cam_data *cam) cam->vw.height = 96; cam->params.format.videoSize=VIDEOSIZE_QCIF; cam->params.roi.colStart=3; - cam->params.roi.colEnd=19; cam->params.roi.rowStart=6; - cam->params.roi.rowEnd=30; cam->params.streamStartLine = 60; break; case VIDEOSIZE_88_72: @@ -1500,9 +1568,7 @@ static void set_vw_size(struct cam_data *cam) cam->vw.height = 72; cam->params.format.videoSize=VIDEOSIZE_QCIF; cam->params.roi.colStart=5; - cam->params.roi.colEnd=16; cam->params.roi.rowStart=9; - cam->params.roi.rowEnd=27; cam->params.streamStartLine = 60; break; case VIDEOSIZE_64_48: @@ -1510,9 +1576,7 @@ static void set_vw_size(struct cam_data *cam) cam->vw.height = 48; cam->params.format.videoSize=VIDEOSIZE_QCIF; cam->params.roi.colStart=7; - cam->params.roi.colEnd=15; cam->params.roi.rowStart=12; - cam->params.roi.rowEnd=24; cam->params.streamStartLine = 60; break; case VIDEOSIZE_48_48: @@ -1520,15 +1584,26 @@ static void set_vw_size(struct cam_data *cam) cam->vw.height = 48; cam->params.format.videoSize=VIDEOSIZE_QCIF; cam->params.roi.colStart=8; - cam->params.roi.colEnd=14; cam->params.roi.rowStart=6; - cam->params.roi.rowEnd=30; cam->params.streamStartLine = 60; break; default: LOG("bad videosize value: %d\n", cam->video_size); + return; } + if(cam->vc.width == 0) + cam->vc.width = cam->vw.width; + if(cam->vc.height == 0) + cam->vc.height = cam->vw.height; + + cam->params.roi.colStart += cam->vc.x >> 3; + cam->params.roi.colEnd = cam->params.roi.colStart + + (cam->vc.width >> 3); + cam->params.roi.rowStart += cam->vc.y >> 2; + cam->params.roi.rowEnd = cam->params.roi.rowStart + + (cam->vc.height >> 2); + return; } @@ -1668,29 +1743,6 @@ static int do_command(struct cam_data *cam, u16 command, u8 a, u8 b, u8 c, u8 d) cam->params.exposure.green1Comp = data[5]; cam->params.exposure.green2Comp = data[6]; cam->params.exposure.blueComp = data[7]; - /* If the *Comp parameters are wacko, generate - * a warning, and reset them back to default - * values. - rich@annexia.org - */ - if (cam->params.exposure.redComp < 220 || - cam->params.exposure.redComp > 255 || - cam->params.exposure.green1Comp < 214 || - cam->params.exposure.green1Comp > 255 || - cam->params.exposure.green2Comp < 214 || - cam->params.exposure.green2Comp > 255 || - cam->params.exposure.blueComp < 230 || - cam->params.exposure.blueComp > 255) - { - printk (KERN_WARNING "*_comp parameters have gone AWOL (%d/%d/%d/%d) - reseting them\n", - cam->params.exposure.redComp, - cam->params.exposure.green1Comp, - cam->params.exposure.green2Comp, - cam->params.exposure.blueComp); - cam->params.exposure.redComp = 220; - cam->params.exposure.green1Comp = 214; - cam->params.exposure.green2Comp = 214; - cam->params.exposure.blueComp = 230; - } up(&cam->param_lock); break; @@ -1756,6 +1808,122 @@ static int do_command_extended(struct cam_data *cam, u16 command, **********************************************************************/ #define LIMIT(x) ((((x)>0xffffff)?0xff0000:(((x)<=0xffff)?0:(x)&0xff0000))>>16) +static int convert420(unsigned char *yuv, unsigned char *rgb, int out_fmt, + int linesize, int mmap_kludge) +{ + int y, u, v, r, g, b, y1; + + /* Odd lines use the same u and v as the previous line. + * Because of compression, it is necessary to get this + * information from the decoded image. */ + switch(out_fmt) { + case VIDEO_PALETTE_RGB555: + y = (*yuv++ - 16) * 76310; + y1 = (*yuv - 16) * 76310; + r = ((*(rgb+1-linesize)) & 0x7c) << 1; + g = ((*(rgb-linesize)) & 0xe0) >> 4 | + ((*(rgb+1-linesize)) & 0x03) << 6; + b = ((*(rgb-linesize)) & 0x1f) << 3; + u = (-53294 * r - 104635 * g + 157929 * b) / 5756495; + v = (157968 * r - 132278 * g - 25690 * b) / 5366159; + r = 104635 * v; + g = -25690 * u - 53294 * v; + b = 132278 * u; + *rgb++ = ((LIMIT(g+y) & 0xf8) << 2) | (LIMIT(b+y) >> 3); + *rgb++ = ((LIMIT(r+y) & 0xf8) >> 1) | (LIMIT(g+y) >> 6); + *rgb++ = ((LIMIT(g+y1) & 0xf8) << 2) | (LIMIT(b+y1) >> 3); + *rgb = ((LIMIT(r+y1) & 0xf8) >> 1) | (LIMIT(g+y1) >> 6); + return 4; + case VIDEO_PALETTE_RGB565: + y = (*yuv++ - 16) * 76310; + y1 = (*yuv - 16) * 76310; + r = (*(rgb+1-linesize)) & 0xf8; + g = ((*(rgb-linesize)) & 0xe0) >> 3 | + ((*(rgb+1-linesize)) & 0x07) << 5; + b = ((*(rgb-linesize)) & 0x1f) << 3; + u = (-53294 * r - 104635 * g + 157929 * b) / 5756495; + v = (157968 * r - 132278 * g - 25690 * b) / 5366159; + r = 104635 * v; + g = -25690 * u - 53294 * v; + b = 132278 * u; + *rgb++ = ((LIMIT(g+y) & 0xfc) << 3) | (LIMIT(b+y) >> 3); + *rgb++ = (LIMIT(r+y) & 0xf8) | (LIMIT(g+y) >> 5); + *rgb++ = ((LIMIT(g+y1) & 0xfc) << 3) | (LIMIT(b+y1) >> 3); + *rgb = (LIMIT(r+y1) & 0xf8) | (LIMIT(g+y1) >> 5); + return 4; + break; + case VIDEO_PALETTE_RGB24: + case VIDEO_PALETTE_RGB32: + y = (*yuv++ - 16) * 76310; + y1 = (*yuv - 16) * 76310; + if (mmap_kludge) { + r = *(rgb+2-linesize); + g = *(rgb+1-linesize); + b = *(rgb-linesize); + } else { + r = *(rgb-linesize); + g = *(rgb+1-linesize); + b = *(rgb+2-linesize); + } + u = (-53294 * r - 104635 * g + 157929 * b) / 5756495; + v = (157968 * r - 132278 * g - 25690 * b) / 5366159; + r = 104635 * v; + g = -25690 * u + -53294 * v; + b = 132278 * u; + if (mmap_kludge) { + *rgb++ = LIMIT(b+y); + *rgb++ = LIMIT(g+y); + *rgb++ = LIMIT(r+y); + if(out_fmt == VIDEO_PALETTE_RGB32) + rgb++; + *rgb++ = LIMIT(b+y1); + *rgb++ = LIMIT(g+y1); + *rgb = LIMIT(r+y1); + } else { + *rgb++ = LIMIT(r+y); + *rgb++ = LIMIT(g+y); + *rgb++ = LIMIT(b+y); + if(out_fmt == VIDEO_PALETTE_RGB32) + rgb++; + *rgb++ = LIMIT(r+y1); + *rgb++ = LIMIT(g+y1); + *rgb = LIMIT(b+y1); + } + if(out_fmt == VIDEO_PALETTE_RGB32) + return 8; + return 6; + case VIDEO_PALETTE_YUV422: + case VIDEO_PALETTE_YUYV: + y = *yuv++; + u = *(rgb+1-linesize); + y1 = *yuv; + v = *(rgb+3-linesize); + *rgb++ = y; + *rgb++ = u; + *rgb++ = y1; + *rgb = v; + return 4; + case VIDEO_PALETTE_UYVY: + u = *(rgb-linesize); + y = *yuv++; + v = *(rgb+2-linesize); + y1 = *yuv; + *rgb++ = u; + *rgb++ = y; + *rgb++ = v; + *rgb = y1; + return 4; + case VIDEO_PALETTE_GREY: + *rgb++ = *yuv++; + *rgb = *yuv; + return 2; + default: + DBG("Empty: %d\n", out_fmt); + return 0; + } +} + + static int yuvconvert(unsigned char *yuv, unsigned char *rgb, int out_fmt, int in_uyvy, int mmap_kludge) { @@ -1887,7 +2055,8 @@ static int skipcount(int count, int fmt) static int parse_picture(struct cam_data *cam, int size) { u8 *obuf, *ibuf, *end_obuf; - int ll, in_uyvy, compressed, origsize, out_fmt; + int ll, in_uyvy, compressed, decimation, even_line, origsize, out_fmt; + int rows, cols, linesize, subsample_422; /* make sure params don't change while we are decoding */ down(&cam->param_lock); @@ -1910,11 +2079,12 @@ static int parse_picture(struct cam_data *cam, int size) return -1; } - if (ibuf[17] != SUBSAMPLE_422) { + if (ibuf[17] != SUBSAMPLE_420 && ibuf[17] != SUBSAMPLE_422) { LOG("illegal subtype %d\n",ibuf[17]); up(&cam->param_lock); return -1; } + subsample_422 = ibuf[17] == SUBSAMPLE_422; if (ibuf[18] != YUVORDER_YUYV && ibuf[18] != YUVORDER_UYVY) { LOG("illegal yuvorder %d\n",ibuf[18]); @@ -1923,8 +2093,6 @@ static int parse_picture(struct cam_data *cam, int size) } in_uyvy = ibuf[18] == YUVORDER_UYVY; -#if 0 - /* FIXME: ROI mismatch occurs when switching capture sizes */ if ((ibuf[24] != cam->params.roi.colStart) || (ibuf[25] != cam->params.roi.colEnd) || (ibuf[26] != cam->params.roi.rowStart) || @@ -1933,7 +2101,9 @@ static int parse_picture(struct cam_data *cam, int size) up(&cam->param_lock); return -1; } -#endif + cols = 8*(ibuf[25] - ibuf[24]); + rows = 4*(ibuf[27] - ibuf[26]); + if ((ibuf[28] != NOT_COMPRESSED) && (ibuf[28] != COMPRESSED)) { LOG("illegal compression %d\n",ibuf[28]); @@ -1942,12 +2112,13 @@ static int parse_picture(struct cam_data *cam, int size) } compressed = (ibuf[28] == COMPRESSED); - if (ibuf[29] != NO_DECIMATION) { - LOG("decimation not supported\n"); + if (ibuf[29] != NO_DECIMATION && ibuf[29] != DECIMATION_ENAB) { + LOG("illegal decimation %d\n",ibuf[29]); up(&cam->param_lock); return -1; } - + decimation = (ibuf[29] == DECIMATION_ENAB); + cam->params.yuvThreshold.yThreshold = ibuf[30]; cam->params.yuvThreshold.uvThreshold = ibuf[31]; cam->params.status.systemState = ibuf[32]; @@ -1961,10 +2132,12 @@ static int parse_picture(struct cam_data *cam, int size) cam->fps = ibuf[41]; up(&cam->param_lock); + linesize = skipcount(cols, out_fmt); ibuf += FRAME_HEADER_SIZE; size -= FRAME_HEADER_SIZE; ll = ibuf[0] | (ibuf[1] << 8); ibuf += 2; + even_line = 1; while (size > 0) { size -= (ll+2); @@ -1975,16 +2148,24 @@ static int parse_picture(struct cam_data *cam, int size) while (ll > 1) { if (!compressed || (compressed && !(*ibuf & 1))) { + if(subsample_422 || even_line) { obuf += yuvconvert(ibuf, obuf, out_fmt, in_uyvy, cam->mmap_kludge); ibuf += 4; ll -= 4; } else { + /* SUBSAMPLE_420 on an odd line */ + obuf += convert420(ibuf, obuf, + out_fmt, linesize, + cam->mmap_kludge); + ibuf += 2; + ll -= 2; + } + } else { /*skip compressed interval from previous frame*/ - int skipsize = skipcount(*ibuf >> 1, out_fmt); - obuf += skipsize; + obuf += skipcount(*ibuf >> 1, out_fmt); if (obuf > end_obuf) { - LOG("Insufficient data in buffer\n"); + LOG("Insufficient buffer size\n"); return -1; } ++ibuf; @@ -1998,7 +2179,7 @@ static int parse_picture(struct cam_data *cam, int size) return -1; } - ibuf++; /* skip over EOL */ + ++ibuf; /* skip over EOL */ if ((size > 3) && (ibuf[0] == EOI) && (ibuf[1] == EOI) && (ibuf[2] == EOI) && (ibuf[3] == EOI)) { @@ -2006,10 +2187,17 @@ static int parse_picture(struct cam_data *cam, int size) break; } + if(decimation) { + /* skip the odd lines for now */ + obuf += linesize; + } + if (size > 1) { ll = ibuf[0] | (ibuf[1] << 8); ibuf += 2; /* skip over line length */ } + if(!decimation) + even_line = !even_line; } else { LOG("line length was not 1 but %d after %d/%d bytes\n", ll, origsize-size, origsize); @@ -2017,6 +2205,25 @@ static int parse_picture(struct cam_data *cam, int size) } } + if(decimation) { + /* interpolate odd rows */ + int i, j; + u8 *prev, *next; + prev = cam->decompressed_frame.data; + obuf = prev+linesize; + next = obuf+linesize; + for(i=1; i<rows-1; i+=2) { + for(j=0; j<linesize; ++j) { + *obuf++ = ((int)*prev++ + *next++) / 2; + } + prev += linesize; + obuf += linesize; + next += linesize; + } + /* last row is odd, just copy previous row */ + memcpy(obuf, prev, linesize); + } + cam->decompressed_frame.count = obuf-cam->decompressed_frame.data; return cam->decompressed_frame.count; @@ -2029,6 +2236,38 @@ static inline int init_stream_cap(struct cam_data *cam) 0, cam->params.streamStartLine, 0, 0); } + +/* find_over_exposure + * Finds a suitable value of OverExposure for use with SetFlickerCtrl + * Some calculation is required because this value changes with the brightness + * set with SetColourParameters + * + * Parameters: Brightness - last brightness value set with SetColourParameters + * + * Returns: OverExposure value to use with SetFlickerCtrl + */ +#define FLICKER_MAX_EXPOSURE 250 +#define FLICKER_ALLOWABLE_OVER_EXPOSURE 146 +#define FLICKER_BRIGHTNESS_CONSTANT 59 +static int find_over_exposure(int brightness) +{ + int MaxAllowableOverExposure, OverExposure; + + MaxAllowableOverExposure = FLICKER_MAX_EXPOSURE - brightness - + FLICKER_BRIGHTNESS_CONSTANT; + + if (MaxAllowableOverExposure < FLICKER_ALLOWABLE_OVER_EXPOSURE) { + OverExposure = MaxAllowableOverExposure; + } else { + OverExposure = FLICKER_ALLOWABLE_OVER_EXPOSURE; + } + + return OverExposure; +} +#undef FLICKER_MAX_EXPOSURE +#undef FLICKER_ALLOWABLE_OVER_EXPOSURE +#undef FLICKER_BRIGHTNESS_CONSTANT + /* update various camera modes and settings */ static void dispatch_commands(struct cam_data *cam) { @@ -2039,17 +2278,6 @@ static void dispatch_commands(struct cam_data *cam) } DEB_BYTE(cam->cmd_queue); DEB_BYTE(cam->cmd_queue>>8); - if (cam->cmd_queue & COMMAND_SETCOLOURPARAMS) - do_command(cam, CPIA_COMMAND_SetColourParams, - cam->params.colourParams.brightness, - cam->params.colourParams.contrast, - cam->params.colourParams.saturation, 0); - - if (cam->cmd_queue & COMMAND_SETCOMPRESSION) - do_command(cam, CPIA_COMMAND_SetCompression, - cam->params.compression.mode, - cam->params.compression.decimation, 0, 0); - if (cam->cmd_queue & COMMAND_SETFORMAT) { do_command(cam, CPIA_COMMAND_SetFormat, cam->params.format.videoSize, @@ -2061,37 +2289,30 @@ static void dispatch_commands(struct cam_data *cam) cam->first_frame = 1; } - if (cam->cmd_queue & COMMAND_SETCOMPRESSIONTARGET) - do_command(cam, CPIA_COMMAND_SetCompressionTarget, - cam->params.compressionTarget.frTargeting, - cam->params.compressionTarget.targetFR, - cam->params.compressionTarget.targetQ, 0); - - if (cam->cmd_queue & COMMAND_SETYUVTHRESH) - do_command(cam, CPIA_COMMAND_SetYUVThresh, - cam->params.yuvThreshold.yThreshold, - cam->params.yuvThreshold.uvThreshold, 0, 0); + if (cam->cmd_queue & COMMAND_SETCOLOURPARAMS) + do_command(cam, CPIA_COMMAND_SetColourParams, + cam->params.colourParams.brightness, + cam->params.colourParams.contrast, + cam->params.colourParams.saturation, 0); - if (cam->cmd_queue & COMMAND_SETECPTIMING) - do_command(cam, CPIA_COMMAND_SetECPTiming, - cam->params.ecpTiming, 0, 0, 0); + if (cam->cmd_queue & COMMAND_SETAPCOR) + do_command(cam, CPIA_COMMAND_SetApcor, + cam->params.apcor.gain1, + cam->params.apcor.gain2, + cam->params.apcor.gain4, + cam->params.apcor.gain8); - if (cam->cmd_queue & COMMAND_SETCOMPRESSIONPARAMS) - do_command_extended(cam, CPIA_COMMAND_SetCompressionParams, - 0, 0, 0, 0, - cam->params.compressionParams.hysteresis, - cam->params.compressionParams.threshMax, - cam->params.compressionParams.smallStep, - cam->params.compressionParams.largeStep, - cam->params.compressionParams.decimationHysteresis, - cam->params.compressionParams.frDiffStepThresh, - cam->params.compressionParams.qDiffStepThresh, - cam->params.compressionParams.decimationThreshMod); + if (cam->cmd_queue & COMMAND_SETVLOFFSET) + do_command(cam, CPIA_COMMAND_SetVLOffset, + cam->params.vlOffset.gain1, + cam->params.vlOffset.gain2, + cam->params.vlOffset.gain4, + cam->params.vlOffset.gain8); - if (cam->cmd_queue & COMMAND_SETEXPOSURE) + if (cam->cmd_queue & COMMAND_SETEXPOSURE) { do_command_extended(cam, CPIA_COMMAND_SetExposure, cam->params.exposure.gainMode, - cam->params.exposure.expMode, + 1, cam->params.exposure.compMode, cam->params.exposure.centreWeight, cam->params.exposure.gain, @@ -2102,12 +2323,21 @@ static void dispatch_commands(struct cam_data *cam) cam->params.exposure.green1Comp, cam->params.exposure.green2Comp, cam->params.exposure.blueComp); - + if(cam->params.exposure.expMode != 1) { + do_command_extended(cam, CPIA_COMMAND_SetExposure, + 0, + cam->params.exposure.expMode, + 0, 0, + cam->params.exposure.gain, + cam->params.exposure.fineExp, + cam->params.exposure.coarseExpLo, + cam->params.exposure.coarseExpHi, + 0, 0, 0, 0); + } + } + if (cam->cmd_queue & COMMAND_SETCOLOURBALANCE) { - if (cam->params.colourBalance.balanceModeIsAuto) { - do_command(cam, CPIA_COMMAND_SetColourBalance, - 2, 0, 0, 0); - } else { + if (cam->params.colourBalance.balanceMode == 1) { do_command(cam, CPIA_COMMAND_SetColourBalance, 1, cam->params.colourBalance.redGain, @@ -2116,32 +2346,59 @@ static void dispatch_commands(struct cam_data *cam) do_command(cam, CPIA_COMMAND_SetColourBalance, 3, 0, 0, 0); } + if (cam->params.colourBalance.balanceMode == 2) { + do_command(cam, CPIA_COMMAND_SetColourBalance, + 2, 0, 0, 0); + } + if (cam->params.colourBalance.balanceMode == 3) { + do_command(cam, CPIA_COMMAND_SetColourBalance, + 3, 0, 0, 0); + } } + if (cam->cmd_queue & COMMAND_SETCOMPRESSIONTARGET) + do_command(cam, CPIA_COMMAND_SetCompressionTarget, + cam->params.compressionTarget.frTargeting, + cam->params.compressionTarget.targetFR, + cam->params.compressionTarget.targetQ, 0); + + if (cam->cmd_queue & COMMAND_SETYUVTHRESH) + do_command(cam, CPIA_COMMAND_SetYUVThresh, + cam->params.yuvThreshold.yThreshold, + cam->params.yuvThreshold.uvThreshold, 0, 0); + + if (cam->cmd_queue & COMMAND_SETCOMPRESSIONPARAMS) + do_command_extended(cam, CPIA_COMMAND_SetCompressionParams, + 0, 0, 0, 0, + cam->params.compressionParams.hysteresis, + cam->params.compressionParams.threshMax, + cam->params.compressionParams.smallStep, + cam->params.compressionParams.largeStep, + cam->params.compressionParams.decimationHysteresis, + cam->params.compressionParams.frDiffStepThresh, + cam->params.compressionParams.qDiffStepThresh, + cam->params.compressionParams.decimationThreshMod); + + if (cam->cmd_queue & COMMAND_SETCOMPRESSION) + do_command(cam, CPIA_COMMAND_SetCompression, + cam->params.compression.mode, + cam->params.compression.decimation, 0, 0); + if (cam->cmd_queue & COMMAND_SETSENSORFPS) do_command(cam, CPIA_COMMAND_SetSensorFPS, cam->params.sensorFps.divisor, cam->params.sensorFps.baserate, 0, 0); - if (cam->cmd_queue & COMMAND_SETAPCOR) - do_command(cam, CPIA_COMMAND_SetApcor, - cam->params.apcor.gain1, - cam->params.apcor.gain2, - cam->params.apcor.gain4, - cam->params.apcor.gain8); - if (cam->cmd_queue & COMMAND_SETFLICKERCTRL) do_command(cam, CPIA_COMMAND_SetFlickerCtrl, cam->params.flickerControl.flickerMode, cam->params.flickerControl.coarseJump, - cam->params.flickerControl.allowableOverExposure, 0); + abs(cam->params.flickerControl.allowableOverExposure), + 0); - if (cam->cmd_queue & COMMAND_SETVLOFFSET) - do_command(cam, CPIA_COMMAND_SetVLOffset, - cam->params.vlOffset.gain1, - cam->params.vlOffset.gain2, - cam->params.vlOffset.gain4, - cam->params.vlOffset.gain8); + if (cam->cmd_queue & COMMAND_SETECPTIMING) + do_command(cam, CPIA_COMMAND_SetECPTiming, + cam->params.ecpTiming, 0, 0, 0); if (cam->cmd_queue & COMMAND_PAUSE) do_command(cam, CPIA_COMMAND_EndStreamCap, 0, 0, 0, 0); @@ -2149,20 +2406,416 @@ static void dispatch_commands(struct cam_data *cam) if (cam->cmd_queue & COMMAND_RESUME) init_stream_cap(cam); - if (cam->cmd_queue & COMMAND_SETLIGHTS && cam->params.qx3.qx3_detected) { - int p1 = (cam->params.qx3.bottomlight == 0) << 1; - int p2 = (cam->params.qx3.toplight == 0) << 3; - do_command(cam, CPIA_COMMAND_WriteVCReg, 0x90, 0x8F, 0x50, 0); - do_command(cam, CPIA_COMMAND_WriteMCPort, 2, 0, (p1|p2|0xE0), 0); - } + if (cam->cmd_queue & COMMAND_SETLIGHTS && cam->params.qx3.qx3_detected) + { + int p1 = (cam->params.qx3.bottomlight == 0) << 1; + int p2 = (cam->params.qx3.toplight == 0) << 3; + do_command(cam, CPIA_COMMAND_WriteVCReg, 0x90, 0x8F, 0x50, 0); + do_command(cam, CPIA_COMMAND_WriteMCPort, 2, 0, (p1|p2|0xE0), 0); + } - up(&cam->param_lock); cam->cmd_queue = COMMAND_NONE; + up(&cam->param_lock); return; } + + +static void set_flicker(struct cam_params *params, volatile u32 *command_flags, + int on) +{ + /* Everything in here is from the Windows driver */ +#define FIRMWARE_VERSION(x,y) (params->version.firmwareVersion == (x) && \ + params->version.firmwareRevision == (y)) +/* define for compgain calculation */ +#define COMPGAIN(base, curexp, newexp) \ + (u8) ((((float) base - 128.0) * ((float) curexp / (float) newexp)) + 128.5) +#define EXP_FROM_COMP(basecomp, curcomp, curexp) \ + (u16)((float)curexp * (float)(u8)(curcomp + 128) / (float)(u8)(basecomp - 128)) + int currentexp = params->exposure.coarseExpLo + + params->exposure.coarseExpHi*256; + int startexp; + if (on) { + int cj = params->flickerControl.coarseJump; + params->flickerControl.flickerMode = 1; + params->flickerControl.disabled = 0; + if(params->exposure.expMode != 2) + *command_flags |= COMMAND_SETEXPOSURE; + params->exposure.expMode = 2; + currentexp = currentexp << params->exposure.gain; + params->exposure.gain = 0; + /* round down current exposure to nearest value */ + startexp = (currentexp + ROUND_UP_EXP_FOR_FLICKER) / cj; + if(startexp < 1) + startexp = 1; + startexp = (startexp * cj) - 1; + if(FIRMWARE_VERSION(1,2)) + while(startexp > MAX_EXP_102) + startexp -= cj; + else + while(startexp > MAX_EXP) + startexp -= cj; + params->exposure.coarseExpLo = startexp & 0xff; + params->exposure.coarseExpHi = startexp >> 8; + if (currentexp > startexp) { + if (currentexp > (2 * startexp)) + currentexp = 2 * startexp; + params->exposure.redComp = COMPGAIN (COMP_RED, currentexp, startexp); + params->exposure.green1Comp = COMPGAIN (COMP_GREEN1, currentexp, startexp); + params->exposure.green2Comp = COMPGAIN (COMP_GREEN2, currentexp, startexp); + params->exposure.blueComp = COMPGAIN (COMP_BLUE, currentexp, startexp); + } else { + params->exposure.redComp = COMP_RED; + params->exposure.green1Comp = COMP_GREEN1; + params->exposure.green2Comp = COMP_GREEN2; + params->exposure.blueComp = COMP_BLUE; + } + if(FIRMWARE_VERSION(1,2)) + params->exposure.compMode = 0; + else + params->exposure.compMode = 1; + + params->apcor.gain1 = 0x18; + params->apcor.gain2 = 0x18; + params->apcor.gain4 = 0x16; + params->apcor.gain8 = 0x14; + *command_flags |= COMMAND_SETAPCOR; + } else { + params->flickerControl.flickerMode = 0; + params->flickerControl.disabled = 1; + /* Coarse = average of equivalent coarse for each comp channel */ + startexp = EXP_FROM_COMP(COMP_RED, params->exposure.redComp, currentexp); + startexp += EXP_FROM_COMP(COMP_GREEN1, params->exposure.green1Comp, currentexp); + startexp += EXP_FROM_COMP(COMP_GREEN2, params->exposure.green2Comp, currentexp); + startexp += EXP_FROM_COMP(COMP_BLUE, params->exposure.blueComp, currentexp); + startexp = startexp >> 2; + while(startexp > MAX_EXP && + params->exposure.gain < params->exposure.gainMode-1) { + startexp = startexp >> 1; + ++params->exposure.gain; + } + if(FIRMWARE_VERSION(1,2) && startexp > MAX_EXP_102) + startexp = MAX_EXP_102; + if(startexp > MAX_EXP) + startexp = MAX_EXP; + params->exposure.coarseExpLo = startexp&0xff; + params->exposure.coarseExpHi = startexp >> 8; + params->exposure.redComp = COMP_RED; + params->exposure.green1Comp = COMP_GREEN1; + params->exposure.green2Comp = COMP_GREEN2; + params->exposure.blueComp = COMP_BLUE; + params->exposure.compMode = 1; + *command_flags |= COMMAND_SETEXPOSURE; + params->apcor.gain1 = 0x18; + params->apcor.gain2 = 0x16; + params->apcor.gain4 = 0x24; + params->apcor.gain8 = 0x34; + *command_flags |= COMMAND_SETAPCOR; + } + params->vlOffset.gain1 = 20; + params->vlOffset.gain2 = 24; + params->vlOffset.gain4 = 26; + params->vlOffset.gain8 = 26; + *command_flags |= COMMAND_SETVLOFFSET; +#undef FIRMWARE_VERSION +#undef EXP_FROM_COMP +#undef COMPGAIN +} + +#define FIRMWARE_VERSION(x,y) (cam->params.version.firmwareVersion == (x) && \ + cam->params.version.firmwareRevision == (y)) +/* monitor the exposure and adjust the sensor frame rate if needed */ +static void monitor_exposure(struct cam_data *cam) +{ + u8 exp_acc, bcomp, gain, coarseL, cmd[8], data[8]; + int retval, light_exp, dark_exp, very_dark_exp; + int old_exposure, new_exposure, framerate; + + /* get necessary stats and register settings from camera */ + /* do_command can't handle this, so do it ourselves */ + cmd[0] = CPIA_COMMAND_ReadVPRegs>>8; + cmd[1] = CPIA_COMMAND_ReadVPRegs&0xff; + cmd[2] = 30; + cmd[3] = 4; + cmd[4] = 9; + cmd[5] = 8; + cmd[6] = 8; + cmd[7] = 0; + retval = cam->ops->transferCmd(cam->lowlevel_data, cmd, data); + if (retval) { + LOG("ReadVPRegs(30,4,9,8) - failed, retval=%d\n", + retval); + return; + } + exp_acc = data[0]; + bcomp = data[1]; + gain = data[2]; + coarseL = data[3]; + + down(&cam->param_lock); + light_exp = cam->params.colourParams.brightness + + TC - 50 + EXP_ACC_LIGHT; + if(light_exp > 255) + light_exp = 255; + dark_exp = cam->params.colourParams.brightness + + TC - 50 - EXP_ACC_DARK; + if(dark_exp < 0) + dark_exp = 0; + very_dark_exp = dark_exp/2; + + old_exposure = cam->params.exposure.coarseExpHi * 256 + + cam->params.exposure.coarseExpLo; + + if(!cam->params.flickerControl.disabled) { + /* Flicker control on */ + int max_comp = FIRMWARE_VERSION(1,2) ? MAX_COMP : HIGH_COMP_102; + bcomp += 128; /* decode */ + if(bcomp >= max_comp && exp_acc < dark_exp) { + /* dark */ + if(exp_acc < very_dark_exp) { + /* very dark */ + if(cam->exposure_status == EXPOSURE_VERY_DARK) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_VERY_DARK; + cam->exposure_count = 1; + } + } else { + /* just dark */ + if(cam->exposure_status == EXPOSURE_DARK) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_DARK; + cam->exposure_count = 1; + } + } + } else if(old_exposure <= LOW_EXP || exp_acc > light_exp) { + /* light */ + if(old_exposure <= VERY_LOW_EXP) { + /* very light */ + if(cam->exposure_status == EXPOSURE_VERY_LIGHT) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_VERY_LIGHT; + cam->exposure_count = 1; + } + } else { + /* just light */ + if(cam->exposure_status == EXPOSURE_LIGHT) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_LIGHT; + cam->exposure_count = 1; + } + } + } else { + /* not dark or light */ + cam->exposure_status = EXPOSURE_NORMAL; + } + } else { + /* Flicker control off */ + if(old_exposure >= MAX_EXP && exp_acc < dark_exp) { + /* dark */ + if(exp_acc < very_dark_exp) { + /* very dark */ + if(cam->exposure_status == EXPOSURE_VERY_DARK) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_VERY_DARK; + cam->exposure_count = 1; + } + } else { + /* just dark */ + if(cam->exposure_status == EXPOSURE_DARK) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_DARK; + cam->exposure_count = 1; + } + } + } else if(old_exposure <= LOW_EXP || exp_acc > light_exp) { + /* light */ + if(old_exposure <= VERY_LOW_EXP) { + /* very light */ + if(cam->exposure_status == EXPOSURE_VERY_LIGHT) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_VERY_LIGHT; + cam->exposure_count = 1; + } + } else { + /* just light */ + if(cam->exposure_status == EXPOSURE_LIGHT) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_LIGHT; + cam->exposure_count = 1; + } + } + } else { + /* not dark or light */ + cam->exposure_status = EXPOSURE_NORMAL; + } + } + + framerate = cam->fps; + if(framerate > 30 || framerate < 1) + framerate = 1; + + if(!cam->params.flickerControl.disabled) { + /* Flicker control on */ + if((cam->exposure_status == EXPOSURE_VERY_DARK || + cam->exposure_status == EXPOSURE_DARK) && + cam->exposure_count >= DARK_TIME*framerate && + cam->params.sensorFps.divisor < 3) { + + /* dark for too long */ + ++cam->params.sensorFps.divisor; + cam->cmd_queue |= COMMAND_SETSENSORFPS; + + cam->params.flickerControl.coarseJump = + flicker_jumps[cam->mainsFreq] + [cam->params.sensorFps.baserate] + [cam->params.sensorFps.divisor]; + cam->cmd_queue |= COMMAND_SETFLICKERCTRL; + + new_exposure = cam->params.flickerControl.coarseJump-1; + while(new_exposure < old_exposure/2) + new_exposure += cam->params.flickerControl.coarseJump; + cam->params.exposure.coarseExpLo = new_exposure & 0xff; + cam->params.exposure.coarseExpHi = new_exposure >> 8; + cam->cmd_queue |= COMMAND_SETEXPOSURE; + cam->exposure_status = EXPOSURE_NORMAL; + LOG("Automatically decreasing sensor_fps\n"); + + } else if((cam->exposure_status == EXPOSURE_VERY_LIGHT || + cam->exposure_status == EXPOSURE_LIGHT) && + cam->exposure_count >= LIGHT_TIME*framerate && + cam->params.sensorFps.divisor > 0) { + + /* light for too long */ + int max_exp = FIRMWARE_VERSION(1,2) ? MAX_EXP_102 : MAX_EXP ; + + --cam->params.sensorFps.divisor; + cam->cmd_queue |= COMMAND_SETSENSORFPS; + + cam->params.flickerControl.coarseJump = + flicker_jumps[cam->mainsFreq] + [cam->params.sensorFps.baserate] + [cam->params.sensorFps.divisor]; + cam->cmd_queue |= COMMAND_SETFLICKERCTRL; + + new_exposure = cam->params.flickerControl.coarseJump-1; + while(new_exposure < 2*old_exposure && + new_exposure+ + cam->params.flickerControl.coarseJump < max_exp) + new_exposure += cam->params.flickerControl.coarseJump; + cam->params.exposure.coarseExpLo = new_exposure & 0xff; + cam->params.exposure.coarseExpHi = new_exposure >> 8; + cam->cmd_queue |= COMMAND_SETEXPOSURE; + cam->exposure_status = EXPOSURE_NORMAL; + LOG("Automatically increasing sensor_fps\n"); + } + } else { + /* Flicker control off */ + if((cam->exposure_status == EXPOSURE_VERY_DARK || + cam->exposure_status == EXPOSURE_DARK) && + cam->exposure_count >= DARK_TIME*framerate && + cam->params.sensorFps.divisor < 3) { + + /* dark for too long */ + ++cam->params.sensorFps.divisor; + cam->cmd_queue |= COMMAND_SETSENSORFPS; + + if(cam->params.exposure.gain > 0) { + --cam->params.exposure.gain; + cam->cmd_queue |= COMMAND_SETEXPOSURE; + } + cam->exposure_status = EXPOSURE_NORMAL; + LOG("Automatically decreasing sensor_fps\n"); + + } else if((cam->exposure_status == EXPOSURE_VERY_LIGHT || + cam->exposure_status == EXPOSURE_LIGHT) && + cam->exposure_count >= LIGHT_TIME*framerate && + cam->params.sensorFps.divisor > 0) { + + /* light for too long */ + --cam->params.sensorFps.divisor; + cam->cmd_queue |= COMMAND_SETSENSORFPS; + + if(cam->params.exposure.gain < + cam->params.exposure.gainMode-1) { + ++cam->params.exposure.gain; + cam->cmd_queue |= COMMAND_SETEXPOSURE; + } + cam->exposure_status = EXPOSURE_NORMAL; + LOG("Automatically increasing sensor_fps\n"); + } + } + up(&cam->param_lock); +} + +/*-----------------------------------------------------------------*/ +/* if flicker is switched off, this function switches it back on.It checks, + however, that conditions are suitable before restarting it. + This should only be called for firmware version 1.2. + + It also adjust the colour balance when an exposure step is detected - as + long as flicker is running +*/ +static void restart_flicker(struct cam_data *cam) +{ + int cam_exposure, old_exp; + if(!FIRMWARE_VERSION(1,2)) + return; + down(&cam->param_lock); + if(cam->params.flickerControl.flickerMode == 0 || + cam->raw_image[39] == 0) { + up(&cam->param_lock); + return; + } + cam_exposure = cam->raw_image[39]*2; + old_exp = cam->params.exposure.coarseExpLo + + cam->params.exposure.coarseExpHi*256; + /* + see how far away camera exposure is from a valid + flicker exposure value + */ + cam_exposure %= cam->params.flickerControl.coarseJump; + if(!cam->params.flickerControl.disabled && + cam_exposure <= cam->params.flickerControl.coarseJump - 3) { + /* Flicker control auto-disabled */ + cam->params.flickerControl.disabled = 1; + } + + if(cam->params.flickerControl.disabled && + cam->params.flickerControl.flickerMode && + old_exp > cam->params.flickerControl.coarseJump + + ROUND_UP_EXP_FOR_FLICKER) { + /* exposure is now high enough to switch + flicker control back on */ + set_flicker(&cam->params, &cam->cmd_queue, 1); + if((cam->cmd_queue & COMMAND_SETEXPOSURE) && + cam->params.exposure.expMode == 2) + cam->exposure_status = EXPOSURE_NORMAL; + + } + up(&cam->param_lock); +} +#undef FIRMWARE_VERSION + +static int clear_stall(struct cam_data *cam) +{ + /* FIXME: Does this actually work? */ + LOG("Clearing stall\n"); + + cam->ops->streamRead(cam->lowlevel_data, cam->raw_image, 0); + do_command(cam, CPIA_COMMAND_GetCameraStatus,0,0,0,0); + return cam->params.status.streamState != STREAM_PAUSED; +} + /* kernel thread function to read image from camera */ -static void fetch_frame(void *data) +static int fetch_frame(void *data) { int image_size, retry; struct cam_data *cam = (struct cam_data *)data; @@ -2179,41 +2832,54 @@ static void fetch_frame(void *data) /* load first frame always uncompressed */ if (cam->first_frame && - cam->params.compression.mode != CPIA_COMPRESSION_NONE) + cam->params.compression.mode != CPIA_COMPRESSION_NONE) { do_command(cam, CPIA_COMMAND_SetCompression, CPIA_COMPRESSION_NONE, NO_DECIMATION, 0, 0); + /* Trial & error - Discarding a frame prevents the + first frame from having an error in the data. */ + do_command(cam, CPIA_COMMAND_DiscardFrame, 0, 0, 0, 0); + } /* init camera upload */ - if (do_command(cam, CPIA_COMMAND_SetGrabMode, - CPIA_GRAB_CONTINUOUS, 0, 0, 0)) - continue; - if (do_command(cam, CPIA_COMMAND_GrabFrame, 0, cam->params.streamStartLine, 0, 0)) continue; if (cam->ops->wait_for_stream_ready) { /* loop until image ready */ + int count = 0; do_command(cam, CPIA_COMMAND_GetCameraStatus,0,0,0,0); while (cam->params.status.streamState != STREAM_READY) { + if(++count > READY_TIMEOUT) + break; + if(cam->params.status.streamState == + STREAM_PAUSED) { + /* Bad news */ + if(!clear_stall(cam)) + return -EIO; + } + cond_resched(); + /* sleep for 10 ms, hopefully ;) */ current->state = TASK_INTERRUPTIBLE; - /* sleep for 10 ms, hopefully ;) */ schedule_timeout(10*HZ/1000); if (signal_pending(current)) - return; + return -EINTR; do_command(cam, CPIA_COMMAND_GetCameraStatus, 0, 0, 0, 0); } + if(cam->params.status.streamState != STREAM_READY) { + continue; + } } - /* grab image from camera */ cond_resched(); + /* grab image from camera */ oldjif = jiffies; image_size = cam->ops->streamRead(cam->lowlevel_data, cam->raw_image, 0); @@ -2227,6 +2893,14 @@ static void fetch_frame(void *data) cam->transfer_rate = diff==0 ? rate : rate/diff; /* diff==0 ? unlikely but possible */ + /* Switch flicker control back on if it got turned off */ + restart_flicker(cam); + + /* If AEC is enabled, monitor the exposure and + adjust the sensor frame rate if needed */ + if(cam->params.exposure.expMode == 2) + monitor_exposure(cam); + /* camera idle now so dispatch queued commands */ dispatch_commands(cam); @@ -2238,12 +2912,28 @@ static void fetch_frame(void *data) /* decompress and convert image to by copying it from * raw_image to decompressed_frame */ + cond_resched(); cam->image_size = parse_picture(cam, image_size); - if (cam->image_size <= 0) + if (cam->image_size <= 0) { DBG("parse_picture failed %d\n", cam->image_size); - else + if(cam->params.compression.mode != + CPIA_COMPRESSION_NONE) { + /* Compression may not work right if we + had a bad frame, get the next one + uncompressed. */ + cam->first_frame = 1; + do_command(cam, CPIA_COMMAND_SetGrabMode, + CPIA_GRAB_SINGLE, 0, 0, 0); + /* FIXME: Trial & error - need up to 70ms for + the grab mode change to complete ? */ + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(70*HZ / 1000); + if (signal_pending(current)) + return -EINTR; + } + } else break; } @@ -2257,66 +2947,51 @@ static void fetch_frame(void *data) } else cam->decompressed_frame.state = FRAME_DONE; -#if 0 - if (cam->first_frame && - cam->params.compression.mode != CPIA_COMPRESSION_NONE) { - cam->first_frame = 0; - cam->cmd_queue |= COMMAND_SETCOMPRESSION; - } -#else if (cam->first_frame) { cam->first_frame = 0; - cam->cmd_queue |= COMMAND_SETCOMPRESSION; - cam->cmd_queue |= COMMAND_SETEXPOSURE; + do_command(cam, CPIA_COMMAND_SetCompression, + cam->params.compression.mode, + cam->params.compression.decimation, 0, 0); + + /* Switch from single-grab to continuous grab */ + do_command(cam, CPIA_COMMAND_SetGrabMode, + CPIA_GRAB_CONTINUOUS, 0, 0, 0); } -#endif + return 0; } + return -EIO; } static int capture_frame(struct cam_data *cam, struct video_mmap *vm) { - int retval = 0; - if (!cam->frame_buf) { /* we do lazy allocation */ - if ((retval = allocate_frame_buf(cam))) - return retval; + int err; + if ((err = allocate_frame_buf(cam))) + return err; } - /* FIXME: the first frame seems to be captured by the camera - without regards to any initial settings, so we throw away - that one, the next one is generated with our settings - (exposure, color balance, ...) - */ - if (cam->first_frame) { - cam->curframe = vm->frame; - cam->frame[cam->curframe].state = FRAME_READY; - fetch_frame(cam); - if (cam->frame[cam->curframe].state != FRAME_DONE) - retval = -EIO; - } cam->curframe = vm->frame; cam->frame[cam->curframe].state = FRAME_READY; - fetch_frame(cam); - if (cam->frame[cam->curframe].state != FRAME_DONE) - retval=-EIO; - - return retval; + return fetch_frame(cam); } static int goto_high_power(struct cam_data *cam) { if (do_command(cam, CPIA_COMMAND_GotoHiPower, 0, 0, 0, 0)) - return -1; - mdelay(100); /* windows driver does it too */ + return -EIO; + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(40*HZ/1000); /* windows driver does it too */ + if(signal_pending(current)) + return -EINTR; if (do_command(cam, CPIA_COMMAND_GetCameraStatus, 0, 0, 0, 0)) - return -1; + return -EIO; if (cam->params.status.systemState == HI_POWER_STATE) { DBG("camera now in HIGH power state\n"); return 0; } printstatus(cam); - return -1; + return -EIO; } static int goto_low_power(struct cam_data *cam) @@ -2335,8 +3010,10 @@ static int goto_low_power(struct cam_data *cam) static void save_camera_state(struct cam_data *cam) { - do_command(cam, CPIA_COMMAND_GetColourBalance, 0, 0, 0, 0); - do_command(cam, CPIA_COMMAND_GetExposure, 0, 0, 0, 0); + if(!(cam->cmd_queue & COMMAND_SETCOLOURBALANCE)) + do_command(cam, CPIA_COMMAND_GetColourBalance, 0, 0, 0, 0); + if(!(cam->cmd_queue & COMMAND_SETEXPOSURE)) + do_command(cam, CPIA_COMMAND_GetExposure, 0, 0, 0, 0); DBG("%d/%d/%d/%d/%d/%d/%d/%d\n", cam->params.exposure.gain, @@ -2353,44 +3030,8 @@ static void save_camera_state(struct cam_data *cam) cam->params.colourBalance.blueGain); } -static void set_camera_state(struct cam_data *cam) +static int set_camera_state(struct cam_data *cam) { - if(cam->params.colourBalance.balanceModeIsAuto) { - do_command(cam, CPIA_COMMAND_SetColourBalance, - 2, 0, 0, 0); - } else { - do_command(cam, CPIA_COMMAND_SetColourBalance, - 1, - cam->params.colourBalance.redGain, - cam->params.colourBalance.greenGain, - cam->params.colourBalance.blueGain); - do_command(cam, CPIA_COMMAND_SetColourBalance, - 3, 0, 0, 0); - } - - - do_command_extended(cam, CPIA_COMMAND_SetExposure, - cam->params.exposure.gainMode, 1, 1, - cam->params.exposure.centreWeight, - cam->params.exposure.gain, - cam->params.exposure.fineExp, - cam->params.exposure.coarseExpLo, - cam->params.exposure.coarseExpHi, - cam->params.exposure.redComp, - cam->params.exposure.green1Comp, - cam->params.exposure.green2Comp, - cam->params.exposure.blueComp); - do_command_extended(cam, CPIA_COMMAND_SetExposure, - 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0); - - if (!cam->params.exposure.gainMode) - cam->params.exposure.gainMode = 2; - if (!cam->params.exposure.expMode) - cam->params.exposure.expMode = 2; - if (!cam->params.exposure.centreWeight) - cam->params.exposure.centreWeight = 1; - cam->cmd_queue = COMMAND_SETCOMPRESSION | COMMAND_SETCOMPRESSIONTARGET | COMMAND_SETCOLOURPARAMS | @@ -2398,18 +3039,29 @@ static void set_camera_state(struct cam_data *cam) COMMAND_SETYUVTHRESH | COMMAND_SETECPTIMING | COMMAND_SETCOMPRESSIONPARAMS | -#if 0 COMMAND_SETEXPOSURE | -#endif COMMAND_SETCOLOURBALANCE | COMMAND_SETSENSORFPS | COMMAND_SETAPCOR | COMMAND_SETFLICKERCTRL | COMMAND_SETVLOFFSET; + + do_command(cam, CPIA_COMMAND_SetGrabMode, CPIA_GRAB_SINGLE,0,0,0); dispatch_commands(cam); + + /* Wait 6 frames for the sensor to get all settings and + AEC/ACB to settle */ + current->state = TASK_INTERRUPTIBLE; + schedule_timeout((6*(cam->params.sensorFps.baserate ? 33 : 40) * + (1 << cam->params.sensorFps.divisor) + 10) * + HZ / 1000); + + if(signal_pending(current)) + return -EINTR; + save_camera_state(cam); - return; + return 0; } static void get_version_information(struct cam_data *cam) @@ -2424,14 +3076,16 @@ static void get_version_information(struct cam_data *cam) /* initialize camera */ static int reset_camera(struct cam_data *cam) { + int err; /* Start the camera in low power mode */ if (goto_low_power(cam)) { if (cam->params.status.systemState != WARM_BOOT_STATE) return -ENODEV; /* FIXME: this is just dirty trial and error */ - reset_camera_struct(cam); - goto_high_power(cam); + err = goto_high_power(cam); + if(err) + return err; do_command(cam, CPIA_COMMAND_DiscardFrame, 0, 0, 0, 0); if (goto_low_power(cam)) return -ENODEV; @@ -2439,12 +3093,18 @@ static int reset_camera(struct cam_data *cam) /* procedure described in developer's guide p3-28 */ - /* Check the firmware version FIXME: should we check PNPID? */ + /* Check the firmware version. */ cam->params.version.firmwareVersion = 0; get_version_information(cam); if (cam->params.version.firmwareVersion != 1) return -ENODEV; + /* A bug in firmware 1-02 limits gainMode to 2 */ + if(cam->params.version.firmwareRevision <= 2 && + cam->params.exposure.gainMode > 2) { + cam->params.exposure.gainMode = 2; + } + /* set QX3 detected flag */ cam->params.qx3.qx3_detected = (cam->params.pnpID.vendor == 0x0813 && cam->params.pnpID.product == 0x0001); @@ -2458,8 +3118,9 @@ static int reset_camera(struct cam_data *cam) STREAM_NOT_READY, 0); /* GotoHiPower */ - if (goto_high_power(cam)) - return -ENODEV; + err = goto_high_power(cam); + if (err) + return err; /* Check the camera status */ if (do_command(cam, CPIA_COMMAND_GetCameraStatus, 0, 0, 0, 0)) @@ -2492,9 +3153,13 @@ static int reset_camera(struct cam_data *cam) do_command(cam, CPIA_COMMAND_GetVPVersion, 0, 0, 0, 0); /* set camera to a known state */ - set_camera_state(cam); - - return 0; + return set_camera_state(cam); +} + +static void put_cam(struct cpia_camera_ops* ops) +{ + if (ops->owner) + __MOD_DEC_USE_COUNT(ops->owner); } /* ------------------------- V4L interface --------------------- */ @@ -2508,7 +3173,10 @@ static int cpia_open(struct inode *inode, struct file *file) DBG("Internal error, cam_data not found!\n"); return -ENODEV; } - + + if (!try_inc_mod_count(cam->ops->owner)) + return -ENODEV; + down(&cam->busy_lock); err = -EBUSY; if (cam->open_count > 0) { @@ -2522,7 +3190,7 @@ static int cpia_open(struct inode *inode, struct file *file) if (!cam->raw_image) goto oops; } - + if (!cam->decompressed_frame.data) { cam->decompressed_frame.data = rvmalloc(CPIA_MAX_FRAME_SIZE); if (!cam->decompressed_frame.data) @@ -2539,6 +3207,9 @@ static int cpia_open(struct inode *inode, struct file *file) cam->ops->close(cam->lowlevel_data); goto oops; } + + if(signal_pending(current)) + return -EINTR; /* Set ownership of /proc/cpia/videoX to current user */ if(cam->proc_entry) @@ -2552,6 +3223,7 @@ static int cpia_open(struct inode *inode, struct file *file) ++cam->open_count; file->private_data = dev; + up(&cam->busy_lock); return 0; oops: @@ -2564,6 +3236,7 @@ static int cpia_open(struct inode *inode, struct file *file) cam->raw_image = NULL; } up(&cam->busy_lock); + put_cam(cam->ops); return err; } @@ -2591,6 +3264,8 @@ static int cpia_close(struct inode *inode, struct file *file) /* close cpia */ cam->ops->close(cam->lowlevel_data); + + put_cam(cam->ops); } if (--cam->open_count == 0) { @@ -2621,6 +3296,7 @@ static int cpia_read(struct file *file, char *buf, { struct video_device *dev = file->private_data; struct cam_data *cam = dev->priv; + int err; /* make this _really_ smp and multithread-safe */ if (down_interruptible(&cam->busy_lock)) @@ -2647,19 +3323,17 @@ static int cpia_read(struct file *file, char *buf, /* upload frame */ cam->decompressed_frame.state = FRAME_READY; cam->mmap_kludge=0; - fetch_frame(cam); - if (cam->decompressed_frame.state != FRAME_DONE) { - DBG("upload failed %d/%d\n", cam->decompressed_frame.count, - cam->decompressed_frame.state); + if((err = fetch_frame(cam)) != 0) { + DBG("ERROR from fetch_frame: %d\n", err); up(&cam->busy_lock); - return -EIO; + return err; } cam->decompressed_frame.state = FRAME_UNUSED; /* copy data to user space */ if (cam->decompressed_frame.count > count) { DBG("count wrong: %d, %lu\n", cam->decompressed_frame.count, - count); + (unsigned long) count); up(&cam->busy_lock); return -EFAULT; } @@ -2698,7 +3372,7 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, DBG("VIDIOCGCAP\n"); strcpy(b->name, "CPiA Camera"); - b->type = VID_TYPE_CAPTURE; + b->type = VID_TYPE_CAPTURE | VID_TYPE_SUBCAPTURE; b->channels = 1; b->audios = 0; b->maxwidth = 352; /* VIDEOSIZE_CIF */ @@ -2754,8 +3428,8 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, DBG("VIDIOCSPICT\n"); /* check validity */ - DBG("palette: %d\n", vp.palette); - DBG("depth: %d\n", vp.depth); + DBG("palette: %d\n", vp->palette); + DBG("depth: %d\n", vp->depth); if (!valid_mode(vp->palette, vp->depth)) { retval = -EINVAL; break; @@ -2825,6 +3499,10 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, break; } cam->video_size = video_size; + + /* video size is changing, reset the subcapture area */ + memset(&cam->vc, 0, sizeof(cam->vc)); + set_vw_size(cam); DBG("%d / %d\n", cam->vw.width, cam->vw.height); cam->cmd_queue |= COMMAND_SETFORMAT; @@ -2904,6 +3582,10 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, } if (video_size != cam->video_size) { cam->video_size = video_size; + + /* video size is changing, reset the subcapture area */ + memset(&cam->vc, 0, sizeof(cam->vc)); + set_vw_size(cam); cam->cmd_queue |= COMMAND_SETFORMAT; dispatch_commands(cam); @@ -2946,6 +3628,77 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, break; } + case VIDIOCGCAPTURE: + DBG("VIDIOCGCAPTURE\n"); + if (copy_to_user(arg, &cam->vc, sizeof(struct video_capture))) + retval = -EFAULT; + break; + + case VIDIOCSCAPTURE: + { + struct video_capture vc; + + DBG("VIDIOCSCAPTURE\n"); + if (copy_from_user(&vc, arg, sizeof(vc))) { + retval = -EFAULT; + break; + } + + if (vc.decimation != 0) { /* How should this be used? */ + retval = -EINVAL; + break; + } + if (vc.flags != 0) { /* Even/odd grab not supported */ + retval = -EINVAL; + break; + } + + /* Clip to the resolution we can set for the ROI + (every 8 columns and 4 rows) */ + vc.x = vc.x & ~(__u32)7; + vc.y = vc.y & ~(__u32)3; + vc.width = vc.width & ~(__u32)7; + vc.height = vc.height & ~(__u32)3; + + if(vc.width == 0 || vc.height == 0 || + vc.x + vc.width > cam->vw.width || + vc.y + vc.height > cam->vw.height) { + retval = -EINVAL; + break; + } + + DBG("%d,%d/%dx%d\n", vc.x,vc.y,vc.width, vc.height); + + down(&cam->param_lock); + + cam->vc.x = vc.x; + cam->vc.y = vc.y; + cam->vc.width = vc.width; + cam->vc.height = vc.height; + + set_vw_size(cam); + cam->cmd_queue |= COMMAND_SETFORMAT; + + up(&cam->param_lock); + + /* setformat ignored by camera during streaming, + * so stop/dispatch/start */ + dispatch_commands(cam); + break; + } + + case VIDIOCGUNIT: + { + struct video_unit vu; + vu.video = cam->vdev.minor; + vu.vbi = VIDEO_NO_UNIT; + vu.radio = VIDEO_NO_UNIT; + vu.audio = VIDEO_NO_UNIT; + vu.teletext = VIDEO_NO_UNIT; + break; + } + + /* pointless to implement overlay with this camera */ case VIDIOCCAPTURE: case VIDIOCGFBUF: @@ -2966,7 +3719,6 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file, break; } - up(&cam->param_lock); up(&cam->busy_lock); return retval; } @@ -3057,7 +3809,7 @@ static void reset_camera_struct(struct cam_data *cam) cam->params.colourParams.brightness = 50; cam->params.colourParams.contrast = 48; cam->params.colourParams.saturation = 50; - cam->params.exposure.gainMode = 2; + cam->params.exposure.gainMode = 4; cam->params.exposure.expMode = 2; /* AEC */ cam->params.exposure.compMode = 1; cam->params.exposure.centreWeight = 1; @@ -3065,27 +3817,31 @@ static void reset_camera_struct(struct cam_data *cam) cam->params.exposure.fineExp = 0; cam->params.exposure.coarseExpLo = 185; cam->params.exposure.coarseExpHi = 0; - cam->params.exposure.redComp = 220; - cam->params.exposure.green1Comp = 214; - cam->params.exposure.green2Comp = 214; - cam->params.exposure.blueComp = 230; - cam->params.colourBalance.balanceModeIsAuto = 1; + cam->params.exposure.redComp = COMP_RED; + cam->params.exposure.green1Comp = COMP_GREEN1; + cam->params.exposure.green2Comp = COMP_GREEN2; + cam->params.exposure.blueComp = COMP_BLUE; + cam->params.colourBalance.balanceMode = 2; /* ACB */ cam->params.colourBalance.redGain = 32; cam->params.colourBalance.greenGain = 6; cam->params.colourBalance.blueGain = 92; - cam->params.apcor.gain1 = 0x1c; - cam->params.apcor.gain2 = 0x1a; - cam->params.apcor.gain4 = 0x2d; - cam->params.apcor.gain8 = 0x2a; + cam->params.apcor.gain1 = 0x18; + cam->params.apcor.gain2 = 0x16; + cam->params.apcor.gain4 = 0x24; + cam->params.apcor.gain8 = 0x34; cam->params.flickerControl.flickerMode = 0; + cam->params.flickerControl.disabled = 1; + cam->params.flickerControl.coarseJump = flicker_jumps[cam->mainsFreq] [cam->params.sensorFps.baserate] [cam->params.sensorFps.divisor]; - cam->params.vlOffset.gain1 = 24; - cam->params.vlOffset.gain2 = 28; - cam->params.vlOffset.gain4 = 30; - cam->params.vlOffset.gain8 = 30; + cam->params.flickerControl.allowableOverExposure = + -find_over_exposure(cam->params.colourParams.brightness); + cam->params.vlOffset.gain1 = 20; + cam->params.vlOffset.gain2 = 24; + cam->params.vlOffset.gain4 = 26; + cam->params.vlOffset.gain8 = 26; cam->params.compressionParams.hysteresis = 3; cam->params.compressionParams.threshMax = 11; cam->params.compressionParams.smallStep = 1; @@ -3097,6 +3853,7 @@ static void reset_camera_struct(struct cam_data *cam) /* End of default values from Software Developer's Guide */ cam->transfer_rate = 0; + cam->exposure_status = EXPOSURE_NORMAL; /* Set Sensor FPS to 15fps. This seems better than 30fps * for indoor lighting. */ @@ -3131,17 +3888,21 @@ static void reset_camera_struct(struct cam_data *cam) cam->vp.depth = 24; /* to be set by user */ cam->vp.palette = VIDEO_PALETTE_RGB24; /* to be set by user */ + cam->vc.x = 0; + cam->vc.y = 0; + cam->vc.width = 0; + cam->vc.height = 0; + cam->vw.x = 0; cam->vw.y = 0; set_vw_size(cam); cam->vw.chromakey = 0; - /* PP NOTE: my extension to use vw.flags for this, bear it! */ cam->vw.flags = 0; cam->vw.clipcount = 0; cam->vw.clips = NULL; cam->cmd_queue = COMMAND_NONE; - cam->first_frame = 0; + cam->first_frame = 1; return; } diff --git a/drivers/media/video/cpia.h b/drivers/media/video/cpia.h index 7929e4926a91..721af46a4c3b 100644 --- a/drivers/media/video/cpia.h +++ b/drivers/media/video/cpia.h @@ -26,13 +26,13 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#define CPIA_MAJ_VER 0 -#define CPIA_MIN_VER 8 -#define CPIA_PATCH_VER 1 +#define CPIA_MAJ_VER 1 +#define CPIA_MIN_VER 2 +#define CPIA_PATCH_VER 2 -#define CPIA_PP_MAJ_VER 0 -#define CPIA_PP_MIN_VER 8 -#define CPIA_PP_PATCH_VER 1 +#define CPIA_PP_MAJ_VER 1 +#define CPIA_PP_MIN_VER 2 +#define CPIA_PP_PATCH_VER 2 #define CPIA_MAX_FRAME_SIZE_UNALIGNED (352 * 288 * 4) /* CIF at RGB32 */ #define CPIA_MAX_FRAME_SIZE ((CPIA_MAX_FRAME_SIZE_UNALIGNED + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)) /* align above to PAGE_SIZE */ @@ -93,6 +93,11 @@ struct cpia_camera_ops * is STREAM_READY before calling streamRead. */ int wait_for_stream_ready; + + /* + * Used to maintain lowlevel module usage counts + */ + struct module *owner; }; struct cpia_frame { @@ -150,7 +155,7 @@ struct cam_params { u8 blueComp; } exposure; struct { - u8 balanceModeIsAuto; + u8 balanceMode; u8 redGain; u8 greenGain; u8 blueGain; @@ -166,9 +171,10 @@ struct cam_params { u8 gain8; } apcor; struct { + u8 disabled; u8 flickerMode; u8 coarseJump; - u8 allowableOverExposure; + int allowableOverExposure; } flickerControl; struct { u8 gain1; @@ -261,6 +267,7 @@ struct cam_data { struct video_device vdev; /* v4l videodev */ struct video_picture vp; /* v4l camera settings */ struct video_window vw; /* v4l capture area */ + struct video_capture vc; /* v4l subcapture area */ /* mmap interface */ int curframe; /* the current frame to grab into */ @@ -271,6 +278,8 @@ struct cam_data { int first_frame; int mmap_kludge; /* 'wrong' byte order for mmap */ volatile u32 cmd_queue; /* queued commands */ + int exposure_status; /* EXPOSURE_* */ + int exposure_count; /* number of frames at this status */ }; /* cpia_register_camera is called by low level driver for each camera. @@ -382,15 +391,27 @@ void cpia_unregister_camera(struct cam_data *cam); #define VP_STATE_ACB_RMAX 0x40 #define VP_STATE_ACB_GMAX 0x80 +/* default (minimum) compensation values */ +#define COMP_RED 220 +#define COMP_GREEN1 214 +#define COMP_GREEN2 COMP_GREEN1 +#define COMP_BLUE 230 + +/* exposure status */ +#define EXPOSURE_VERY_LIGHT 0 +#define EXPOSURE_LIGHT 1 +#define EXPOSURE_NORMAL 2 +#define EXPOSURE_DARK 3 +#define EXPOSURE_VERY_DARK 4 + /* ErrorCode */ #define ERROR_FLICKER_BELOW_MIN_EXP 0x01 /*flicker exposure got below minimum exposure */ - #define ALOG(fmt,args...) printk(fmt, ##args) #define LOG(fmt,args...) ALOG(KERN_INFO __FILE__ ":%s(%d):" fmt, __FUNCTION__ , __LINE__ , ##args) #ifdef _CPIA_DEBUG_ -#define ADBG(lineno,fmt,args...) printk(fmt, jiffies, lineno, ##args) -#define DBG(fmt,args...) ADBG((__LINE__), KERN_DEBUG __FILE__" (%ld):" __FUNCTION__ "(%d):" fmt, ##args) +#define ADBG(fmt,args...) printk(fmt, jiffies, ##args) +#define DBG(fmt,args...) ADBG(KERN_DEBUG __FILE__" (%ld):%s(%d):" fmt, __FUNCTION__, __LINE__ , ##args) #else #define DBG(fmn,args...) do {} while(0) #endif @@ -400,15 +421,19 @@ void cpia_unregister_camera(struct cam_data *cam); (p)&0x80?1:0, (p)&0x40?1:0, (p)&0x20?1:0, (p)&0x10?1:0,\ (p)&0x08?1:0, (p)&0x04?1:0, (p)&0x02?1:0, (p)&0x01?1:0); -static inline void cpia_add_to_list(struct cam_data* l, struct cam_data* drv) +static inline void cpia_add_to_list(struct cam_data** l, struct cam_data** drv_p) { - drv->next = l; - drv->previous = &l; - l = drv; + struct cam_data* drv; + drv = *drv_p; + drv->next = *l; + drv->previous = l; + *l = drv; } -static inline void cpia_remove_from_list(struct cam_data* drv) +static inline void cpia_remove_from_list(struct cam_data** drv_p) { + struct cam_data* drv; + drv = *drv_p; if (drv->previous != NULL) { if (drv->next != NULL) drv->next->previous = drv->previous; diff --git a/drivers/media/video/cpia_pp.c b/drivers/media/video/cpia_pp.c index 0deb614dc11e..1e6902dc7936 100644 --- a/drivers/media/video/cpia_pp.c +++ b/drivers/media/video/cpia_pp.c @@ -157,7 +157,8 @@ static struct cpia_camera_ops cpia_pp_ops = cpia_pp_streamStop, cpia_pp_streamRead, cpia_pp_close, - 1 + 1, + THIS_MODULE }; static struct cam_data *cam_list; @@ -565,7 +566,7 @@ static int cpia_pp_register(struct parport *port) return -ENXIO; } spin_lock( &cam_list_lock_pp ); - cpia_add_to_list(cam_list, cpia); + cpia_add_to_list(&cam_list, &cpia); spin_unlock( &cam_list_lock_pp ); return 0; @@ -575,11 +576,11 @@ static void cpia_pp_detach (struct parport *port) { struct cam_data *cpia; - spin_lock( &cam_list_lock_pp ); for(cpia = cam_list; cpia != NULL; cpia = cpia->next) { struct pp_cam_entry *cam = cpia->lowlevel_data; if (cam && cam->port->number == port->number) { - cpia_remove_from_list(cpia); + spin_lock( &cam_list_lock_pp ); + cpia_remove_from_list(&cpia); spin_unlock( &cam_list_lock_pp ); cpia_unregister_camera(cpia); diff --git a/drivers/media/video/cpia_usb.c b/drivers/media/video/cpia_usb.c index aae71451aeb7..3a68e91717de 100644 --- a/drivers/media/video/cpia_usb.c +++ b/drivers/media/video/cpia_usb.c @@ -100,7 +100,8 @@ static struct cpia_camera_ops cpia_usb_ops = { cpia_usb_streamStop, cpia_usb_streamRead, cpia_usb_close, - 0 + 0, + THIS_MODULE }; static struct cam_data *cam_list; @@ -548,7 +549,7 @@ static int cpia_probe(struct usb_interface *intf, } spin_lock( &cam_list_lock_usb ); - cpia_add_to_list(cam_list, cam); + cpia_add_to_list(&cam_list, &cam); spin_unlock( &cam_list_lock_usb ); dev_set_drvdata(&intf->dev, cam); @@ -602,7 +603,7 @@ static void cpia_disconnect(struct usb_interface *intf) ucpia = (struct usb_cpia *) cam->lowlevel_data; spin_lock( &cam_list_lock_usb ); - cpia_remove_from_list(cam); + cpia_remove_from_list(&cam); spin_unlock( &cam_list_lock_usb ); /* Don't even try to reset the altsetting if we're disconnected */ diff --git a/drivers/media/video/planb.c b/drivers/media/video/planb.c index 45288bfa7e78..84795ecae31f 100644 --- a/drivers/media/video/planb.c +++ b/drivers/media/video/planb.c @@ -41,7 +41,6 @@ #include <linux/mm.h> #include <linux/sched.h> #include <linux/wrapper.h> -#include <linux/tqueue.h> #include <linux/videodev.h> #include <asm/uaccess.h> #include <asm/io.h> diff --git a/drivers/media/video/w9966.c b/drivers/media/video/w9966.c index c475ca9b69c0..c98970e20504 100644 --- a/drivers/media/video/w9966.c +++ b/drivers/media/video/w9966.c @@ -130,7 +130,7 @@ static const char* pardev[] = {[0 ... W9966_MAXCAMS] = "aggressive"}; MODULE_PARM(pardev, "1-" __MODULE_STRING(W9966_MAXCAMS) "s"); MODULE_PARM_DESC(pardev, "pardev: where to search for\n\ \teach camera. 'aggressive' means brute-force search.\n\ -\tEg: >pardev=parport3,aggressive,parport2,parport1< would assign +\tEg: >pardev=parport3,aggressive,parport2,parport1< would assign\n\ \tcam 1 to parport3 and search every parport for cam 2 etc..."); static int parmode = 0; diff --git a/drivers/message/fusion/mptlan.h b/drivers/message/fusion/mptlan.h index d4c4d6572ef0..6fed65aa7938 100644 --- a/drivers/message/fusion/mptlan.h +++ b/drivers/message/fusion/mptlan.h @@ -8,6 +8,7 @@ #include <linux/module.h> #endif +#include <linux/version.h> #include <linux/netdevice.h> #include <linux/errno.h> // #include <linux/etherdevice.h> diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index cf6d0dc3237c..85a5bfff797b 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c @@ -1295,10 +1295,6 @@ mptscsih_detect(Scsi_Host_Template *tpnt) #endif sh->this_id = this->pfacts[portnum].PortSCSIID; - /* OS entry to allow host drivers to force - * a queue depth on a per device basis. - */ - sh->select_queue_depths = mptscsih_select_queue_depths; /* Required entry. */ sh->unique_id = this->id; @@ -3668,23 +3664,15 @@ mptscsih_bios_param(Disk * disk, kdev_t dev, int *ip) * Called once per device the bus scan. Use it to force the queue_depth * member to 1 if a device does not support Q tags. */ -void -mptscsih_select_queue_depths(struct Scsi_Host *sh, Scsi_Device *sdList) +int +mptscsih_slave_attach(Scsi_Device *device) { - struct scsi_device *device; + struct Scsi_Host *host = device->host; VirtDevice *pTarget; MPT_SCSI_HOST *hd; int ii, max; - for (device = sdList; device != NULL; device = device->next) { - - if (device->host != sh) - continue; - - hd = (MPT_SCSI_HOST *) sh->hostdata; - if (hd == NULL) - continue; - + hd = (MPT_SCSI_HOST *)host->hostdata; if (hd->Targets != NULL) { if (hd->is_spi) max = MPT_MAX_SCSI_DEVICES; @@ -3694,11 +3682,11 @@ mptscsih_select_queue_depths(struct Scsi_Host *sh, Scsi_Device *sdList) for (ii=0; ii < max; ii++) { pTarget = hd->Targets[ii]; if (pTarget && !(pTarget->tflags & MPT_TARGET_FLAGS_Q_YES)) { - device->queue_depth = 1; - } + scsi_adjust_queue_depth(device, 0, 1); } } } + return 0; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ diff --git a/drivers/message/fusion/mptscsih.h b/drivers/message/fusion/mptscsih.h index 0c797847857e..1ede5feae672 100644 --- a/drivers/message/fusion/mptscsih.h +++ b/drivers/message/fusion/mptscsih.h @@ -206,11 +206,11 @@ struct mptscsih_driver_setup #define x_scsi_dev_reset mptscsih_dev_reset #define x_scsi_host_reset mptscsih_host_reset #define x_scsi_bios_param mptscsih_bios_param -#define x_scsi_select_queue_depths mptscsih_select_queue_depths #define x_scsi_taskmgmt_bh mptscsih_taskmgmt_bh #define x_scsi_old_abort mptscsih_old_abort #define x_scsi_old_reset mptscsih_old_reset +#define x_scsi_slave_attach mptscsih_slave_attach /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* @@ -234,8 +234,8 @@ extern int x_scsi_bios_param(Disk *, struct block_device *, int *); #else extern int x_scsi_bios_param(Disk *, kdev_t, int *); #endif -extern void x_scsi_select_queue_depths(struct Scsi_Host *, Scsi_Device *); extern void x_scsi_taskmgmt_bh(void *); +extern int x_scsi_slave_attach(Scsi_Device *); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) #define PROC_SCSI_DECL @@ -248,53 +248,45 @@ extern void x_scsi_taskmgmt_bh(void *); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,1) #define MPT_SCSIHOST { \ - next: NULL, \ PROC_SCSI_DECL \ - name: "MPT SCSI Host", \ - detect: x_scsi_detect, \ - release: x_scsi_release, \ - info: x_scsi_info, \ - command: NULL, \ - queuecommand: x_scsi_queuecommand, \ - eh_strategy_handler: NULL, \ - eh_abort_handler: x_scsi_abort, \ - eh_device_reset_handler: x_scsi_dev_reset, \ - eh_bus_reset_handler: x_scsi_bus_reset, \ - eh_host_reset_handler: x_scsi_host_reset, \ - bios_param: x_scsi_bios_param, \ - can_queue: MPT_SCSI_CAN_QUEUE, \ - this_id: -1, \ - sg_tablesize: MPT_SCSI_SG_DEPTH, \ - max_sectors: MPT_SCSI_MAX_SECTORS, \ - cmd_per_lun: MPT_SCSI_CMD_PER_LUN, \ - unchecked_isa_dma: 0, \ - use_clustering: ENABLE_CLUSTERING, \ + .name = "MPT SCSI Host", \ + .detect = x_scsi_detect, \ + .release = x_scsi_release, \ + .info = x_scsi_info, \ + .queuecommand = x_scsi_queuecommand, \ + .slave_attach = x_scsi_slave_attach, \ + .eh_abort_handler = x_scsi_abort, \ + .eh_device_reset_handler = x_scsi_dev_reset, \ + .eh_bus_reset_handler = x_scsi_bus_reset, \ + .eh_host_reset_handler = x_scsi_host_reset, \ + .bios_param = x_scsi_bios_param, \ + .can_queue = MPT_SCSI_CAN_QUEUE, \ + .this_id = -1, \ + .sg_tablesize = MPT_SCSI_SG_DEPTH, \ + .max_sectors = MPT_SCSI_MAX_SECTORS, \ + .cmd_per_lun = MPT_SCSI_CMD_PER_LUN, \ + .use_clustering = ENABLE_CLUSTERING, \ } #else /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,1) */ #define MPT_SCSIHOST { \ - next: NULL, \ PROC_SCSI_DECL \ - name: "MPT SCSI Host", \ - detect: x_scsi_detect, \ - release: x_scsi_release, \ - info: x_scsi_info, \ - command: NULL, \ - queuecommand: x_scsi_queuecommand, \ - eh_strategy_handler: NULL, \ - eh_abort_handler: x_scsi_abort, \ - eh_device_reset_handler: x_scsi_dev_reset, \ - eh_bus_reset_handler: x_scsi_bus_reset, \ - eh_host_reset_handler: NULL, \ - bios_param: x_scsi_bios_param, \ - can_queue: MPT_SCSI_CAN_QUEUE, \ - this_id: -1, \ - sg_tablesize: MPT_SCSI_SG_DEPTH, \ - cmd_per_lun: MPT_SCSI_CMD_PER_LUN, \ - unchecked_isa_dma: 0, \ - use_clustering: ENABLE_CLUSTERING, \ - use_new_eh_code: 1 \ + .name = "MPT SCSI Host", \ + .detect = x_scsi_detect, \ + .release = x_scsi_release, \ + .info = x_scsi_info, \ + .queuecommand = x_scsi_queuecommand, \ + .eh_abort_handler = x_scsi_abort, \ + .eh_device_reset_handler = x_scsi_dev_reset, \ + .eh_bus_reset_handler = x_scsi_bus_reset, \ + .bios_param = x_scsi_bios_param, \ + .can_queue = MPT_SCSI_CAN_QUEUE, \ + .this_id = -1, \ + .sg_tablesize = MPT_SCSI_SG_DEPTH, \ + .cmd_per_lun = MPT_SCSI_CMD_PER_LUN, \ + .use_clustering = ENABLE_CLUSTERING, \ + .use_new_eh_code = 1 \ } #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,1) */ @@ -302,23 +294,20 @@ extern void x_scsi_taskmgmt_bh(void *); #else /* MPT_SCSI_USE_NEW_EH */ #define MPT_SCSIHOST { \ - next: NULL, \ PROC_SCSI_DECL \ - name: "MPT SCSI Host", \ - detect: x_scsi_detect, \ - release: x_scsi_release, \ - info: x_scsi_info, \ - command: NULL, \ - queuecommand: x_scsi_queuecommand, \ - abort: x_scsi_old_abort, \ - reset: x_scsi_old_reset, \ - bios_param: x_scsi_bios_param, \ - can_queue: MPT_SCSI_CAN_QUEUE, \ - this_id: -1, \ - sg_tablesize: MPT_SCSI_SG_DEPTH, \ - cmd_per_lun: MPT_SCSI_CMD_PER_LUN, \ - unchecked_isa_dma: 0, \ - use_clustering: ENABLE_CLUSTERING \ + .name = "MPT SCSI Host", \ + .detect = x_scsi_detect, \ + .release = x_scsi_release, \ + .info = x_scsi_info, \ + .queuecommand = x_scsi_queuecommand, \ + .abort = x_scsi_old_abort, \ + .reset = x_scsi_old_reset, \ + .bios_param = x_scsi_bios_param, \ + .can_queue = MPT_SCSI_CAN_QUEUE, \ + .this_id = -1, \ + .sg_tablesize = MPT_SCSI_SG_DEPTH, \ + .cmd_per_lun = MPT_SCSI_CMD_PER_LUN, \ + .use_clustering = ENABLE_CLUSTERING \ } #endif /* MPT_SCSI_USE_NEW_EH */ diff --git a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c index 08731b7c5977..718cd1a7caab 100644 --- a/drivers/message/i2o/i2o_block.c +++ b/drivers/message/i2o/i2o_block.c @@ -55,8 +55,6 @@ * Serial number scanning to find duplicates for FC multipathing */ -#error Please convert me to Documentation/DMA-mapping.txt - #include <linux/major.h> #include <linux/module.h> @@ -132,15 +130,12 @@ #define I2O_BSA_DSC_VOLUME_CHANGED 0x000D #define I2O_BSA_DSC_TIMEOUT 0x000E -#define I2O_UNIT(dev) (i2ob_dev[minor((dev)) & 0xf0]) #define I2O_LOCK(unit) (i2ob_dev[(unit)].req_queue->queue_lock) /* * Some of these can be made smaller later */ -static int i2ob_blksizes[MAX_I2OB<<4]; -static int i2ob_sizes[MAX_I2OB<<4]; static int i2ob_media_change_flag[MAX_I2OB]; static u32 i2ob_max_sectors[MAX_I2OB<<4]; @@ -166,6 +161,7 @@ struct i2ob_device int rcache; int wcache; int power; + int index; }; /* @@ -179,6 +175,9 @@ struct i2ob_request struct i2ob_request *next; struct request *req; int num; + int sg_dma_direction; + int sg_nents; + struct scatterlist sg_table[16]; }; /* @@ -259,6 +258,30 @@ static u32 i2ob_get(struct i2ob_device *dev) struct i2o_controller *c=dev->controller; return I2O_POST_READ32(c); } + +static int i2ob_build_sglist(struct i2ob_device *dev, struct i2ob_request *ireq) +{ + struct scatterlist *sg = ireq->sg_table; + int nents; + + nents = blk_rq_map_sg(dev->req_queue, ireq->req, ireq->sg_table); + + if (rq_data_dir(ireq->req) == READ) + ireq->sg_dma_direction = PCI_DMA_FROMDEVICE; + else + ireq->sg_dma_direction = PCI_DMA_TODEVICE; + + ireq->sg_nents = pci_map_sg(dev->controller->pdev, sg, nents, ireq->sg_dma_direction); + return ireq->sg_nents; +} + +void i2ob_free_sglist(struct i2ob_device *dev, struct i2ob_request *ireq) +{ + struct pci_dev *pdev = dev->controller->pdev; + struct scatterlist *sg = ireq->sg_table; + int nents = ireq->sg_nents; + pci_unmap_sg(pdev, sg, nents, ireq->sg_dma_direction); +} /** * i2ob_send - Turn a request into a message and send it @@ -273,8 +296,6 @@ static u32 i2ob_get(struct i2ob_device *dev) * * No cleanup is done by this interface. It is done on the interrupt side when the * reply arrives - * - * To Fix: Generate PCI maps of the buffers */ static int i2ob_send(u32 m, struct i2ob_device *dev, struct i2ob_request *ireq, int unit) @@ -285,15 +306,21 @@ static int i2ob_send(u32 m, struct i2ob_device *dev, struct i2ob_request *ireq, unsigned long mptr; u64 offset; struct request *req = ireq->req; - struct bio *bio = req->bio; int count = req->nr_sectors<<9; - unsigned long last = 0; - unsigned short size = 0; + struct scatterlist *sg; + int sgnum; + int i; // printk(KERN_INFO "i2ob_send called\n"); /* Map the message to a virtual address */ msg = c->mem_offset + m; + sgnum = i2ob_build_sglist(dev, ireq); + + /* FIXME: if we have no resources how should we get out of this */ + if(sgnum == 0) + BUG(); + /* * Build the message based on the request. */ @@ -313,34 +340,21 @@ static int i2ob_send(u32 m, struct i2ob_device *dev, struct i2ob_request *ireq, i2o_raw_writel(offset>>32, msg+28); mptr=msg+32; - if(req->cmd == READ) + sg = ireq->sg_table; + if(rq_data_dir(req) == READ) { DEBUG("READ\n"); i2o_raw_writel(I2O_CMD_BLOCK_READ<<24|HOST_TID<<12|tid, msg+4); - while(bio!=NULL) + for(i = sgnum; i > 0; i--) { - if(bio_to_phys(bio) == last) { - size += bio->bi_size; - last += bio->bi_size; - if(bio->bi_next) - i2o_raw_writel(0x10000000|(size), mptr-8); - else - __raw_writel(0xD0000000|(size), mptr-8); - } + if(i != 1) + i2o_raw_writel(0x10000000|sg_dma_len(sg), mptr); else - { - if(bio->bi_next) - i2o_raw_writel(0x10000000|bio->bi_size, mptr); - else - i2o_raw_writel(0xD0000000|bio->bi_size, mptr); - i2o_raw_writel(bio_to_phys(bio), mptr+4); - mptr += 8; - size = bio->bi_size; - last = bio_to_phys(bio) + size; - } - - count -= bio->bi_size; - bio = bio->bi_next; + i2o_raw_writel(0xD0000000|sg_dma_len(sg), mptr); + i2o_raw_writel(sg_dma_address(sg), mptr+4); + mptr += 8; + count -= sg_dma_len(sg); + sg++; } switch(dev->rcache) { @@ -359,34 +373,20 @@ static int i2ob_send(u32 m, struct i2ob_device *dev, struct i2ob_request *ireq, // printk("Reading %d entries %d bytes.\n", // mptr-msg-8, req->nr_sectors<<9); } - else if(req->cmd == WRITE) + else if(rq_data_dir(req) == WRITE) { DEBUG("WRITE\n"); i2o_raw_writel(I2O_CMD_BLOCK_WRITE<<24|HOST_TID<<12|tid, msg+4); - while(bio!=NULL) + for(i = sgnum; i > 0; i--) { - if(bio_to_phys(bio) == last) { - size += bio->bi_size; - last += bio->bi_size; - if(bio->bi_next) - i2o_raw_writel(0x14000000|(size), mptr-8); - else - i2o_raw_writel(0xD4000000|(size), mptr-8); - } + if(i != 1) + i2o_raw_writel(0x14000000|sg_dma_len(sg), mptr); else - { - if(bio->bi_next) - i2o_raw_writel(0x14000000|(bio->bi_size), mptr); - else - i2o_raw_writel(0xD4000000|(bio->bi_size), mptr); - i2o_raw_writel(bio_to_phys(bio), mptr+4); - mptr += 8; - size = bio->bi_size; - last = bio_to_phys(bio) + bio->bi_size; - } - - count -= bio->bi_size; - bio = bio->bi_next; + i2o_raw_writel(0xD4000000|sg_dma_len(sg), mptr); + i2o_raw_writel(sg_dma_address(sg), mptr+4); + mptr += 8; + count -= sg_dma_len(sg); + sg++; } switch(dev->wcache) @@ -502,7 +502,7 @@ static void i2o_block_reply(struct i2o_handler *h, struct i2o_controller *c, str /* Now flush the message by making it a NOP */ m[0]&=0x00FFFFFF; m[0]|=(I2O_CMD_UTIL_NOP)<<24; - i2o_post_message(c,virt_to_bus(m)); + i2o_post_message(c, ((unsigned long)m) - c->mem_offset); return; } @@ -594,6 +594,7 @@ static void i2o_block_reply(struct i2o_handler *h, struct i2o_controller *c, str * may be running polled controllers from a BH... */ + i2ob_free_sglist(dev, ireq); spin_lock_irqsave(I2O_LOCK(c->unit), flags); i2ob_unhook_request(ireq, c->unit); i2ob_end_request(ireq->req); @@ -715,7 +716,6 @@ static int i2ob_evt(void *dummy) i2ob_query_device(&i2ob_dev[unit], 0x0000, 4, &size, 8); spin_lock_irqsave(I2O_LOCK(unit), flags); - i2ob_sizes[unit] = (int)(size>>10); set_capacity(i2ob_disk[unit>>4], size>>9); spin_unlock_irqrestore(I2O_LOCK(unit), flags); break; @@ -782,7 +782,6 @@ static void i2ob_request(request_queue_t *q) { struct request *req; struct i2ob_request *ireq; - int unit; struct i2ob_device *dev; u32 m; @@ -796,9 +795,8 @@ static void i2ob_request(request_queue_t *q) if(req->rq_status == RQ_INACTIVE) return; - - unit = minor(req->rq_dev); - dev = &i2ob_dev[(unit&0xF0)]; + + dev = req->rq_disk->private_data; /* * Queue depths probably belong with some kind of @@ -828,7 +826,7 @@ static void i2ob_request(request_queue_t *q) i2ob_queues[dev->unit]->i2ob_qhead = ireq->next; ireq->req = req; - i2ob_send(m, dev, ireq, (unit&0xF0)); + i2ob_send(m, dev, ireq, (dev->unit&0xF0)); } } @@ -896,27 +894,19 @@ static void i2o_block_biosparam( static int i2ob_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - struct i2ob_device *dev; - int minor; + struct gendisk *disk = inode->i_bdev->bd_disk; + struct i2ob_device *dev = disk->private_data; /* Anyone capable of this syscall can do *real bad* things */ if (!capable(CAP_SYS_ADMIN)) return -EPERM; - if (!inode) - return -EINVAL; - minor = minor(inode->i_rdev); - if (minor >= (MAX_I2OB<<4)) - return -ENODEV; - - dev = &i2ob_dev[minor]; switch (cmd) { case HDIO_GETGEO: { struct hd_geometry g; - int u=minor >> 4; - i2o_block_biosparam(get_capacity(i2ob_disk[u]), - &g.cylinders, &g.heads, &g.sectors); + i2o_block_biosparam(get_capacity(disk), + &g.cylinders, &g.heads, &g.sectors); g.start = get_start_sect(inode->i_bdev); return copy_to_user((void *)arg,&g, sizeof(g))?-EFAULT:0; } @@ -945,13 +935,8 @@ static int i2ob_ioctl(struct inode *inode, struct file *file, static int i2ob_release(struct inode *inode, struct file *file) { - struct i2ob_device *dev; - int minor; - - minor = minor(inode->i_rdev); - if (minor >= (MAX_I2OB<<4)) - return -ENODEV; - dev = &i2ob_dev[(minor&0xF0)]; + struct gendisk *disk = inode->i_bdev->bd_disk; + struct i2ob_device *dev = disk->private_data; /* * This is to deail with the case of an application @@ -1022,15 +1007,8 @@ static int i2ob_release(struct inode *inode, struct file *file) static int i2ob_open(struct inode *inode, struct file *file) { - int minor; - struct i2ob_device *dev; - - if (!inode) - return -EINVAL; - minor = minor(inode->i_rdev); - if (minor >= MAX_I2OB<<4) - return -ENODEV; - dev=&i2ob_dev[(minor&0xF0)]; + struct gendisk *disk = inode->i_bdev->bd_disk; + struct i2ob_device *dev = disk->private_data; if(!dev->i2odev) return -ENODEV; @@ -1133,7 +1111,6 @@ static int i2ob_install_device(struct i2o_controller *c, struct i2o_device *d, i power = 0; i2ob_query_device(dev, 0x0000, 5, &flags, 4); i2ob_query_device(dev, 0x0000, 6, &status, 4); - i2ob_sizes[unit] = (int)(size>>10); set_capacity(i2ob_disk[unit>>4], size>>9); /* @@ -1146,14 +1123,18 @@ static int i2ob_install_device(struct i2o_controller *c, struct i2o_device *d, i for(i=unit;i<=unit+15;i++) { request_queue_t *q = i2ob_dev[unit].req_queue; - + int segments = (d->controller->status_block->inbound_frame_size - 7) / 2; + + if(segments > 16) + segments = 16; + i2ob_dev[i].power = power; /* Save power state */ i2ob_dev[unit].flags = flags; /* Keep the type info */ blk_queue_max_sectors(q, 96); /* 256 might be nicer but many controllers explode on 65536 or higher */ - blk_queue_max_phys_segments(q, (d->controller->status_block->inbound_frame_size - 7) / 2); - blk_queue_max_hw_segments(q, (d->controller->status_block->inbound_frame_size - 7) / 2); + blk_queue_max_phys_segments(q, segments); + blk_queue_max_hw_segments(q, segments); i2ob_dev[i].rcache = CACHE_SMARTFETCH; i2ob_dev[i].wcache = CACHE_WRITETHROUGH; @@ -1372,7 +1353,7 @@ static void i2ob_scan(int bios) printk(KERN_WARNING "Could not install I2O block device\n"); else { - add_disk(i2o_disk[scan_unit>>4]); + add_disk(i2ob_disk[scan_unit>>4]); scan_unit+=16; i2ob_dev_count++; @@ -1459,7 +1440,7 @@ void i2ob_new_device(struct i2o_controller *c, struct i2o_device *d) printk(KERN_ERR "i2o_block: Could not install new device\n"); else { - add_disk(i2o_disk[unit>>4]); + add_disk(i2ob_disk[unit>>4]); i2ob_dev_count++; i2o_device_notify_on(d, &i2o_block_handler); } @@ -1544,7 +1525,8 @@ void i2ob_del_device(struct i2o_controller *c, struct i2o_device *d) */ static int i2ob_media_change(struct gendisk *disk) { - int i = (int)disk->private_data; + struct i2ob_device *p = disk->private_data; + int i = p->index; if(i2ob_media_change_flag[i]) { i2ob_media_change_flag[i]=0; @@ -1555,9 +1537,8 @@ static int i2ob_media_change(struct gendisk *disk) static int i2ob_revalidate(struct gendisk *disk) { - int i = (int)disk->private_data; - return i2ob_install_device(i2ob_dev[i<<4].controller, - i2ob_dev[i<<4].i2odev, i<<4); + struct i2ob_device *p = disk->private_data; + return i2ob_install_device(p->controller, p->i2odev, p->index<<4); } /* @@ -1640,10 +1621,9 @@ static int i2o_block_init(void) struct gendisk *disk = alloc_disk(16); if (!disk) goto oom; - /* to be cleaned up */ - disk->private_data = (void*)i; + i2ob_dev[i<<4].index = i; disk->queue = i2ob_dev[i<<4].req_queue; - i2o_disk[i] = disk; + i2ob_disk[i] = disk; } #ifdef MODULE printk(KERN_INFO "i2o_block: registered device at major %d\n", MAJOR_NR); @@ -1662,12 +1642,11 @@ static int i2o_block_init(void) i2ob_dev[i].head = NULL; i2ob_dev[i].tail = NULL; i2ob_dev[i].depth = MAX_I2OB_DEPTH; - i2ob_blksizes[i] = 1024; i2ob_max_sectors[i] = 2; } for (i = 0; i < MAX_I2OB; i++) { - struct gendisk *disk = i2ob_disk + i; + struct gendisk *disk = i2ob_disk[i]; disk->major = MAJOR_NR; disk->first_minor = i<<4; disk->fops = &i2ob_fops; @@ -1715,7 +1694,7 @@ static int i2o_block_init(void) oom: while (i--) - put_disk(i2o_disk[i]); + put_disk(i2ob_disk[i]); unregister_blkdev(MAJOR_NR, "i2o_block"); return -ENOMEM; } @@ -1769,7 +1748,7 @@ static void i2o_block_exit(void) i2o_remove_handler(&i2o_block_handler); for (i = 0; i < MAX_I2OB; i++) - put_disk(i2o_disk[i]); + put_disk(i2ob_disk[i]); /* * Return the block device diff --git a/drivers/message/i2o/i2o_scsi.c b/drivers/message/i2o/i2o_scsi.c index 1fdbc57c7b8c..6defe8ae1092 100644 --- a/drivers/message/i2o/i2o_scsi.c +++ b/drivers/message/i2o/i2o_scsi.c @@ -37,7 +37,6 @@ * Fix the resource management problems. */ -#error Please convert me to Documentation/DMA-mapping.txt #include <linux/module.h> #include <linux/kernel.h> @@ -55,18 +54,22 @@ #include <asm/io.h> #include <asm/atomic.h> #include <linux/blk.h> -#include <linux/version.h> #include <linux/i2o.h> #include "../../scsi/scsi.h" #include "../../scsi/hosts.h" #include "../../scsi/sd.h" -#include "i2o_scsi.h" -#define VERSION_STRING "Version 0.1.1" +#if BITS_PER_LONG == 64 +#error FIXME: driver does not support 64-bit platforms +#endif + + +#define VERSION_STRING "Version 0.1.2" #define dprintk(x) -#define MAXHOSTS 32 +#define I2O_SCSI_CAN_QUEUE 4 +#define MAXHOSTS 32 struct i2o_scsi_host { @@ -320,6 +323,12 @@ static void i2o_scsi_reply(struct i2o_handler *h, struct i2o_controller *c, stru * It worked maybe ? */ current_command->result = DID_OK << 16 | ds; + + if (current_command->use_sg) + pci_unmap_sg(c->pdev, (struct scatterlist *)current_command->buffer, current_command->use_sg, scsi_to_pci_dma_dir(current_command->sc_data_direction)); + else if (current_command->request_bufflen) + pci_unmap_single(c->pdev, (dma_addr_t)((long)current_command->SCp.ptr), current_command->request_bufflen, scsi_to_pci_dma_dir(current_command->sc_data_direction)); + lock = current_command->host->host_lock; spin_lock_irqsave(lock, flags); current_command->scsi_done(current_command); @@ -453,7 +462,6 @@ static void i2o_scsi_init(struct i2o_controller *c, struct i2o_device *d, struct static int i2o_scsi_detect(Scsi_Host_Template * tpnt) { - unsigned long flags; struct Scsi_Host *shpnt = NULL; int i; int count; @@ -680,6 +688,7 @@ static int i2o_scsi_queuecommand(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) spin_unlock_irqrestore(host->host_lock, flags); return 0; } + i2o_raw_writel(I2O_CMD_SCSI_EXEC<<24|HOST_TID<<12|tid, &msg[1]); i2o_raw_writel(scsi_context, &msg[2]); /* So the I2O layer passes to us */ @@ -752,10 +761,18 @@ static int i2o_scsi_queuecommand(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) if(SCpnt->use_sg) { struct scatterlist *sg = (struct scatterlist *)SCpnt->request_buffer; + int sg_count; int chain = 0; len = 0; + sg_count = pci_map_sg(c->pdev, sg, SCpnt->use_sg, + scsi_to_pci_dma_dir(SCpnt->sc_data_direction)); + + /* FIXME: handle fail */ + if(!sg_count) + BUG(); + if((sg_max_frags > 11) && (SCpnt->use_sg > 11)) { chain = 1; @@ -775,27 +792,27 @@ static int i2o_scsi_queuecommand(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) sg_chain_tag = 0; for(i = 0 ; i < SCpnt->use_sg; i++) { - *mptr++=direction|0x10000000|sg->length; - len+=sg->length; - *mptr++=virt_to_bus(page_address(sg->page)+sg->offset); + *mptr++=cpu_to_le32(direction|0x10000000|sg_dma_len(sg)); + len+=sg_dma_len(sg); + *mptr++=cpu_to_le32(sg_dma_address(sg)); sg++; } - mptr[-2]=direction|0xD0000000|(sg-1)->length; + mptr[-2]=cpu_to_le32(direction|0xD0000000|sg_dma_len(sg-1)); } else { for(i = 0 ; i < SCpnt->use_sg; i++) { - i2o_raw_writel(direction|0x10000000|sg->length, mptr++); + i2o_raw_writel(direction|0x10000000|sg_dma_len(sg), mptr++); len+=sg->length; - i2o_raw_writel(virt_to_bus(page_address(sg->page) + sg->offset), mptr++); + i2o_raw_writel(sg_dma_address(sg), mptr++); sg++; } /* Make this an end of list. Again evade the 920 bug and unwanted PCI read traffic */ - i2o_raw_writel(direction|0xD0000000|(sg-1)->length, &mptr[-2]); + i2o_raw_writel(direction|0xD0000000|sg_dma_len(sg-1), &mptr[-2]); } if(!chain) @@ -818,8 +835,16 @@ static int i2o_scsi_queuecommand(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) } else { + dma_addr_t dma_addr; + dma_addr = pci_map_single(c->pdev, + SCpnt->request_buffer, + SCpnt->request_bufflen, + scsi_to_pci_dma_dir(SCpnt->sc_data_direction)); + if(dma_addr == 0) + BUG(); /* How to handle ?? */ + SCpnt->SCp.ptr = (char *)(unsigned long) dma_addr; i2o_raw_writel(0xD0000000|direction|SCpnt->request_bufflen, mptr++); - i2o_raw_writel(virt_to_bus(SCpnt->request_buffer), mptr++); + i2o_raw_writel(dma_addr, mptr++); } } @@ -1046,6 +1071,24 @@ MODULE_AUTHOR("Red Hat Software"); MODULE_LICENSE("GPL"); -static Scsi_Host_Template driver_template = I2OSCSI; +static Scsi_Host_Template driver_template = { + .proc_name = "i2o_scsi", + .name = "I2O SCSI Layer", + .detect = i2o_scsi_detect, + .release = i2o_scsi_release, + .info = i2o_scsi_info, + .command = i2o_scsi_command, + .queuecommand = i2o_scsi_queuecommand, + .eh_abort_handler = i2o_scsi_abort, + .eh_bus_reset_handler = i2o_scsi_bus_reset, + .eh_device_reset_handler= i2o_scsi_device_reset, + .eh_host_reset_handler = i2o_scsi_host_reset, + .bios_param = i2o_scsi_bios_param, + .can_queue = I2O_SCSI_CAN_QUEUE, + .this_id = 15, + .sg_tablesize = 8, + .cmd_per_lun = 6, + .use_clustering = ENABLE_CLUSTERING, +}; #include "../../scsi/scsi_module.c" diff --git a/drivers/message/i2o/i2o_scsi.h b/drivers/message/i2o/i2o_scsi.h deleted file mode 100644 index 77729853c3aa..000000000000 --- a/drivers/message/i2o/i2o_scsi.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef _I2O_SCSI_H -#define _I2O_SCSI_H - -#include <linux/types.h> -#include <linux/kdev_t.h> - -#define I2O_SCSI_ID 15 -#define I2O_SCSI_CAN_QUEUE 4 -#define I2O_SCSI_CMD_PER_LUN 6 - -static int i2o_scsi_detect(Scsi_Host_Template *); -static const char *i2o_scsi_info(struct Scsi_Host *); -static int i2o_scsi_command(Scsi_Cmnd *); -static int i2o_scsi_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -static int i2o_scsi_abort(Scsi_Cmnd *); -static int i2o_scsi_bus_reset(Scsi_Cmnd *); -static int i2o_scsi_host_reset(Scsi_Cmnd *); -static int i2o_scsi_device_reset(Scsi_Cmnd *); -static int i2o_scsi_bios_param(Disk *, struct block_device *, int *); -static int i2o_scsi_release(struct Scsi_Host *host); - -#define I2OSCSI { \ - next: NULL, \ - proc_name: "i2o_scsi", \ - name: "I2O SCSI Layer", \ - detect: i2o_scsi_detect, \ - release: i2o_scsi_release, \ - info: i2o_scsi_info, \ - command: i2o_scsi_command, \ - queuecommand: i2o_scsi_queuecommand, \ - eh_abort_handler: i2o_scsi_abort, \ - eh_bus_reset_handler: i2o_scsi_bus_reset, \ - eh_device_reset_handler: i2o_scsi_device_reset, \ - eh_host_reset_handler: i2o_scsi_host_reset, \ - bios_param: i2o_scsi_bios_param, \ - can_queue: I2O_SCSI_CAN_QUEUE, \ - this_id: I2O_SCSI_ID, \ - sg_tablesize: 8, \ - cmd_per_lun: I2O_SCSI_CMD_PER_LUN, \ - unchecked_isa_dma: 0, \ - use_clustering: ENABLE_CLUSTERING \ - } - -#endif diff --git a/drivers/net/3c515.c b/drivers/net/3c515.c index 8143998eb0ef..09cc0269e994 100644 --- a/drivers/net/3c515.c +++ b/drivers/net/3c515.c @@ -1,4 +1,4 @@ -/* 3c515.c: A 3Com ISA EtherLink XL "Corkscrew" ethernet driver for linux. */ + /* Written 1997-1998 by Donald Becker. @@ -13,17 +13,19 @@ Annapolis MD 21403 - 2/2/00- Added support for kernel-level ISAPnP + 2000/2/2- Added support for kernel-level ISAPnP by Stephen Frost <sfrost@snowman.net> and Alessandro Zummo Cleaned up for 2.3.x/softnet by Jeff Garzik and Alan Cox. - 11/17/2001 - Added ethtool support (jgarzik) + 2001/11/17 - Added ethtool support (jgarzik) + + 2002/10/28 - Locking updates for 2.5 (alan@redhat.com) */ #define DRV_NAME "3c515" -#define DRV_VERSION "0.99t" -#define DRV_RELDATE "17-Nov-2001" +#define DRV_VERSION "0.99t-ac" +#define DRV_RELDATE "28-Oct-2002" static char *version = DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " becker@scyld.com and others\n"; @@ -84,12 +86,6 @@ static int max_interrupt_work = 20; #define NEW_MULTICAST #include <linux/delay.h> -/* Kernel version compatibility functions. */ -#define RUN_AT(x) (jiffies + (x)) - -#define REQUEST_IRQ(i,h,f,n, instance) request_irq(i,h,f,n, instance) -#define IRQ(irq, dev_id, pt_regs) (irq, dev_id, pt_regs) - MODULE_AUTHOR("Donald Becker <becker@scyld.com>"); MODULE_DESCRIPTION("3Com 3c515 Corkscrew driver"); MODULE_LICENSE("GPL"); @@ -202,16 +198,13 @@ of 1.5K, but the changes to support 4.5K are minimal. enum corkscrew_cmd { TotalReset = 0 << 11, SelectWindow = 1 << 11, StartCoax = 2 << 11, RxDisable = 3 << 11, RxEnable = 4 << 11, RxReset = 5 << 11, - UpStall = 6 << 11, UpUnstall = (6 << 11) + 1, - DownStall = (6 << 11) + 2, DownUnstall = (6 << 11) + 3, - RxDiscard = 8 << 11, TxEnable = 9 << 11, TxDisable = - 10 << 11, TxReset = 11 << 11, - FakeIntr = 12 << 11, AckIntr = 13 << 11, SetIntrEnb = 14 << 11, - SetStatusEnb = 15 << 11, SetRxFilter = 16 << 11, SetRxThreshold = - 17 << 11, - SetTxThreshold = 18 << 11, SetTxStart = 19 << 11, - StartDMAUp = 20 << 11, StartDMADown = (20 << 11) + 1, StatsEnable = - 21 << 11, + UpStall = 6 << 11, UpUnstall = (6 << 11) + 1, DownStall = (6 << 11) + 2, + DownUnstall = (6 << 11) + 3, RxDiscard = 8 << 11, TxEnable = 9 << 11, + TxDisable = 10 << 11, TxReset = 11 << 11, FakeIntr = 12 << 11, + AckIntr = 13 << 11, SetIntrEnb = 14 << 11, SetStatusEnb = 15 << 11, + SetRxFilter = 16 << 11, SetRxThreshold = 17 << 11, + SetTxThreshold = 18 << 11, SetTxStart = 19 << 11, StartDMAUp = 20 << 11, + StartDMADown = (20 << 11) + 1, StatsEnable = 21 << 11, StatsDisable = 22 << 11, StopCoax = 23 << 11, }; @@ -265,11 +258,9 @@ enum Window3 { /* Window 3: MAC/config bits. */ union wn3_config { int i; struct w3_config_fields { - unsigned int ram_size:3, ram_width:1, ram_speed:2, - rom_size:2; + unsigned int ram_size:3, ram_width:1, ram_speed:2, rom_size:2; int pad8:8; - unsigned int ram_split:2, pad18:2, xcvr:3, pad21:1, - autoselect:1; + unsigned int ram_split:2, pad18:2, xcvr:3, pad21:1, autoselect:1; int pad24:7; } u; }; @@ -340,14 +331,14 @@ struct corkscrew_private { full_duplex:1, autoselect:1, bus_master:1, /* Vortex can only do a fragment bus-m. */ full_bus_master_tx:1, full_bus_master_rx:1, /* Boomerang */ tx_full:1; + spinlock_t lock; }; /* The action to take with a media selection timer tick. Note that we deviate from the 3Com order by checking 10base2 before AUI. */ enum xcvr_types { - XCVR_10baseT = - 0, XCVR_AUI, XCVR_10baseTOnly, XCVR_10base2, XCVR_100baseTx, + XCVR_10baseT = 0, XCVR_AUI, XCVR_10baseTOnly, XCVR_10base2, XCVR_100baseTx, XCVR_100baseFx, XCVR_MII = 6, XCVR_Default = 8, }; @@ -577,27 +568,23 @@ static struct net_device *corkscrew_found_device(struct net_device *dev, #ifdef MODULE /* Allocate and fill new device structure. */ - int dev_size = sizeof(struct net_device) + - sizeof(struct corkscrew_private) + 15; /* Pad for alignment */ + int dev_size = sizeof(struct net_device) + sizeof(struct corkscrew_private) + 15; /* Pad for alignment */ dev = (struct net_device *) kmalloc(dev_size, GFP_KERNEL); if (!dev) return NULL; memset(dev, 0, dev_size); /* Align the Rx and Tx ring entries. */ - dev->priv = - (void *) (((long) dev + sizeof(struct net_device) + 15) & ~15); + dev->priv = (void *) (((long) dev + sizeof(struct net_device) + 15) & ~15); vp = (struct corkscrew_private *) dev->priv; dev->base_addr = ioaddr; dev->irq = irq; - dev->dma = - (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0); + dev->dma = (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0); dev->init = corkscrew_probe1; vp->product_name = "3c515"; vp->options = options; if (options >= 0) { - vp->media_override = - ((options & 7) == 2) ? 0 : options & 7; + vp->media_override = ((options & 7) == 2) ? 0 : options & 7; vp->full_duplex = (options & 8) ? 1 : 0; vp->bus_master = (options & 16) ? 1 : 0; } else { @@ -615,22 +602,19 @@ static struct net_device *corkscrew_found_device(struct net_device *dev, } #else /* not a MODULE */ /* Caution: quad-word alignment required for rings! */ - dev->priv = - kmalloc(sizeof(struct corkscrew_private), GFP_KERNEL); + dev->priv = kmalloc(sizeof(struct corkscrew_private), GFP_KERNEL); if (!dev->priv) return NULL; memset(dev->priv, 0, sizeof(struct corkscrew_private)); dev = init_etherdev(dev, sizeof(struct corkscrew_private)); dev->base_addr = ioaddr; dev->irq = irq; - dev->dma = - (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0); + dev->dma = (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0); vp = (struct corkscrew_private *) dev->priv; vp->product_name = "3c515"; vp->options = options; if (options >= 0) { - vp->media_override = - ((options & 7) == 2) ? 0 : options & 7; + vp->media_override = ((options & 7) == 2) ? 0 : options & 7; vp->full_duplex = (options & 8) ? 1 : 0; vp->bus_master = (options & 16) ? 1 : 0; } else { @@ -647,14 +631,14 @@ static struct net_device *corkscrew_found_device(struct net_device *dev, static int corkscrew_probe1(struct net_device *dev) { int ioaddr = dev->base_addr; - struct corkscrew_private *vp = - (struct corkscrew_private *) dev->priv; + struct corkscrew_private *vp = (struct corkscrew_private *) dev->priv; unsigned int eeprom[0x40], checksum = 0; /* EEPROM contents */ int i; - printk(KERN_INFO "%s: 3Com %s at %#3x,", dev->name, - vp->product_name, ioaddr); + printk(KERN_INFO "%s: 3Com %s at %#3x,", dev->name, vp->product_name, ioaddr); + spin_lock_init(&vp->lock); + /* Read the station address from the EEPROM. */ EL3WINDOW(0); for (i = 0; i < 0x18; i++) { @@ -769,7 +753,7 @@ static int corkscrew_open(struct net_device *dev) dev->name, media_tbl[dev->if_port].name); init_timer(&vp->timer); - vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait); + vp->timer.expires = jiffies + media_tbl[dev->if_port].wait; vp->timer.data = (unsigned long) dev; vp->timer.function = &corkscrew_timer; /* timer handler */ add_timer(&vp->timer); @@ -907,8 +891,7 @@ static void corkscrew_timer(unsigned long data) { #ifdef AUTOMEDIA struct net_device *dev = (struct net_device *) data; - struct corkscrew_private *vp = - (struct corkscrew_private *) dev->priv; + struct corkscrew_private *vp = (struct corkscrew_private *) dev->priv; int ioaddr = dev->base_addr; unsigned long flags; int ok = 0; @@ -917,8 +900,9 @@ static void corkscrew_timer(unsigned long data) printk("%s: Media selection timer tick happened, %s.\n", dev->name, media_tbl[dev->if_port].name); - save_flags(flags); - cli(); { + spin_lock_irqsave(&vp->lock, flags); + + { int old_window = inw(ioaddr + EL3_CMD) >> 13; int media_status; EL3WINDOW(4); @@ -969,7 +953,7 @@ static void corkscrew_timer(unsigned long data) printk("%s: Media selection failed, now trying %s port.\n", dev->name, media_tbl[dev->if_port].name); - vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait); + vp->timer.expires = jiffies + media_tbl[dev->if_port].wait; add_timer(&vp->timer); } outw((media_status & ~(Media_10TP | Media_SQE)) | @@ -986,7 +970,8 @@ static void corkscrew_timer(unsigned long data) } EL3WINDOW(old_window); } - restore_flags(flags); + + spin_unlock_irqrestore(&vp->lock, flags); if (corkscrew_debug > 1) printk("%s: Media selection timer finished, %s.\n", dev->name, media_tbl[dev->if_port].name); @@ -1055,8 +1040,7 @@ static int corkscrew_start_xmit(struct sk_buff *skb, if (vp->tx_full) /* No room to transmit with */ return 1; if (vp->cur_tx != 0) - prev_entry = - &vp->tx_ring[(vp->cur_tx - 1) % TX_RING_SIZE]; + prev_entry = &vp->tx_ring[(vp->cur_tx - 1) % TX_RING_SIZE]; else prev_entry = NULL; if (corkscrew_debug > 3) @@ -1069,23 +1053,21 @@ static int corkscrew_start_xmit(struct sk_buff *skb, vp->tx_ring[entry].length = skb->len | 0x80000000; vp->tx_ring[entry].status = skb->len | 0x80000000; - save_flags(flags); - cli(); + spin_lock_irqsave(&vp->lock, flags); outw(DownStall, ioaddr + EL3_CMD); /* Wait for the stall to complete. */ for (i = 20; i >= 0; i--) - if ((inw(ioaddr + EL3_STATUS) & CmdInProgress) == - 0) break; + if ((inw(ioaddr + EL3_STATUS) & CmdInProgress) == 0) + break; if (prev_entry) - prev_entry->next = - isa_virt_to_bus(&vp->tx_ring[entry]); + prev_entry->next = isa_virt_to_bus(&vp->tx_ring[entry]); if (inl(ioaddr + DownListPtr) == 0) { outl(isa_virt_to_bus(&vp->tx_ring[entry]), ioaddr + DownListPtr); queued_packet++; } outw(DownUnstall, ioaddr + EL3_CMD); - restore_flags(flags); + spin_unlock_irqrestore(&vp->lock, flags); vp->cur_tx++; if (vp->cur_tx - vp->dirty_tx > TX_RING_SIZE - 1) @@ -1179,6 +1161,8 @@ static void corkscrew_interrupt(int irq, void *dev_id, latency = inb(ioaddr + Timer); lp = (struct corkscrew_private *) dev->priv; + spin_lock(&lp->lock); + status = inw(ioaddr + EL3_STATUS); if (corkscrew_debug > 4) @@ -1193,6 +1177,7 @@ static void corkscrew_interrupt(int irq, void *dev_id, printk(KERN_ERR "%s: Bogus interrupt, bailing. Status %4.4x, start=%d.\n", dev->name, status, netif_running(dev)); free_irq(dev->irq, dev); + dev->irq = -1; } } @@ -1205,8 +1190,7 @@ static void corkscrew_interrupt(int irq, void *dev_id, if (status & TxAvailable) { if (corkscrew_debug > 5) - printk - (" TX room bit was handled.\n"); + printk(" TX room bit was handled.\n"); /* There's room in the FIFO for a full-sized packet. */ outw(AckIntr | TxAvailable, ioaddr + EL3_CMD); netif_wake_queue(dev); @@ -1216,21 +1200,17 @@ static void corkscrew_interrupt(int irq, void *dev_id, while (lp->cur_tx - dirty_tx > 0) { int entry = dirty_tx % TX_RING_SIZE; - if (inl(ioaddr + DownListPtr) == - isa_virt_to_bus(&lp->tx_ring[entry])) + if (inl(ioaddr + DownListPtr) == isa_virt_to_bus(&lp->tx_ring[entry])) break; /* It still hasn't been processed. */ if (lp->tx_skbuff[entry]) { - dev_kfree_skb_irq(lp-> - tx_skbuff - [entry]); + dev_kfree_skb_irq(lp->tx_skbuff[entry]); lp->tx_skbuff[entry] = 0; } dirty_tx++; } lp->dirty_tx = dirty_tx; outw(AckIntr | DownComplete, ioaddr + EL3_CMD); - if (lp->tx_full - && (lp->cur_tx - dirty_tx <= TX_RING_SIZE - 1)) { + if (lp->tx_full && (lp->cur_tx - dirty_tx <= TX_RING_SIZE - 1)) { lp->tx_full = 0; netif_wake_queue(dev); } @@ -1255,23 +1235,19 @@ static void corkscrew_interrupt(int irq, void *dev_id, if (status & StatsFull) { /* Empty statistics. */ static int DoneDidThat; if (corkscrew_debug > 4) - printk("%s: Updating stats.\n", - dev->name); + printk("%s: Updating stats.\n", dev->name); update_stats(ioaddr, dev); /* DEBUG HACK: Disable statistics as an interrupt source. */ /* This occurs when we have the wrong media type! */ - if (DoneDidThat == 0 && - inw(ioaddr + EL3_STATUS) & StatsFull) { + if (DoneDidThat == 0 && inw(ioaddr + EL3_STATUS) & StatsFull) { int win, reg; printk("%s: Updating stats failed, disabling stats as an" - " interrupt source.\n", - dev->name); + " interrupt source.\n", dev->name); for (win = 0; win < 8; win++) { EL3WINDOW(win); printk("\n Vortex window %d:", win); for (reg = 0; reg < 16; reg++) - printk(" %2.2x", - inb(ioaddr + reg)); + printk(" %2.2x", inb(ioaddr + reg)); } EL3WINDOW(7); outw(SetIntrEnb | TxAvailable | @@ -1297,20 +1273,19 @@ static void corkscrew_interrupt(int irq, void *dev_id, "Disabling functions (%4.4x).\n", dev->name, status, SetStatusEnb | ((~status) & 0x7FE)); /* Disable all pending interrupts. */ - outw(SetStatusEnb | ((~status) & 0x7FE), - ioaddr + EL3_CMD); + outw(SetStatusEnb | ((~status) & 0x7FE), ioaddr + EL3_CMD); outw(AckIntr | 0x7FF, ioaddr + EL3_CMD); break; } /* Acknowledge the IRQ. */ outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD); - } while ((status = inw(ioaddr + EL3_STATUS)) & - (IntLatch | RxComplete)); + } while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete)); + + spin_unlock(&lp->lock); if (corkscrew_debug > 4) - printk("%s: exiting interrupt, status %4.4x.\n", dev->name, - status); + printk("%s: exiting interrupt, status %4.4x.\n", dev->name, status); } static int corkscrew_rx(struct net_device *dev) @@ -1529,15 +1504,13 @@ static int corkscrew_close(struct net_device *dev) static struct net_device_stats *corkscrew_get_stats(struct net_device *dev) { - struct corkscrew_private *vp = - (struct corkscrew_private *) dev->priv; + struct corkscrew_private *vp = (struct corkscrew_private *) dev->priv; unsigned long flags; if (netif_running(dev)) { - save_flags(flags); - cli(); + spin_lock_irqsave(&vp->lock, flags); update_stats(dev->base_addr, dev); - restore_flags(flags); + spin_unlock_irqrestore(&vp->lock, flags); } return &vp->stats; } diff --git a/drivers/net/Config.in b/drivers/net/Config.in index 1e3c1e1a4719..eab594b51f33 100644 --- a/drivers/net/Config.in +++ b/drivers/net/Config.in @@ -134,6 +134,7 @@ if [ "$CONFIG_NET_ETHERNET" = "y" ]; then tristate ' LP486E on board Ethernet' CONFIG_LP486E tristate ' ICL EtherTeam 16i/32 support' CONFIG_ETH16I tristate ' NE2000/NE1000 support' CONFIG_NE2000 + dep_tristate ' Zenith Z-Note support (EXPERIMENTAL)' CONFIG_ZNET $CONFIG_EXPERIMENTAL if [ "$CONFIG_OBSOLETE" = "y" ]; then dep_tristate ' SEEQ8005 support (EXPERIMENTAL)' CONFIG_SEEQ8005 $CONFIG_EXPERIMENTAL fi @@ -186,9 +187,6 @@ if [ "$CONFIG_NET_ETHERNET" = "y" ]; then fi dep_tristate ' VIA Rhine support' CONFIG_VIA_RHINE $CONFIG_PCI dep_mbool ' Use MMIO instead of PIO (EXPERIMENTAL)' CONFIG_VIA_RHINE_MMIO $CONFIG_VIA_RHINE $CONFIG_EXPERIMENTAL - if [ "$CONFIG_OBSOLETE" = "y" ]; then - dep_bool ' Zenith Z-Note support (OBSOLETE)' CONFIG_ZNET $CONFIG_ISA - fi if [ "$CONFIG_EXPERIMENTAL" = "y" -a "$CONFIG_MIPS" = "y" ]; then bool ' Philips SAA9730 Ethernet support (EXPERIMENTAL)' CONFIG_LAN_SAA9730 fi diff --git a/drivers/net/Space.c b/drivers/net/Space.c index 2399de76246e..300b65c50b7b 100644 --- a/drivers/net/Space.c +++ b/drivers/net/Space.c @@ -54,7 +54,6 @@ extern int el2_probe(struct net_device *dev); extern int ne_probe(struct net_device *dev); extern int hp_probe(struct net_device *dev); extern int hp_plus_probe(struct net_device *dev); -extern int znet_probe(struct net_device *); extern int express_probe(struct net_device *); extern int eepro_probe(struct net_device *); extern int el3_probe(struct net_device *); @@ -270,9 +269,6 @@ static struct devprobe isa_probes[] __initdata = { #ifdef CONFIG_ETH16I {eth16i_probe, 0}, /* ICL EtherTeam 16i/32 */ #endif -#ifdef CONFIG_ZNET /* Zenith Z-Note and some IBM Thinkpads. */ - {znet_probe, 0}, -#endif #ifdef CONFIG_EEXPRESS /* Intel EtherExpress */ {express_probe, 0}, #endif diff --git a/drivers/net/appletalk/cops.c b/drivers/net/appletalk/cops.c index 92046d51846f..d22280e0d157 100644 --- a/drivers/net/appletalk/cops.c +++ b/drivers/net/appletalk/cops.c @@ -182,6 +182,7 @@ struct cops_local int nodeid; /* Set to 1 once have nodeid. */ unsigned char node_acquire; /* Node ID when acquired. */ struct atalk_addr node_addr; /* Full node address */ + spinlock_t lock; /* RX/TX lock */ }; /* Index to functions, as function prototypes. */ @@ -322,6 +323,7 @@ static int __init cops_probe1(struct net_device *dev, int ioaddr) lp = (struct cops_local *)dev->priv; memset(lp, 0, sizeof(struct cops_local)); + spinlock_init(&lp->lock); /* Copy local board variable to lp struct. */ lp->board = board; @@ -759,9 +761,8 @@ static void cops_rx(struct net_device *dev) unsigned long flags; - save_flags(flags); - cli(); /* Disable interrupts. */ - + spin_lock_irqsave(&lp->lock, flags); + if(lp->board==DAYNA) { outb(0, ioaddr); /* Send out Zero length. */ @@ -779,7 +780,7 @@ static void cops_rx(struct net_device *dev) if(boguscount==1000000) { printk(KERN_WARNING "%s: DMA timed out.\n",dev->name); - restore_flags(flags); + spin_unlock_irqrestore(&lp->lock, flags); return; } } @@ -814,7 +815,7 @@ static void cops_rx(struct net_device *dev) if(lp->board==DAYNA) outb(1, ioaddr+DAYNA_INT_CARD); /* Interrupt the card */ - restore_flags(flags); /* Restore interrupts. */ + spin_unlock_irqrestore(&lp->lock, flags); /* Restore interrupts. */ /* Check for bad response length */ if(pkt_len < 0 || pkt_len > MAX_LLAP_SIZE) @@ -890,12 +891,13 @@ static int cops_send_packet(struct sk_buff *skb, struct net_device *dev) netif_stop_queue(dev); - save_flags(flags); - cli(); /* Disable interrupts. */ + spin_lock_irqsave(&lp->lock, flags); if(lp->board == DAYNA) /* Wait for adapter transmit buffer. */ - while((inb(ioaddr+DAYNA_CARD_STATUS)&DAYNA_TX_READY)==0); + while((inb(ioaddr+DAYNA_CARD_STATUS)&DAYNA_TX_READY)==0) + cpu_relax(); if(lp->board == TANGENT) /* Wait for adapter transmit buffer. */ - while((inb(ioaddr+TANG_CARD_STATUS)&TANG_TX_READY)==0); + while((inb(ioaddr+TANG_CARD_STATUS)&TANG_TX_READY)==0) + cpu_relax(); /* Output IO length. */ outb(skb->len, ioaddr); @@ -915,7 +917,7 @@ static int cops_send_packet(struct sk_buff *skb, struct net_device *dev) if(lp->board==DAYNA) /* Dayna requires you kick the card */ outb(1, ioaddr+DAYNA_INT_CARD); - restore_flags(flags); /* Restore interrupts. */ + spin_unlock_irqrestore(&lp->lock, flags); /* Restore interrupts. */ /* Done sending packet, update counters and cleanup. */ lp->stats.tx_packets++; diff --git a/drivers/net/de620.c b/drivers/net/de620.c index 434812e75156..a385a2b17ff5 100644 --- a/drivers/net/de620.c +++ b/drivers/net/de620.c @@ -190,6 +190,8 @@ static int clone = DE620_CLONE; static unsigned int de620_debug = DE620_DEBUG; +static spinlock_t de620_lock; + MODULE_PARM(bnc, "i"); MODULE_PARM(utp, "i"); MODULE_PARM(io, "i"); @@ -519,10 +521,7 @@ static void de620_set_multicast_list(struct net_device *dev) static void de620_timeout(struct net_device *dev) { - printk("%s: transmit timed out, %s?\n", - dev->name, - "network cable problem" - ); + printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name, "network cable problem"); /* Restart the adapter. */ if (!adapter_init(dev)) /* maybe close it */ netif_wake_queue(dev); @@ -551,9 +550,8 @@ static int de620_start_xmit(struct sk_buff *skb, struct net_device *dev) ++len; /* Start real output */ - save_flags(flags); - cli(); + spin_lock_irqsave(&de620_lock, flags) PRINTK(("de620_start_xmit: len=%d, bufs 0x%02x\n", (int)skb->len, using_txbuf)); @@ -572,7 +570,7 @@ static int de620_start_xmit(struct sk_buff *skb, struct net_device *dev) case (TXBF0 | TXBF1): /* NONE!!! */ printk(KERN_WARNING "%s: No tx-buffer available!\n", dev->name); - restore_flags(flags); + spin_unlock_irqrestore(&de620_lock, flags); return 1; } de620_write_block(dev, buffer, len); @@ -582,7 +580,7 @@ static int de620_start_xmit(struct sk_buff *skb, struct net_device *dev) netif_wake_queue(dev); ((struct net_device_stats *)(dev->priv))->tx_packets++; - restore_flags(flags); /* interrupts maybe back on */ + spin_unlock_irqrestore(&de620_lock, flags); dev_kfree_skb (skb); return 0; } @@ -599,12 +597,8 @@ static void de620_interrupt(int irq_in, void *dev_id, struct pt_regs *regs) int bogus_count = 0; int again = 0; - /* This might be deleted now, no crummy drivers present :-) Or..? */ - if ((dev == NULL) || (irq != irq_in)) { - printk("%s: bogus interrupt %d\n", dev?dev->name:"de620", irq_in); - return; - } - + spin_lock(&de620_lock); + /* Read the status register (_not_ the status port) */ irq_status = de620_get_register(dev, R_STS); @@ -620,6 +614,8 @@ static void de620_interrupt(int irq_in, void *dev_id, struct pt_regs *regs) if(de620_tx_buffs(dev) != (TXBF0 | TXBF1)) netif_wake_queue(dev); + + spin_unlock(&de620_lock); } /************************************** @@ -694,8 +690,7 @@ static int de620_rx_intr(struct net_device *dev) else { /* Good packet? */ skb = dev_alloc_skb(size+2); if (skb == NULL) { /* Yeah, but no place to put it... */ - printk(KERN_WARNING "%s: Couldn't allocate a sk_buff of size %d.\n", - dev->name, size); + printk(KERN_WARNING "%s: Couldn't allocate a sk_buff of size %d.\n", dev->name, size); ((struct net_device_stats *)(dev->priv))->rx_dropped++; } else { /* Yep! Go get it! */ @@ -824,6 +819,8 @@ int __init de620_probe(struct net_device *dev) SET_MODULE_OWNER(dev); + spin_lock_init(&de620_lock); + /* * This is where the base_addr and irq gets set. * Tunable at compile-time and insmod-time diff --git a/drivers/net/depca.c b/drivers/net/depca.c index 7fd5588ebb3b..f9e8f29c0b22 100644 --- a/drivers/net/depca.c +++ b/drivers/net/depca.c @@ -938,7 +938,7 @@ static void depca_interrupt(int irq, void *dev_id, struct pt_regs *regs) spin_unlock(&lp->lock); } - +/* Called with lp->lock held */ static int depca_rx(struct net_device *dev) { struct depca_private *lp = (struct depca_private *) dev->priv; @@ -1036,6 +1036,7 @@ static int depca_rx(struct net_device *dev) /* ** Buffer sent - check for buffer errors. +** Called with lp->lock held */ static int depca_tx(struct net_device *dev) { @@ -2003,7 +2004,7 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) spin_lock_irqsave(&lp->lock, flags); memcpy(buf, &lp->pktStats, ioc->len); spin_unlock_irqrestore(&lp->lock, flags); - if (copy_to_user(ioc->data, &lp->pktStats, ioc->len)) + if (copy_to_user(ioc->data, buf, ioc->len)) status = -EFAULT; kfree(buf); break; diff --git a/drivers/net/dl2k.c b/drivers/net/dl2k.c index 2e9ef5e0f947..dba4fbe337e8 100644 --- a/drivers/net/dl2k.c +++ b/drivers/net/dl2k.c @@ -535,7 +535,7 @@ rio_tx_timeout (struct net_device *dev) { long ioaddr = dev->base_addr; - printk (KERN_INFO "%s: Tx timed out (%4.4x), is buffer full?\n", + printk (KERN_INFO "%s: Tx timed out (%4.4lx), is buffer full?\n", dev->name, readl (ioaddr + TxStatus)); rio_free_tx(dev, 0); dev->if_port = 0; diff --git a/drivers/net/hamradio/baycom_epp.c b/drivers/net/hamradio/baycom_epp.c index fc9e7482f38b..9df09579092d 100644 --- a/drivers/net/hamradio/baycom_epp.c +++ b/drivers/net/hamradio/baycom_epp.c @@ -481,7 +481,7 @@ static void inline do_kiss_params(struct baycom_state *bc, ({ \ if (!(notbitstream & (0x1f0 << j))) \ goto stuff##j; \ - encodeend##j: \ + encodeend##j: ; \ }) #define ENCODEITERB(j) \ @@ -716,7 +716,7 @@ static void do_rxpacket(struct net_device *dev) goto flgabrt##j; \ if ((bitstream & (0x1f8 << j)) == (0xf8 << j)) /* stuffed bit */ \ goto stuff##j; \ - enditer##j: \ + enditer##j: ; \ }) #define DECODEITERB(j) \ diff --git a/drivers/net/hamradio/soundmodem/Makefile b/drivers/net/hamradio/soundmodem/Makefile index 77de2ca25c87..1922038ea574 100644 --- a/drivers/net/hamradio/soundmodem/Makefile +++ b/drivers/net/hamradio/soundmodem/Makefile @@ -38,5 +38,5 @@ $(obj)/sm_hapn4800.o: $(obj)/sm_tbl_hapn4800.h $(obj)/sm_fsk9600.o: $(obj)/sm_tbl_fsk9600.h $(obj)/sm_tbl_%: $(obj)/gentbl - $(obj)/gentbl + cd $(obj) && ./gentbl diff --git a/drivers/net/ibmlana.c b/drivers/net/ibmlana.c index ca7f616feb8e..3214ef387355 100644 --- a/drivers/net/ibmlana.c +++ b/drivers/net/ibmlana.c @@ -69,6 +69,8 @@ History: chars! June 1st, 2000 corrected version codes, added support for the latest 2.3 changes + Oct 28th, 2002 + cleaned up for the 2.5 tree <alan@redhat.com> *************************************************************************/ @@ -103,8 +105,9 @@ History: * have to pack all state info into the device struct! * ------------------------------------------------------------------------ */ -static char *MediaNames[Media_Count] = - { "10BaseT", "10Base5", "Unknown", "10Base2" }; +static char *MediaNames[Media_Count] = { + "10BaseT", "10Base5", "Unknown", "10Base2" +}; /* ------------------------------------------------------------------------ * private subfunctions @@ -113,7 +116,7 @@ static char *MediaNames[Media_Count] = #ifdef DEBUG /* dump all registers */ -static void dumpregs(struct IBMLANA_NETDEV *dev) +static void dumpregs(struct net_device *dev) { int z; @@ -128,7 +131,7 @@ static void dumpregs(struct IBMLANA_NETDEV *dev) /* dump parts of shared memory - only needed during debugging */ -static void dumpmem(struct IBMLANA_NETDEV *dev, u32 start, u32 len) +static void dumpmem(struct net_device *dev, u32 start, u32 len) { int z; @@ -136,7 +139,7 @@ static void dumpmem(struct IBMLANA_NETDEV *dev, u32 start, u32 len) for (z = 0; z < len; z++) { if ((z & 15) == 0) printk("%04x:", z); - printk(" %02x", IBMLANA_READB(dev->mem_start + start + z)); + printk(" %02x", isa_readb(dev->mem_start + start + z)); if ((z & 15) == 15) printk("\n"); } @@ -187,12 +190,12 @@ static void getaddrs(int slot, int *base, int *memlen, int *iobase, /* wait on register value with mask and timeout */ -static int wait_timeout(struct IBMLANA_NETDEV *dev, int regoffs, u16 mask, +static int wait_timeout(struct net_device *dev, int regoffs, u16 mask, u16 value, int timeout) { unsigned long fin = jiffies + timeout; - while (jiffies != fin) + while (time_before(jiffies,fin)) if ((inw(dev->base_addr + regoffs) & mask) == value) return 1; @@ -202,7 +205,7 @@ static int wait_timeout(struct IBMLANA_NETDEV *dev, int regoffs, u16 mask, /* reset the whole board */ -static void ResetBoard(struct IBMLANA_NETDEV *dev) +static void ResetBoard(struct net_device *dev) { unsigned char bcmval; @@ -226,7 +229,7 @@ static void ResetBoard(struct IBMLANA_NETDEV *dev) /* calculate RAM layout & set up descriptors in RAM */ -static void InitDscrs(struct IBMLANA_NETDEV *dev) +static void InitDscrs(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; u32 addr, baddr, raddr; @@ -237,7 +240,7 @@ static void InitDscrs(struct IBMLANA_NETDEV *dev) /* initialize RAM */ - IBMLANA_SETIO(dev->mem_start, 0xaa, + isa_memset_io(dev->mem_start, 0xaa, dev->mem_start - dev->mem_start); /* setup n TX descriptors - independent of RAM size */ @@ -257,29 +260,27 @@ static void InitDscrs(struct IBMLANA_NETDEV *dev) else tda.link = addr + sizeof(tda_t); tda.link |= 1; - IBMLANA_TOIO(dev->mem_start + addr, &tda, sizeof(tda_t)); + isa_memcpy_to_io(dev->mem_start + addr, &tda, sizeof(tda_t)); addr += sizeof(tda_t); baddr += PKTSIZE; } /* calculate how many receive buffers fit into remaining memory */ - priv->rxbufcnt = (dev->mem_end - dev->mem_start - baddr) / - (sizeof(rra_t) + sizeof(rda_t) + PKTSIZE); + priv->rxbufcnt = (dev->mem_end - dev->mem_start - baddr) / (sizeof(rra_t) + sizeof(rda_t) + PKTSIZE); /* calculate receive addresses */ priv->rrastart = raddr = priv->txbufstart + (TXBUFCNT * PKTSIZE); - priv->rdastart = addr = - priv->rrastart + (priv->rxbufcnt * sizeof(rra_t)); - priv->rxbufstart = baddr = - priv->rdastart + (priv->rxbufcnt * sizeof(rda_t)); + priv->rdastart = addr = priv->rrastart + (priv->rxbufcnt * sizeof(rra_t)); + priv->rxbufstart = baddr = priv->rdastart + (priv->rxbufcnt * sizeof(rda_t)); + for (z = 0; z < priv->rxbufcnt; z++) { rra.startlo = baddr; rra.starthi = 0; rra.cntlo = PKTSIZE >> 1; rra.cnthi = 0; - IBMLANA_TOIO(dev->mem_start + raddr, &rra, sizeof(rra_t)); + isa_memcpy_to_io(dev->mem_start + raddr, &rra, sizeof(rra_t)); rda.status = 0; rda.length = 0; @@ -291,7 +292,7 @@ static void InitDscrs(struct IBMLANA_NETDEV *dev) else rda.link = 1; rda.inuse = 1; - IBMLANA_TOIO(dev->mem_start + addr, &rda, sizeof(rda_t)); + isa_memcpy_to_io(dev->mem_start + addr, &rda, sizeof(rda_t)); baddr += PKTSIZE; raddr += sizeof(rra_t); @@ -310,7 +311,7 @@ static void InitDscrs(struct IBMLANA_NETDEV *dev) /* set up Rx + Tx descriptors in SONIC */ -static int InitSONIC(struct IBMLANA_NETDEV *dev) +static int InitSONIC(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; @@ -318,8 +319,7 @@ static int InitSONIC(struct IBMLANA_NETDEV *dev) outw(0, SONIC_URRA); outw(priv->rrastart, dev->base_addr + SONIC_RSA); - outw(priv->rrastart + (priv->rxbufcnt * sizeof(rra_t)), - dev->base_addr + SONIC_REA); + outw(priv->rrastart + (priv->rxbufcnt * sizeof(rra_t)), dev->base_addr + SONIC_REA); outw(priv->rrastart, dev->base_addr + SONIC_RRP); outw(priv->rrastart, dev->base_addr + SONIC_RWP); @@ -331,9 +331,7 @@ static int InitSONIC(struct IBMLANA_NETDEV *dev) outw(CMDREG_RRRA, dev->base_addr + SONIC_CMDREG); if (!wait_timeout(dev, SONIC_CMDREG, CMDREG_RRRA, 0, 2)) { - printk - ("%s: SONIC did not respond on RRRA command - giving up.", - dev->name); + printk(KERN_ERR "%s: SONIC did not respond on RRRA command - giving up.", dev->name); return 0; } @@ -351,12 +349,11 @@ static int InitSONIC(struct IBMLANA_NETDEV *dev) /* stop SONIC so we can reinitialize it */ -static void StopSONIC(struct IBMLANA_NETDEV *dev) +static void StopSONIC(struct net_device *dev) { /* disable interrupts */ - outb(inb(dev->base_addr + BCMREG) & (~BCMREG_IEN), - dev->base_addr + BCMREG); + outb(inb(dev->base_addr + BCMREG) & (~BCMREG_IEN), dev->base_addr + BCMREG); outb(0, dev->base_addr + SONIC_IMREG); /* reset the SONIC */ @@ -380,7 +377,7 @@ static void putcam(camentry_t * cams, int *camcnt, char *addr) (*camcnt)++; } -static void InitBoard(struct IBMLANA_NETDEV *dev) +static void InitBoard(struct net_device *dev) { int camcnt; camentry_t cams[16]; @@ -395,14 +392,12 @@ static void InitBoard(struct IBMLANA_NETDEV *dev) /* clear all spurious interrupts */ - outw(inw(dev->base_addr + SONIC_ISREG), - dev->base_addr + SONIC_ISREG); + outw(inw(dev->base_addr + SONIC_ISREG), dev->base_addr + SONIC_ISREG); /* set up the SONIC's bus interface - constant for this adapter - must be done while the SONIC is in reset */ - outw(DCREG_USR1 | DCREG_USR0 | DCREG_WC1 | DCREG_DW32, - dev->base_addr + SONIC_DCREG); + outw(DCREG_USR1 | DCREG_USR0 | DCREG_WC1 | DCREG_DW32, dev->base_addr + SONIC_DCREG); outw(0, dev->base_addr + SONIC_DCREG2); /* remove reset form the SONIC */ @@ -434,9 +429,8 @@ static void InitBoard(struct IBMLANA_NETDEV *dev) /* feed CDA into SONIC, initialize RCR value (always get broadcasts) */ - IBMLANA_TOIO(dev->mem_start, cams, sizeof(camentry_t) * camcnt); - IBMLANA_TOIO(dev->mem_start + (sizeof(camentry_t) * camcnt), - &cammask, sizeof(cammask)); + isa_memcpy_to_io(dev->mem_start, cams, sizeof(camentry_t) * camcnt); + isa_memcpy_to_io(dev->mem_start + (sizeof(camentry_t) * camcnt), &cammask, sizeof(cammask)); #ifdef DEBUG printk("CAM setup:\n"); @@ -447,9 +441,7 @@ static void InitBoard(struct IBMLANA_NETDEV *dev) outw(camcnt, dev->base_addr + SONIC_CAMCNT); outw(CMDREG_LCAM, dev->base_addr + SONIC_CMDREG); if (!wait_timeout(dev, SONIC_CMDREG, CMDREG_LCAM, 0, 2)) { - printk - ("%s:SONIC did not respond on LCAM command - giving up.", - dev->name); + printk(KERN_ERR "%s:SONIC did not respond on LCAM command - giving up.", dev->name); return; } else { /* clear interrupt condition */ @@ -470,12 +462,9 @@ static void InitBoard(struct IBMLANA_NETDEV *dev) for (z = 0; z < camcnt; z++) { outw(z, dev->base_addr + SONIC_CAMEPTR); printk("Entry %d: %04x %04x %04x\n", z, - inw(dev->base_addr + - SONIC_CAMADDR0), - inw(dev->base_addr + - SONIC_CAMADDR1), - inw(dev->base_addr + - SONIC_CAMADDR2)); + inw(dev->base_addr + SONIC_CAMADDR0), + inw(dev->base_addr + SONIC_CAMADDR1), + inw(dev->base_addr + SONIC_CAMADDR2)); } outw(0, dev->base_addr + SONIC_CMDREG); } @@ -515,13 +504,11 @@ static void InitBoard(struct IBMLANA_NETDEV *dev) /* enable transmitter + receiver interrupts */ outw(CMDREG_RXEN, dev->base_addr + SONIC_CMDREG); - outw(IMREG_PRXEN | IMREG_RBEEN | IMREG_PTXEN | IMREG_TXEREN, - dev->base_addr + SONIC_IMREG); + outw(IMREG_PRXEN | IMREG_RBEEN | IMREG_PTXEN | IMREG_TXEREN, dev->base_addr + SONIC_IMREG); /* turn on card interrupts */ - outb(inb(dev->base_addr + BCMREG) | BCMREG_IEN, - dev->base_addr + BCMREG); + outb(inb(dev->base_addr + BCMREG) | BCMREG_IEN, dev->base_addr + BCMREG); #ifdef DEBUG printk("Register dump after initialization:\n"); @@ -531,7 +518,7 @@ static void InitBoard(struct IBMLANA_NETDEV *dev) /* start transmission of a descriptor */ -static void StartTx(struct IBMLANA_NETDEV *dev, int descr) +static void StartTx(struct net_device *dev, int descr) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; int addr; @@ -554,7 +541,7 @@ static void StartTx(struct IBMLANA_NETDEV *dev, int descr) /* receive buffer area exhausted */ -static void irqrbe_handler(struct IBMLANA_NETDEV *dev) +static void irqrbe_handler(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; @@ -566,7 +553,7 @@ static void irqrbe_handler(struct IBMLANA_NETDEV *dev) /* receive interrupt */ -static void irqrx_handler(struct IBMLANA_NETDEV *dev) +static void irqrx_handler(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; rda_t rda; @@ -577,12 +564,9 @@ static void irqrx_handler(struct IBMLANA_NETDEV *dev) while (1) { /* read descriptor that was next to be filled by SONIC */ - rdaaddr = - priv->rdastart + (priv->nextrxdescr * sizeof(rda_t)); - lrdaaddr = - priv->rdastart + (priv->lastrxdescr * sizeof(rda_t)); - IBMLANA_FROMIO(&rda, dev->mem_start + rdaaddr, - sizeof(rda_t)); + rdaaddr = priv->rdastart + (priv->nextrxdescr * sizeof(rda_t)); + lrdaaddr = priv->rdastart + (priv->lastrxdescr * sizeof(rda_t)); + isa_memcpy_fromio(&rda, dev->mem_start + rdaaddr, sizeof(rda_t)); /* iron out upper word halves of fields we use - SONIC will duplicate bits 0..15 to 16..31 */ @@ -609,7 +593,7 @@ static void irqrx_handler(struct IBMLANA_NETDEV *dev) else { /* copy out data */ - IBMLANA_FROMIO(skb_put(skb, rda.length), + isa_memcpy_fromio(skb_put(skb, rda.length), dev->mem_start + rda.startlo, rda.length); @@ -620,15 +604,11 @@ static void irqrx_handler(struct IBMLANA_NETDEV *dev) skb->ip_summed = CHECKSUM_NONE; /* bookkeeping */ - dev->last_rx = jiffies; priv->stat.rx_packets++; -#if (LINUX_VERSION_CODE >= 0x20119) /* byte counters for kernel >= 2.1.25 */ priv->stat.rx_bytes += rda.length; -#endif /* pass to the upper layers */ - netif_rx(skb); } } @@ -637,10 +617,8 @@ static void irqrx_handler(struct IBMLANA_NETDEV *dev) else { priv->stat.rx_errors++; - if (rda.status & RCREG_FAER) priv->stat.rx_frame_errors++; - if (rda.status & RCREG_CRCR) priv->stat.rx_crc_errors++; } @@ -649,14 +627,14 @@ static void irqrx_handler(struct IBMLANA_NETDEV *dev) rda.link = 1; rda.inuse = 1; - IBMLANA_TOIO(dev->mem_start + rdaaddr, &rda, + isa_memcpy_to_io(dev->mem_start + rdaaddr, &rda, sizeof(rda_t)); /* set up link and EOL = 0 in currently last descriptor. Only write the link field since the SONIC may currently already access the other fields. */ - IBMLANA_TOIO(dev->mem_start + lrdaaddr + 20, &rdaaddr, 4); + isa_memcpy_to_io(dev->mem_start + lrdaaddr + 20, &rdaaddr, 4); /* advance indices */ @@ -668,57 +646,39 @@ static void irqrx_handler(struct IBMLANA_NETDEV *dev) /* transmit interrupt */ -static void irqtx_handler(struct IBMLANA_NETDEV *dev) +static void irqtx_handler(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; tda_t tda; /* fetch descriptor (we forgot the size ;-) */ - - IBMLANA_FROMIO(&tda, - dev->mem_start + priv->tdastart + - (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t)); + isa_memcpy_fromio(&tda, dev->mem_start + priv->tdastart + (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t)); /* update statistics */ - priv->stat.tx_packets++; -#if (LINUX_VERSION_CODE >= 0x020119) priv->stat.tx_bytes += tda.length; -#endif /* update our pointers */ - priv->txused[priv->currtxdescr] = 0; priv->txusedcnt--; /* if there are more descriptors present in RAM, start them */ - if (priv->txusedcnt > 0) StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT); /* tell the upper layer we can go on transmitting */ - -#if LINUX_VERSION_CODE >= 0x02032a netif_wake_queue(dev); -#else - dev->tbusy = 0; - mark_bh(NET_BH); -#endif } -static void irqtxerr_handler(struct IBMLANA_NETDEV *dev) +static void irqtxerr_handler(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; tda_t tda; /* fetch descriptor to check status */ - - IBMLANA_FROMIO(&tda, - dev->mem_start + priv->tdastart + - (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t)); + isa_memcpy_fromio(&tda, dev->mem_start + priv->tdastart + (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t)); /* update statistics */ - priv->stat.tx_errors++; if (tda.status & (TCREG_NCRS | TCREG_CRSL)) priv->stat.tx_carrier_errors++; @@ -730,47 +690,29 @@ static void irqtxerr_handler(struct IBMLANA_NETDEV *dev) priv->stat.tx_fifo_errors++; /* update our pointers */ - priv->txused[priv->currtxdescr] = 0; priv->txusedcnt--; /* if there are more descriptors present in RAM, start them */ - if (priv->txusedcnt > 0) StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT); /* tell the upper layer we can go on transmitting */ - -#if LINUX_VERSION_CODE >= 0x02032a netif_wake_queue(dev); -#else - dev->tbusy = 0; - mark_bh(NET_BH); -#endif } /* general interrupt entry */ static void irq_handler(int irq, void *device, struct pt_regs *regs) { - struct IBMLANA_NETDEV *dev = (struct IBMLANA_NETDEV *) device; + struct net_device *dev = (struct net_device *) device; u16 ival; /* in case we're not meant... */ - if (!(inb(dev->base_addr + BCMREG) & BCMREG_IPEND)) return; -#if (LINUX_VERSION_CODE >= 0x02032a) -#if 0 - set_bit(LINK_STATE_RXSEM, &dev->state); -#endif -#else - dev->interrupt = 1; -#endif - /* loop through the interrupt bits until everything is clear */ - while (1) { ival = inw(dev->base_addr + SONIC_ISREG); @@ -778,32 +720,20 @@ static void irq_handler(int irq, void *device, struct pt_regs *regs) irqrbe_handler(dev); outw(ISREG_RBE, dev->base_addr + SONIC_ISREG); } - if (ival & ISREG_PKTRX) { irqrx_handler(dev); outw(ISREG_PKTRX, dev->base_addr + SONIC_ISREG); } - if (ival & ISREG_TXDN) { irqtx_handler(dev); outw(ISREG_TXDN, dev->base_addr + SONIC_ISREG); } - if (ival & ISREG_TXER) { irqtxerr_handler(dev); outw(ISREG_TXER, dev->base_addr + SONIC_ISREG); } - break; } - -#if (LINUX_VERSION_CODE >= 0x02032a) -#if 0 - clear_bit(LINK_STATE_RXSEM, &dev->state); -#endif -#else - dev->interrupt = 0; -#endif } /* ------------------------------------------------------------------------ @@ -815,7 +745,7 @@ static void irq_handler(int irq, void *device, struct pt_regs *regs) static int ibmlana_getinfo(char *buf, int slot, void *d) { int len = 0, i; - struct IBMLANA_NETDEV *dev = (struct IBMLANA_NETDEV *) d; + struct net_device *dev = (struct net_device *) d; ibmlana_priv *priv; /* can't say anything about an uninitialized device... */ @@ -830,11 +760,8 @@ static int ibmlana_getinfo(char *buf, int slot, void *d) len += sprintf(buf + len, "IRQ: %d\n", priv->realirq); len += sprintf(buf + len, "I/O: %#lx\n", dev->base_addr); - len += sprintf(buf + len, "Memory: %#lx-%#lx\n", dev->mem_start, - dev->mem_end - 1); - len += - sprintf(buf + len, "Transceiver: %s\n", - MediaNames[priv->medium]); + len += sprintf(buf + len, "Memory: %#lx-%#lx\n", dev->mem_start, dev->mem_end - 1); + len += sprintf(buf + len, "Transceiver: %s\n", MediaNames[priv->medium]); len += sprintf(buf + len, "Device: %s\n", dev->name); len += sprintf(buf + len, "MAC address:"); for (i = 0; i < 6; i++) @@ -847,44 +774,31 @@ static int ibmlana_getinfo(char *buf, int slot, void *d) /* open driver. Means also initialization and start of LANCE */ -static int ibmlana_open(struct IBMLANA_NETDEV *dev) +static int ibmlana_open(struct net_device *dev) { int result; ibmlana_priv *priv = (ibmlana_priv *) dev->priv; /* register resources - only necessary for IRQ */ - result = - request_irq(priv->realirq, irq_handler, - SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); + result = request_irq(priv->realirq, irq_handler, SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); if (result != 0) { - printk("%s: failed to register irq %d\n", dev->name, - dev->irq); + printk(KERN_ERR "%s: failed to register irq %d\n", dev->name, dev->irq); return result; } dev->irq = priv->realirq; /* set up the card and SONIC */ - InitBoard(dev); /* initialize operational flags */ - -#if (LINUX_VERSION_CODE >= 0x02032a) netif_start_queue(dev); -#else - dev->interrupt = 0; - dev->tbusy = 0; - dev->start = 1; - MOD_INC_USE_COUNT; -#endif - return 0; } /* close driver. Shut down board and free allocated resources */ -static int ibmlana_close(struct IBMLANA_NETDEV *dev) +static int ibmlana_close(struct net_device *dev) { /* turn off board */ @@ -892,17 +806,12 @@ static int ibmlana_close(struct IBMLANA_NETDEV *dev) if (dev->irq != 0) free_irq(dev->irq, dev); dev->irq = 0; - -#if (LINUX_VERSION_CODE < 0x02032a) - MOD_DEC_USE_COUNT; -#endif - return 0; } /* transmit a block. */ -static int ibmlana_tx(struct sk_buff *skb, struct IBMLANA_NETDEV *dev) +static int ibmlana_tx(struct sk_buff *skb, struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; int retval = 0, tmplen, addr; @@ -910,16 +819,6 @@ static int ibmlana_tx(struct sk_buff *skb, struct IBMLANA_NETDEV *dev) tda_t tda; int baddr; - /* if we get called with a NULL descriptor, the Ethernet layer thinks - our card is stuck an we should reset it. We'll do this completely: */ - - if (skb == NULL) { - printk("%s: Resetting SONIC\n", dev->name); - StopSONIC(dev); - InitBoard(dev); - return 0; /* don't try to free the block here ;-) */ - } - /* find out if there are free slots for a frame to transmit. If not, the upper layer is in deep desperation and we simply ignore the frame. */ @@ -930,12 +829,11 @@ static int ibmlana_tx(struct sk_buff *skb, struct IBMLANA_NETDEV *dev) } /* copy the frame data into the next free transmit buffer - fillup missing */ - tmplen = skb->len; if (tmplen < 60) tmplen = 60; baddr = priv->txbufstart + (priv->nexttxdescr * PKTSIZE); - IBMLANA_TOIO(dev->mem_start + baddr, skb->data, skb->len); + isa_memcpy_to_io(dev->mem_start + baddr, skb->data, skb->len); /* copy filler into RAM - in case we're filling up... we're filling a bit more than necessary, but that doesn't harm @@ -947,81 +845,60 @@ static int ibmlana_tx(struct sk_buff *skb, struct IBMLANA_NETDEV *dev) unsigned int destoffs = skb->len, l = strlen(fill); while (destoffs < tmplen) { - IBMLANA_TOIO(dev->mem_start + baddr + destoffs, - fill, l); + isa_memcpy_to_io(dev->mem_start + baddr + destoffs, fill, l); destoffs += l; } } /* set up the new frame descriptor */ - addr = priv->tdastart + (priv->nexttxdescr * sizeof(tda_t)); - IBMLANA_FROMIO(&tda, dev->mem_start + addr, sizeof(tda_t)); + isa_memcpy_fromio(&tda, dev->mem_start + addr, sizeof(tda_t)); tda.length = tda.fraglength = tmplen; - IBMLANA_TOIO(dev->mem_start + addr, &tda, sizeof(tda_t)); + isa_memcpy_to_io(dev->mem_start + addr, &tda, sizeof(tda_t)); /* if there were no active descriptors, trigger the SONIC */ - - save_flags(flags); - cli(); + spin_lock_irqsave(&priv->lock, flags); priv->txusedcnt++; priv->txused[priv->nexttxdescr] = 1; /* are all transmission slots used up ? */ - if (priv->txusedcnt >= TXBUFCNT) -#if (LINUX_VERSION_CODE >= 0x02032a) netif_stop_queue(dev); -#else - dev->tbusy = 1; -#endif if (priv->txusedcnt == 1) StartTx(dev, priv->nexttxdescr); priv->nexttxdescr = (priv->nexttxdescr + 1) % TXBUFCNT; - restore_flags(flags); - - tx_done: - - /* When did that change exactly ? */ - -#if (LINUX_VERSION_CODE >= 0x20200) + spin_unlock_irqrestore(&priv->lock, flags); +tx_done: dev_kfree_skb(skb); -#else - dev_kfree_skb(skb, FREE_WRITE); -#endif return retval; } /* return pointer to Ethernet statistics */ -static struct net_device_stats *ibmlana_stats(struct IBMLANA_NETDEV *dev) +static struct net_device_stats *ibmlana_stats(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; - - return &(priv->stat); + return &priv->stat; } /* we don't support runtime reconfiguration, since am MCA card can be unambigously identified by its POS registers. */ -static int ibmlana_config(struct IBMLANA_NETDEV *dev, struct ifmap *map) +static int ibmlana_config(struct net_device *dev, struct ifmap *map) { return 0; } /* switch receiver mode. */ -static void ibmlana_set_multicast_list(struct IBMLANA_NETDEV *dev) +static void ibmlana_set_multicast_list(struct net_device *dev) { /* first stop the SONIC... */ - StopSONIC(dev); - /* ...then reinit it with the new flags */ - InitBoard(dev); } @@ -1031,7 +908,7 @@ static void ibmlana_set_multicast_list(struct IBMLANA_NETDEV *dev) static int startslot; /* counts through slots when probing multiple devices */ -int ibmlana_probe(struct IBMLANA_NETDEV *dev) +int ibmlana_probe(struct net_device *dev) { int force_detect = 0; int slot, z; @@ -1039,22 +916,17 @@ int ibmlana_probe(struct IBMLANA_NETDEV *dev) ibmlana_priv *priv; ibmlana_medium medium; -#if (LINUX_VERSION_CODE >= 0x02032a) SET_MODULE_OWNER(dev); -#endif /* can't work without an MCA bus ;-) */ - if (MCA_bus == 0) return -ENODEV; /* start address of 1 --> forced detection */ - if (dev->mem_start == 1) force_detect = 1; /* search through slots */ - if (dev != NULL) { base = dev->mem_start; irq = dev->irq; @@ -1063,70 +935,51 @@ int ibmlana_probe(struct IBMLANA_NETDEV *dev) while (slot != -1) { /* deduce card addresses */ - getaddrs(slot, &base, &memlen, &iobase, &irq, &medium); -#if (LINUX_VERSION_CODE >= 0x20300) /* slot already in use ? */ - if (mca_is_adapter_used(slot)) { slot = mca_find_adapter(IBM_LANA_ID, slot + 1); continue; } -#endif - /* were we looking for something different ? */ - - if ((dev->irq != 0) || (dev->mem_start != 0)) { - if ((dev->irq != 0) && (dev->irq != irq)) { - slot = - mca_find_adapter(IBM_LANA_ID, - slot + 1); + if (dev->irq != 0 || dev->mem_start != 0) { + if (dev->irq != 0 && dev->irq != irq) { + slot = mca_find_adapter(IBM_LANA_ID, slot + 1); continue; } - if ((dev->mem_start != 0) - && (dev->mem_start != base)) { - slot = - mca_find_adapter(IBM_LANA_ID, - slot + 1); + if (dev->mem_start != 0 && dev->mem_start != base) + { + slot = mca_find_adapter(IBM_LANA_ID, slot + 1); continue; } } - /* found something that matches */ - break; } /* nothing found ? */ - if (slot == -1) - return ((base != 0) || (irq != 0)) ? -ENXIO : -ENODEV; + return (base != 0 || irq != 0) ? -ENXIO : -ENODEV; /* announce success */ - printk("%s: IBM LAN Adapter/A found in slot %d\n", dev->name, - slot + 1); + printk(KERN_INFO "%s: IBM LAN Adapter/A found in slot %d\n", dev->name, slot + 1); /* try to obtain I/O range */ if (!request_region(iobase, IBM_LANA_IORANGE, dev->name)) { - printk("%s: cannot allocate I/O range at %#x!\n", dev->name, iobase); + printk(KERN_ERR "%s: cannot allocate I/O range at %#x!\n", dev->name, iobase); startslot = slot + 1; return -EBUSY; } /* make procfs entries */ - mca_set_adapter_name(slot, "IBM LAN Adapter/A"); mca_set_adapter_procfn(slot, (MCA_ProcFn) ibmlana_getinfo, dev); -#if (LINUX_VERSION_CODE >= 0x20200) mca_mark_as_used(slot); -#endif /* allocate structure */ - - priv = dev->priv = - (ibmlana_priv *) kmalloc(sizeof(ibmlana_priv), GFP_KERNEL); + priv = dev->priv = (ibmlana_priv *) kmalloc(sizeof(ibmlana_priv), GFP_KERNEL); if (!priv) { release_region(iobase, IBM_LANA_IORANGE); return -ENOMEM; @@ -1134,7 +987,8 @@ int ibmlana_probe(struct IBMLANA_NETDEV *dev) priv->slot = slot; priv->realirq = irq; priv->medium = medium; - memset(&(priv->stat), 0, sizeof(struct net_device_stats)); + spin_lock_init(&priv->lock); + memset(&priv->stat, 0, sizeof(struct net_device_stats)); /* set base + irq for this device (irq not allocated so far) */ @@ -1165,13 +1019,13 @@ int ibmlana_probe(struct IBMLANA_NETDEV *dev) /* print config */ - printk("%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, " + printk(KERN_INFO "%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, " "MAC address %02x:%02x:%02x:%02x:%02x:%02x.\n", dev->name, priv->realirq, dev->base_addr, dev->mem_start, dev->mem_end - 1, dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); - printk("%s: %s medium\n", dev->name, MediaNames[priv->medium]); + printk(KERN_INFO "%s: %s medium\n", dev->name, MediaNames[priv->medium]); /* reset board */ @@ -1192,9 +1046,10 @@ int ibmlana_probe(struct IBMLANA_NETDEV *dev) #define DEVMAX 5 -static struct IBMLANA_NETDEV moddevs[DEVMAX]; +static struct net_device moddevs[DEVMAX]; static int irq; static int io; + MODULE_PARM(irq, "i"); MODULE_PARM(io, "i"); MODULE_PARM_DESC(irq, "IBM LAN/A IRQ number"); @@ -1214,21 +1069,15 @@ int init_module(void) if (res != 0) return (z > 0) ? 0 : -EIO; } - return 0; } void cleanup_module(void) { - struct IBMLANA_NETDEV *dev; + struct net_device *dev; ibmlana_priv *priv; int z; - if (MOD_IN_USE) { - printk("cannot unload, module in use\n"); - return; - } - for (z = 0; z < DEVMAX; z++) { dev = moddevs + z; if (dev->priv != NULL) { @@ -1239,9 +1088,7 @@ void cleanup_module(void) dev->irq = 0; release_region(dev->base_addr, IBM_LANA_IORANGE); unregister_netdev(dev); -#if (LINUX_VERSION_CODE >= 0x20200) mca_mark_as_unused(priv->slot); -#endif mca_set_adapter_name(priv->slot, ""); mca_set_adapter_procfn(priv->slot, NULL, NULL); kfree(dev->priv); diff --git a/drivers/net/ibmlana.h b/drivers/net/ibmlana.h index aa7bfa34dac5..17ce22ef9f49 100644 --- a/drivers/net/ibmlana.h +++ b/drivers/net/ibmlana.h @@ -3,22 +3,6 @@ #ifdef _IBM_LANA_DRIVER_ -/* version-dependent functions/structures */ - -#if LINUX_VERSION_CODE >= 0x020318 -#define IBMLANA_READB(addr) isa_readb(addr) -#define IBMLANA_TOIO(dest, src, len) isa_memcpy_toio(dest, src, len) -#define IBMLANA_FROMIO(dest, src, len) isa_memcpy_fromio(dest, src, len) -#define IBMLANA_SETIO(dest, val, len) isa_memset_io(dest, val, len) -#define IBMLANA_NETDEV net_device -#else -#define IBMLANA_READB(addr) readb(addr) -#define IBMLANA_TOIO(dest, src, len) memcpy_toio(dest, src, len) -#define IBMLANA_FROMIO(dest, src, len) memcpy_fromio(dest, src, len) -#define IBMLANA_SETIO(dest, val, len) memset_io(dest, val, len) -#define IBMLANA_NETDEV device -#endif - /* maximum packet size */ #define PKTSIZE 1524 @@ -33,25 +17,27 @@ /* media enumeration - defined in a way that it fits onto the LAN/A's POS registers... */ -typedef enum { Media_10BaseT, Media_10Base5, +typedef enum { + Media_10BaseT, Media_10Base5, Media_Unknown, Media_10Base2, Media_Count } ibmlana_medium; /* private structure */ typedef struct { - unsigned int slot; /* MCA-Slot-# */ + unsigned int slot; /* MCA-Slot-# */ struct net_device_stats stat; /* packet statistics */ - int realirq; /* memorizes actual IRQ, even when - currently not allocated */ - ibmlana_medium medium; /* physical cannector */ - u32 tdastart, txbufstart, /* addresses */ - rrastart, rxbufstart, rdastart, rxbufcnt, txusedcnt; - int nextrxdescr, /* next rx descriptor to be used */ - lastrxdescr, /* last free rx descriptor */ - nexttxdescr, /* last tx descriptor to be used */ - currtxdescr, /* tx descriptor currently tx'ed */ - txused[TXBUFCNT]; /* busy flags */ + int realirq; /* memorizes actual IRQ, even when + currently not allocated */ + ibmlana_medium medium; /* physical cannector */ + u32 tdastart, txbufstart, /* addresses */ + rrastart, rxbufstart, rdastart, rxbufcnt, txusedcnt; + int nextrxdescr, /* next rx descriptor to be used */ + lastrxdescr, /* last free rx descriptor */ + nexttxdescr, /* last tx descriptor to be used */ + currtxdescr, /* tx descriptor currently tx'ed */ + txused[TXBUFCNT]; /* busy flags */ + spinlock_t lock; } ibmlana_priv; /* this card uses quite a lot of I/O ports...luckily the MCA bus decodes @@ -289,7 +275,7 @@ typedef struct { #endif /* _IBM_LANA_DRIVER_ */ -extern int ibmlana_probe(struct IBMLANA_NETDEV *); +extern int ibmlana_probe(struct net_device *); #endif /* _IBM_LANA_INCLUDE_ */ diff --git a/drivers/net/pcmcia/3c589_cs.c b/drivers/net/pcmcia/3c589_cs.c index a782e5d0d379..d1453173b29c 100644 --- a/drivers/net/pcmcia/3c589_cs.c +++ b/drivers/net/pcmcia/3c589_cs.c @@ -14,11 +14,13 @@ distributed according to the terms of the GNU General Public License, incorporated herein by reference. Donald Becker may be reached at becker@scyld.com + + Updated for 2.5.x by Alan Cox <alan@redhat.com> ======================================================================*/ #define DRV_NAME "3c589_cs" -#define DRV_VERSION "1.162" +#define DRV_VERSION "1.162-ac" #include <linux/module.h> #include <linux/init.h> @@ -111,9 +113,10 @@ struct el3_private { struct net_device_stats stats; /* For transceiver monitoring */ struct timer_list media; - u_short media_status; - u_short fast_poll; - u_long last_irq; + u16 media_status; + u16 fast_poll; + unsigned long last_irq; + spinlock_t lock; }; static char *if_names[] = { "auto", "10baseT", "10base2", "AUI" }; @@ -148,13 +151,13 @@ DRV_NAME ".c " DRV_VERSION " 2001/10/13 00:08:50 (David Hinds)"; /*====================================================================*/ static void tc589_config(dev_link_t *link); -static void tc589_release(u_long arg); +static void tc589_release(unsigned long arg); static int tc589_event(event_t event, int priority, event_callback_args_t *args); -static u_short read_eeprom(ioaddr_t ioaddr, int index); +static u16 read_eeprom(ioaddr_t ioaddr, int index); static void tc589_reset(struct net_device *dev); -static void media_check(u_long arg); +static void media_check(unsigned long arg); static int el3_config(struct net_device *dev, struct ifmap *map); static int el3_open(struct net_device *dev); static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev); @@ -223,11 +226,13 @@ static dev_link_t *tc589_attach(void) lp = kmalloc(sizeof(*lp), GFP_KERNEL); if (!lp) return NULL; memset(lp, 0, sizeof(*lp)); + spin_lock_init(&lp->lock); + link = &lp->link; dev = &lp->dev; link->priv = dev->priv = link->irq.Instance = lp; link->release.function = &tc589_release; - link->release.data = (u_long)link; + link->release.data = (unsigned long)link; link->io.NumPorts1 = 16; link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; @@ -302,9 +307,9 @@ static void tc589_detach(dev_link_t *link) if (*linkp == NULL) return; - del_timer(&link->release); + del_timer_sync(&link->release); if (link->state & DEV_CONFIG) { - tc589_release((u_long)link); + tc589_release((unsigned long)link); if (link->state & DEV_STALE_CONFIG) { link->state |= DEV_STALE_LINK; return; @@ -340,14 +345,14 @@ static void tc589_config(dev_link_t *link) struct net_device *dev = &lp->dev; tuple_t tuple; cisparse_t parse; - u_short buf[32], *phys_addr; + u16 buf[32], *phys_addr; int last_fn, last_ret, i, j, multi = 0; ioaddr_t ioaddr; char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; DEBUG(0, "3c589_config(0x%p)\n", link); - phys_addr = (u_short *)dev->dev_addr; + phys_addr = (u16 *)dev->dev_addr; tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_CONFIG; CS_CHECK(GetFirstTuple, handle, &tuple); @@ -391,7 +396,7 @@ static void tc589_config(dev_link_t *link) dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; if (register_netdev(dev) != 0) { - printk(KERN_NOTICE "3c589_cs: register_netdev() failed\n"); + printk(KERN_ERR "3c589_cs: register_netdev() failed\n"); goto failed; } @@ -409,7 +414,7 @@ static void tc589_config(dev_link_t *link) for (i = 0; i < 3; i++) phys_addr[i] = htons(read_eeprom(ioaddr, i)); if (phys_addr[0] == 0x6060) { - printk(KERN_NOTICE "3c589_cs: IO port conflict at 0x%03lx" + printk(KERN_ERR "3c589_cs: IO port conflict at 0x%03lx" "-0x%03lx\n", dev->base_addr, dev->base_addr+15); goto failed; } @@ -427,7 +432,7 @@ static void tc589_config(dev_link_t *link) if ((if_port >= 0) && (if_port <= 3)) dev->if_port = if_port; else - printk(KERN_NOTICE "3c589_cs: invalid if_port requested\n"); + printk(KERN_ERR "3c589_cs: invalid if_port requested\n"); printk(KERN_INFO "%s: 3Com 3c%s, io %#3lx, irq %d, hw_addr ", dev->name, (multi ? "562" : "589"), dev->base_addr, @@ -443,7 +448,7 @@ static void tc589_config(dev_link_t *link) cs_failed: cs_error(link->handle, last_fn, last_ret); failed: - tc589_release((u_long)link); + tc589_release((unsigned long)link); return; } /* tc589_config */ @@ -456,7 +461,7 @@ failed: ======================================================================*/ -static void tc589_release(u_long arg) +static void tc589_release(unsigned long arg) { dev_link_t *link = (dev_link_t *)arg; @@ -545,7 +550,7 @@ static void tc589_wait_for_completion(struct net_device *dev, int cmd) while (--i > 0) if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break; if (i == 0) - printk(KERN_NOTICE "%s: command 0x%04x did not complete!\n", + printk(KERN_WARNING "%s: command 0x%04x did not complete!\n", dev->name, cmd); } @@ -553,7 +558,7 @@ static void tc589_wait_for_completion(struct net_device *dev, int cmd) Read a word from the EEPROM using the regular EEPROM access register. Assume that we are in register window zero. */ -static u_short read_eeprom(ioaddr_t ioaddr, int index) +static u16 read_eeprom(ioaddr_t ioaddr, int index) { int i; outw(EEPROM_READ + index, ioaddr + 10); @@ -741,7 +746,7 @@ static int el3_open(struct net_device *dev) tc589_reset(dev); lp->media.function = &media_check; - lp->media.data = (u_long)lp; + lp->media.data = (unsigned long)lp; lp->media.expires = jiffies + HZ; add_timer(&lp->media); @@ -756,7 +761,7 @@ static void el3_tx_timeout(struct net_device *dev) struct el3_private *lp = (struct el3_private *)dev->priv; ioaddr_t ioaddr = dev->base_addr; - printk(KERN_NOTICE "%s: Transmit timed out!\n", dev->name); + printk(KERN_WARNING "%s: Transmit timed out!\n", dev->name); dump_status(dev); lp->stats.tx_errors++; dev->trans_start = jiffies; @@ -832,7 +837,8 @@ static void el3_interrupt(int irq, void *dev_id, struct pt_regs *regs) DEBUG(3, "%s: interrupt, status %4.4x.\n", dev->name, inw(ioaddr + EL3_STATUS)); - + + spin_lock(&lp->lock); while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete | StatsFull)) { if (!netif_device_present(dev) || @@ -867,7 +873,7 @@ static void el3_interrupt(int irq, void *dev_id, struct pt_regs *regs) EL3WINDOW(4); fifo_diag = inw(ioaddr + 4); EL3WINDOW(1); - printk(KERN_NOTICE "%s: adapter failure, FIFO diagnostic" + printk(KERN_WARNING "%s: adapter failure, FIFO diagnostic" " register %04x.\n", dev->name, fifo_diag); if (fifo_diag & 0x0400) { /* Tx overrun */ @@ -885,7 +891,7 @@ static void el3_interrupt(int irq, void *dev_id, struct pt_regs *regs) } if (++i > 10) { - printk(KERN_NOTICE "%s: infinite loop in interrupt, " + printk(KERN_ERR "%s: infinite loop in interrupt, " "status %4.4x.\n", dev->name, status); /* Clear all interrupts */ outw(AckIntr | 0xFF, ioaddr + EL3_CMD); @@ -896,18 +902,19 @@ static void el3_interrupt(int irq, void *dev_id, struct pt_regs *regs) } lp->last_irq = jiffies; + spin_unlock(&lp->lock); DEBUG(3, "%s: exiting interrupt, status %4.4x.\n", dev->name, inw(ioaddr + EL3_STATUS)); return; } -static void media_check(u_long arg) +static void media_check(unsigned long arg) { struct el3_private *lp = (struct el3_private *)(arg); struct net_device *dev = &lp->dev; ioaddr_t ioaddr = dev->base_addr; - u_short media, errs; - u_long flags; + u16 media, errs; + unsigned long flags; if (!netif_device_present(dev)) goto reschedule; @@ -917,7 +924,7 @@ static void media_check(u_long arg) if ((inw(ioaddr + EL3_STATUS) & IntLatch) && (inb(ioaddr + EL3_TIMER) == 0xff)) { if (!lp->fast_poll) - printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name); + printk(KERN_WARNING "%s: interrupt(s) dropped!\n", dev->name); el3_interrupt(dev->irq, lp, NULL); lp->fast_poll = HZ; } @@ -927,9 +934,10 @@ static void media_check(u_long arg) add_timer(&lp->media); return; } - - save_flags(flags); - cli(); + + /* lp->lock guards the EL3 window. Window should always be 1 except + when the lock is held */ + spin_lock_irqsave(&lp->lock, flags); EL3WINDOW(4); media = inw(ioaddr+WN4_MEDIA) & 0xc810; @@ -974,7 +982,7 @@ static void media_check(u_long arg) } EL3WINDOW(1); - restore_flags(flags); + spin_unlock_irqrestore(&lp->lock, flags); reschedule: lp->media.expires = jiffies + HZ; @@ -988,10 +996,9 @@ static struct net_device_stats *el3_get_stats(struct net_device *dev) dev_link_t *link = &lp->link; if (DEV_OK(link)) { - save_flags(flags); - cli(); + spin_lock_irqsave(&lp->lock, flags); update_stats(dev); - restore_flags(flags); + spin_unlock_irqrestore(&lp->lock, flags); } return &lp->stats; } @@ -1001,6 +1008,8 @@ static struct net_device_stats *el3_get_stats(struct net_device *dev) single-threaded if the device is active. This is expected to be a rare operation, and it's simpler for the rest of the driver to assume that window 1 is always valid rather than use a special window-state variable. + + Caller must hold the lock for this */ static void update_stats(struct net_device *dev) { @@ -1079,7 +1088,7 @@ static int el3_rx(struct net_device *dev) tc589_wait_for_completion(dev, RxDiscard); } if (worklimit == 0) - printk(KERN_NOTICE "%s: too much work in el3_rx!\n", dev->name); + printk(KERN_WARNING "%s: too much work in el3_rx!\n", dev->name); return 0; } @@ -1088,7 +1097,7 @@ static void set_multicast_list(struct net_device *dev) struct el3_private *lp = dev->priv; dev_link_t *link = &lp->link; ioaddr_t ioaddr = dev->base_addr; - u_short opts = SetRxFilter | RxStation | RxBroadcast; + u16 opts = SetRxFilter | RxStation | RxBroadcast; if (!(DEV_OK(link))) return; if (dev->flags & IFF_PROMISC) @@ -1135,7 +1144,7 @@ static int el3_close(struct net_device *dev) link->open--; netif_stop_queue(dev); - del_timer(&lp->media); + del_timer_sync(&lp->media); if (link->state & DEV_STALE_CONFIG) mod_timer(&link->release, jiffies + HZ/20); @@ -1152,8 +1161,7 @@ static int __init init_3c589_cs(void) DEBUG(0, "%s\n", version); CardServices(GetCardServicesInfo, &serv); if (serv.Revision != CS_RELEASE_CODE) { - printk(KERN_NOTICE "3c589_cs: Card Services release " - "does not match!\n"); + printk(KERN_ERR "3c589_cs: Card Services release does not match!\n"); return -1; } register_pccard_driver(&dev_info, &tc589_attach, &tc589_detach); diff --git a/drivers/net/smc9194.c b/drivers/net/smc9194.c index 3b7434923520..959a34b51afa 100644 --- a/drivers/net/smc9194.c +++ b/drivers/net/smc9194.c @@ -713,11 +713,6 @@ int __init smc_findirq( int ioaddr ) unsigned long cookie; - /* I have to do a STI() here, because this is called from - a routine that does an CLI during this process, making it - rather difficult to get interrupts for auto detection */ - sti(); - cookie = probe_irq_on(); /* @@ -766,10 +761,6 @@ int __init smc_findirq( int ioaddr ) /* and disable all interrupts again */ outb( 0, ioaddr + INT_MASK ); - /* clear hardware interrupts again, because that's how it - was when I was called... */ - cli(); - /* and return what I found */ return probe_irq_off(cookie); } diff --git a/drivers/net/tokenring/smctr.c b/drivers/net/tokenring/smctr.c index c3a33e385864..6eae368721a0 100644 --- a/drivers/net/tokenring/smctr.c +++ b/drivers/net/tokenring/smctr.c @@ -24,13 +24,12 @@ * * To do: * 1. Multicast support. + * + * Initial 2.5 cleanup Alan Cox <alan@redhat.com> 2002/10/28 */ -#ifdef MODULE #include <linux/module.h> #include <linux/version.h> -#endif - #include <linux/config.h> #include <linux/kernel.h> #include <linux/sched.h> @@ -341,7 +340,7 @@ static int smctr_alloc_shared_memory(struct net_device *dev) struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 10) - printk("%s: smctr_alloc_shared_memory\n", dev->name); + printk(KERN_DEBUG "%s: smctr_alloc_shared_memory\n", dev->name); /* Allocate initial System Control Block pointer. * This pointer is located in the last page, last offset - 4. @@ -456,10 +455,9 @@ static int smctr_bypass_state(struct net_device *dev) int err; if(smctr_debug > 10) - printk("%s: smctr_bypass_state\n", dev->name); + printk(KERN_DEBUG "%s: smctr_bypass_state\n", dev->name); - err = smctr_setup_single_cmd(dev, ACB_CMD_CHANGE_JOIN_STATE, - JS_BYPASS_STATE); + err = smctr_setup_single_cmd(dev, ACB_CMD_CHANGE_JOIN_STATE, JS_BYPASS_STATE); return (err); } @@ -470,7 +468,7 @@ static int smctr_checksum_firmware(struct net_device *dev) __u16 i, checksum = 0; if(smctr_debug > 10) - printk("%s: smctr_checksum_firmware\n", dev->name); + printk(KERN_DEBUG "%s: smctr_checksum_firmware\n", dev->name); smctr_enable_adapter_ctrl_store(dev); @@ -656,7 +654,7 @@ static int smctr_chg_rx_mask(struct net_device *dev) int err = 0; if(smctr_debug > 10) - printk("%s: smctr_chg_rx_mask\n", dev->name); + printk(KERN_DEBUG "%s: smctr_chg_rx_mask\n", dev->name); smctr_enable_16bit(dev); smctr_set_page(dev, (__u8 *)tp->ram_access); @@ -787,7 +785,7 @@ static int smctr_decode_firmware(struct net_device *dev) __u16 *mem; if(smctr_debug > 10) - printk("%s: smctr_decode_firmware\n", dev->name); + printk(KERN_DEBUG "%s: smctr_decode_firmware\n", dev->name); weight = *(long *)(tp->ptr_ucode + WEIGHT_OFFSET); tsize = *(__u8 *)(tp->ptr_ucode + TREE_SIZE_OFFSET); @@ -852,7 +850,7 @@ static int smctr_disable_adapter_ctrl_store(struct net_device *dev) int ioaddr = dev->base_addr; if(smctr_debug > 10) - printk("%s: smctr_disable_adapter_ctrl_store\n", dev->name); + printk(KERN_DEBUG "%s: smctr_disable_adapter_ctrl_store\n", dev->name); tp->trc_mask |= CSR_WCSS; outb(tp->trc_mask, ioaddr + CSR); @@ -898,7 +896,7 @@ static int smctr_enable_adapter_ctrl_store(struct net_device *dev) int ioaddr = dev->base_addr; if(smctr_debug > 10) - printk("%s: smctr_enable_adapter_ctrl_store\n", dev->name); + printk(KERN_DEBUG "%s: smctr_enable_adapter_ctrl_store\n", dev->name); smctr_set_trc_reset(ioaddr); smctr_enable_adapter_ram(dev); @@ -915,7 +913,7 @@ static int smctr_enable_adapter_ram(struct net_device *dev) __u8 r; if(smctr_debug > 10) - printk("%s: smctr_enable_adapter_ram\n", dev->name); + printk(KERN_DEBUG "%s: smctr_enable_adapter_ram\n", dev->name); r = inb(ioaddr + MSR); outb(MSR_MEMB | r, ioaddr + MSR); @@ -958,7 +956,7 @@ static int __init smctr_chk_isa(struct net_device *dev) int i; if(smctr_debug > 10) - printk("%s: smctr_chk_isa %#4x\n", dev->name, ioaddr); + printk(KERN_DEBUG "%s: smctr_chk_isa %#4x\n", dev->name, ioaddr); if((ioaddr & 0x1F) != 0) return (-ENODEV); @@ -979,7 +977,7 @@ static int __init smctr_chk_isa(struct net_device *dev) b = inb(ioaddr + BDID); if(b != BRD_ID_8115T) { - printk("%s: The adapter found is not supported\n", dev->name); + printk(KERN_ERR "%s: The adapter found is not supported\n", dev->name); return (-1); } @@ -1079,7 +1077,7 @@ static int __init smctr_chk_isa(struct net_device *dev) break; default: - printk("%s: No IRQ found aborting\n", dev->name); + printk(KERN_ERR "%s: No IRQ found aborting\n", dev->name); return(-1); } @@ -1159,7 +1157,7 @@ static int __init smctr_chk_isa(struct net_device *dev) /* see if the chip is corrupted if(smctr_read_584_chksum(ioaddr)) { - printk("%s: EEPROM Checksum Failure\n", dev->name); + printk(KERN_ERR "%s: EEPROM Checksum Failure\n", dev->name); return(-1); } */ @@ -1412,7 +1410,7 @@ static FCBlock *smctr_get_tx_fcb(struct net_device *dev, __u16 queue, unsigned short *temp; if(smctr_debug > 20) - printk("smctr_get_tx_fcb\n"); + printk(KERN_DEBUG "smctr_get_tx_fcb\n"); /* check if there is enough FCB blocks */ if(tp->num_tx_fcbs_used[queue] >= tp->num_tx_fcbs[queue]) @@ -1481,7 +1479,7 @@ static int smctr_hardware_send_packet(struct net_device *dev, FCBlock *fcb; if(smctr_debug > 10) - printk("%s: smctr_hardware_send_packet\n", dev->name); + printk(KERN_DEBUG"%s: smctr_hardware_send_packet\n", dev->name); if(tp->status != OPEN) return (-1); @@ -1533,7 +1531,7 @@ static int smctr_init_acbs(struct net_device *dev) ACBlock *acb; if(smctr_debug > 10) - printk("%s: smctr_init_acbs\n", dev->name); + printk(KERN_DEBUG "%s: smctr_init_acbs\n", dev->name); acb = tp->acb_head; acb->cmd_done_status = (ACB_COMMAND_DONE | ACB_COMMAND_SUCCESSFUL); @@ -1576,7 +1574,7 @@ static int smctr_init_adapter(struct net_device *dev) int err; if(smctr_debug > 10) - printk("%s: smctr_init_adapter\n", dev->name); + printk(KERN_DEBUG "%s: smctr_init_adapter\n", dev->name); tp->status = CLOSED; tp->page_offset_mask = (tp->ram_usable * 1024) - 1; @@ -1605,12 +1603,12 @@ static int smctr_init_adapter(struct net_device *dev) if(smctr_checksum_firmware(dev)) { - printk("%s: Previously loaded firmware is missing\n",dev->name); return (-ENOENT); + printk(KERN_ERR "%s: Previously loaded firmware is missing\n",dev->name); return (-ENOENT); } if((err = smctr_ram_memory_test(dev))) { - printk("%s: RAM memory test failed.\n", dev->name); + printk(KERN_ERR "%s: RAM memory test failed.\n", dev->name); return (-EIO); } @@ -1621,7 +1619,7 @@ static int smctr_init_adapter(struct net_device *dev) smctr_reset_adapter(dev); if((err = smctr_init_card_real(dev))) { - printk("%s: Initialization of card failed (%d)\n", + printk(KERN_ERR "%s: Initialization of card failed (%d)\n", dev->name, err); return (-EINVAL); } @@ -1629,7 +1627,7 @@ static int smctr_init_adapter(struct net_device *dev) /* This routine clobbers the TRC's internal registers. */ if((err = smctr_internal_self_test(dev))) { - printk("%s: Card failed internal self test (%d)\n", + printk(KERN_ERR "%s: Card failed internal self test (%d)\n", dev->name, err); return (-EINVAL); } @@ -1638,7 +1636,7 @@ static int smctr_init_adapter(struct net_device *dev) smctr_reset_adapter(dev); if((err = smctr_init_card_real(dev))) { - printk("%s: Initialization of card failed (%d)\n", + printk(KERN_ERR "%s: Initialization of card failed (%d)\n", dev->name, err); return (-EINVAL); } @@ -1657,7 +1655,7 @@ static int smctr_init_adapter(struct net_device *dev) static int __init smctr_init_card(struct net_device *dev) { if(smctr_debug > 10) - printk("%s: smctr_init_card\n", dev->name); + printk(KERN_DEBUG "%s: smctr_init_card\n", dev->name); return (0); } @@ -1668,7 +1666,7 @@ static int smctr_init_card_real(struct net_device *dev) int err = 0; if(smctr_debug > 10) - printk("%s: smctr_init_card_real\n", dev->name); + printk(KERN_DEBUG "%s: smctr_init_card_real\n", dev->name); tp->sh_mem_used = 0; tp->num_acbs = NUM_OF_ACBS; @@ -1731,7 +1729,7 @@ static int smctr_init_card_real(struct net_device *dev) if((err = smctr_issue_init_txrx_cmd(dev))) { - printk("%s: Hardware failure\n", dev->name); + printk(KERN_ERR "%s: Hardware failure\n", dev->name); return (err); } @@ -1746,7 +1744,7 @@ static int smctr_init_rx_bdbs(struct net_device *dev) __u16 *buf; if(smctr_debug > 10) - printk("%s: smctr_init_rx_bdbs\n", dev->name); + printk(KERN_DEBUG "%s: smctr_init_rx_bdbs\n", dev->name); for(i = 0; i < NUM_RX_QS_USED; i++) { @@ -1847,7 +1845,7 @@ static int smctr_init_shared_memory(struct net_device *dev) __u32 *iscpb; if(smctr_debug > 10) - printk("%s: smctr_init_shared_memory\n", dev->name); + printk(KERN_DEBUG "%s: smctr_init_shared_memory\n", dev->name); smctr_set_page(dev, (__u8 *)(unsigned int)tp->iscpb_ptr); @@ -2017,16 +2015,19 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs) if(dev == NULL) { - printk("%s: irq %d for unknown device.\n", dev->name, irq); + printk(KERN_CRIT "%s: irq %d for unknown device.\n", dev->name, irq); return; } ioaddr = dev->base_addr; tp = (struct net_local *)dev->priv; + if(tp->status == NOT_INITIALIZED) return; + spin_lock(&tp->lock); + smctr_disable_bic_int(dev); smctr_enable_16bit(dev); @@ -2046,6 +2047,7 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs) if(isb_type >= 0x10) { smctr_disable_16bit(dev); + spin_unlock(&tp->lock); return; } @@ -2063,56 +2065,45 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs) switch(isb_subtype) { case 0: - tp->monitor_state - = MS_MONITOR_FSM_INACTIVE; - break; + tp->monitor_state = MS_MONITOR_FSM_INACTIVE; + break; case 1: - tp->monitor_state - = MS_REPEAT_BEACON_STATE; + tp->monitor_state = MS_REPEAT_BEACON_STATE; break; case 2: - tp->monitor_state - = MS_REPEAT_CLAIM_TOKEN_STATE; + tp->monitor_state = MS_REPEAT_CLAIM_TOKEN_STATE; break; case 3: - tp->monitor_state - = MS_TRANSMIT_CLAIM_TOKEN_STATE; break; + tp->monitor_state = MS_TRANSMIT_CLAIM_TOKEN_STATE; break; case 4: - tp->monitor_state - = MS_STANDBY_MONITOR_STATE; + tp->monitor_state = MS_STANDBY_MONITOR_STATE; break; case 5: - tp->monitor_state - = MS_TRANSMIT_BEACON_STATE; + tp->monitor_state = MS_TRANSMIT_BEACON_STATE; break; case 6: - tp->monitor_state - = MS_ACTIVE_MONITOR_STATE; + tp->monitor_state = MS_ACTIVE_MONITOR_STATE; break; case 7: - tp->monitor_state - = MS_TRANSMIT_RING_PURGE_STATE; + tp->monitor_state = MS_TRANSMIT_RING_PURGE_STATE; break; case 8: /* diagnostic state */ break; case 9: - tp->monitor_state - = MS_BEACON_TEST_STATE; + tp->monitor_state = MS_BEACON_TEST_STATE; if(smctr_lobe_media_test(dev)) { - tp->ring_status_flags - = RING_STATUS_CHANGED; - tp->ring_status - = AUTO_REMOVAL_ERROR; + tp->ring_status_flags = RING_STATUS_CHANGED; + tp->ring_status = AUTO_REMOVAL_ERROR; smctr_ring_status_chg(dev); smctr_bypass_state(dev); } @@ -2162,16 +2153,14 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* BUG QUEUE for TRC stuck receive BUG */ if(isb_subtype & TX_PENDING_PRIORITY_2) { - if((err = smctr_tx_complete(dev, - BUG_QUEUE)) != SUCCESS) + if((err = smctr_tx_complete(dev, BUG_QUEUE)) != SUCCESS) break; } /* NON-MAC frames only */ if(isb_subtype & TX_PENDING_PRIORITY_1) { - if((err = smctr_tx_complete(dev, - NON_MAC_QUEUE)) != SUCCESS) + if((err = smctr_tx_complete(dev, NON_MAC_QUEUE)) != SUCCESS) break; } @@ -2189,40 +2178,31 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs) */ interrupt_unmask_bits |= 0x800; - tp->tx_queue_status[BUG_QUEUE] - = NOT_TRANSMITING; - if((err = smctr_tx_complete(dev, - BUG_QUEUE)) != SUCCESS) + tp->tx_queue_status[BUG_QUEUE] = NOT_TRANSMITING; + if((err = smctr_tx_complete(dev, BUG_QUEUE)) != SUCCESS) break; - if((err = smctr_restart_tx_chain(dev, - BUG_QUEUE)) != SUCCESS) + if((err = smctr_restart_tx_chain(dev, BUG_QUEUE)) != SUCCESS) break; } /* NON-MAC queue only */ if(isb_subtype & TX_PENDING_PRIORITY_1) { - tp->tx_queue_status[NON_MAC_QUEUE] - = NOT_TRANSMITING; - if((err = smctr_tx_complete(dev, - NON_MAC_QUEUE)) != SUCCESS) + tp->tx_queue_status[NON_MAC_QUEUE] = NOT_TRANSMITING; + if((err = smctr_tx_complete(dev, NON_MAC_QUEUE)) != SUCCESS) break; - if((err = smctr_restart_tx_chain(dev, - NON_MAC_QUEUE)) != SUCCESS) + if((err = smctr_restart_tx_chain(dev, NON_MAC_QUEUE)) != SUCCESS) break; } /* MAC queue only */ if(isb_subtype & TX_PENDING_PRIORITY_0) { - tp->tx_queue_status[MAC_QUEUE] - = NOT_TRANSMITING; - if((err = smctr_tx_complete(dev, - MAC_QUEUE)) != SUCCESS) + tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING; + if((err = smctr_tx_complete(dev, MAC_QUEUE)) != SUCCESS) break; - err = smctr_restart_tx_chain(dev, - MAC_QUEUE); + err = smctr_restart_tx_chain(dev, MAC_QUEUE); } break; @@ -2328,7 +2308,7 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs) * complete posted */ interrupt_unmask_bits &= (~0x800); - printk("Jay please send bug\n");// smctr_send_bug(dev); + printk(KERN_CRIT "Jay please send bug\n");// smctr_send_bug(dev); } if(tp->ptr_rx_fifo_overruns) @@ -2346,7 +2326,7 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs) err = SUCCESS; if(tp->acb_head->cmd == ACB_CMD_HIC_NOP) { - printk("i1\n"); + printk(KERN_ERR "i1\n"); smctr_disable_16bit(dev); /* XXXXXXXXXXXXXXXXX */ @@ -2387,8 +2367,7 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs) if(err != SUCCESS) { - tp->acb_pending -= 0; + tp->acb_pending = 0; break; } } @@ -2397,18 +2376,14 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs) { if(tp->ptr_una) { - tp->ptr_una[0] - = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[0]); - tp->ptr_una[1] - = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[1]); - tp->ptr_una[2] - = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[2]); + tp->ptr_una[0] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[0]); + tp->ptr_una[1] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[1]); + tp->ptr_una[2] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[2]); } } - if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate - & READY_TO_SEND_RQ_INIT) { + if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & READY_TO_SEND_RQ_INIT) { err = smctr_send_rq_init(dev); } } @@ -2446,45 +2421,37 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs) break; case 1: - tp->join_state - = JS_LOBE_TEST_STATE; + tp->join_state = JS_LOBE_TEST_STATE; break; case 2: - tp->join_state - = JS_DETECT_MONITOR_PRESENT_STATE; + tp->join_state = JS_DETECT_MONITOR_PRESENT_STATE; break; case 3: - tp->join_state - = JS_AWAIT_NEW_MONITOR_STATE; + tp->join_state = JS_AWAIT_NEW_MONITOR_STATE; break; case 4: - tp->join_state - = JS_DUPLICATE_ADDRESS_TEST_STATE; + tp->join_state = JS_DUPLICATE_ADDRESS_TEST_STATE; break; case 5: - tp->join_state - = JS_NEIGHBOR_NOTIFICATION_STATE; + tp->join_state = JS_NEIGHBOR_NOTIFICATION_STATE; break; case 6: - tp->join_state - = JS_REQUEST_INITIALIZATION_STATE; + tp->join_state = JS_REQUEST_INITIALIZATION_STATE; break; case 7: - tp->join_state - = JS_JOIN_COMPLETE_STATE; + tp->join_state = JS_JOIN_COMPLETE_STATE; tp->status = OPEN; err = smctr_status_chg(dev); break; case 8: - tp->join_state - = JS_BYPASS_WAIT_STATE; + tp->join_state = JS_BYPASS_WAIT_STATE; break; } break ; @@ -2514,11 +2481,11 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs) * but we still want to issue ack to ISB */ if(!(interrupt_ack_code & 0xff00)) - smctr_issue_int_ack(dev, interrupt_ack_code, - interrupt_unmask_bits); + smctr_issue_int_ack(dev, interrupt_ack_code, interrupt_unmask_bits); smctr_disable_16bit(dev); smctr_enable_bic_int(dev); + spin_unlock(&tp->lock); return; } @@ -2533,16 +2500,14 @@ static int smctr_issue_enable_int_cmd(struct net_device *dev, return (err); tp->sclb_ptr->int_mask_control = interrupt_enable_mask; - tp->sclb_ptr->valid_command = SCLB_VALID - | SCLB_CMD_CLEAR_INTERRUPT_MASK; + tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_CMD_CLEAR_INTERRUPT_MASK; smctr_set_ctrl_attention(dev); return (0); } -static int smctr_issue_int_ack(struct net_device *dev, __u16 iack_code, - __u16 ibits) +static int smctr_issue_int_ack(struct net_device *dev, __u16 iack_code, __u16 ibits) { struct net_local *tp = (struct net_local *)dev->priv; @@ -2551,9 +2516,7 @@ static int smctr_issue_int_ack(struct net_device *dev, __u16 iack_code, tp->sclb_ptr->int_mask_control = ibits; tp->sclb_ptr->iack_code = iack_code << 1; /* use the offset from base */ tp->sclb_ptr->resume_control = 0; - tp->sclb_ptr->valid_command = - SCLB_VALID | SCLB_IACK_CODE_VALID - | SCLB_CMD_CLEAR_INTERRUPT_MASK; + tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_IACK_CODE_VALID | SCLB_CMD_CLEAR_INTERRUPT_MASK; smctr_set_ctrl_attention(dev); @@ -2729,7 +2692,7 @@ static int smctr_issue_init_txrx_cmd(struct net_device *dev) if((err = smctr_wait_cmd(dev))) { - printk("%s: Hardware failure\n", dev->name); + printk(KERN_ERR "%s: Hardware failure\n", dev->name); return (err); } @@ -2864,7 +2827,7 @@ static int smctr_issue_resume_rx_fcb_cmd(struct net_device *dev, __u16 queue) struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 10) - printk("%s: smctr_issue_resume_rx_fcb_cmd\n", dev->name); + printk(KERN_DEBUG "%s: smctr_issue_resume_rx_fcb_cmd\n", dev->name); if(smctr_wait_while_cbusy(dev)) return (-1); @@ -2886,7 +2849,7 @@ static int smctr_issue_resume_tx_fcb_cmd(struct net_device *dev, __u16 queue) struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 10) - printk("%s: smctr_issue_resume_tx_fcb_cmd\n", dev->name); + printk(KERN_DEBUG "%s: smctr_issue_resume_tx_fcb_cmd\n", dev->name); if(smctr_wait_while_cbusy(dev)) return (-1); @@ -3035,7 +2998,7 @@ static int smctr_load_firmware(struct net_device *dev) int err = 0; if(smctr_debug > 10) - printk("%s: smctr_load_firmware\n", dev->name); + printk(KERN_DEBUG "%s: smctr_load_firmware\n", dev->name); tp->ptr_ucode = smctr_code; tp->num_of_tx_buffs = 4; @@ -3151,7 +3114,7 @@ static int smctr_lobe_media_test(struct net_device *dev) unsigned short saved_rcv_mask; if(smctr_debug > 10) - printk("%s: smctr_lobe_media_test\n", dev->name); + printk(KERN_DEBUG "%s: smctr_lobe_media_test\n", dev->name); /* Clear receive mask for lobe test. */ saved_rcv_mask = tp->receive_mask; @@ -3225,7 +3188,7 @@ static int smctr_lobe_media_test_cmd(struct net_device *dev) int err; if(smctr_debug > 10) - printk("%s: smctr_lobe_media_test_cmd\n", dev->name); + printk(KERN_DEBUG "%s: smctr_lobe_media_test_cmd\n", dev->name); /* Change to lobe media test state. */ if(tp->monitor_state != MS_BEACON_TEST_STATE) @@ -3233,7 +3196,7 @@ static int smctr_lobe_media_test_cmd(struct net_device *dev) smctr_lobe_media_test_state(dev); if(smctr_wait_cmd(dev)) { - printk("Lobe Failed test state\n"); + printk(KERN_ERR "Lobe Failed test state\n"); return (LOBE_MEDIA_TEST_FAILED); } } @@ -3548,7 +3511,7 @@ static int smctr_open(struct net_device *dev) int err; if(smctr_debug > 10) - printk("%s: smctr_open\n", dev->name); + printk(KERN_DEBUG "%s: smctr_open\n", dev->name); err = smctr_init_adapter(dev); if(err < 0) @@ -3569,7 +3532,7 @@ static int smctr_open_tr(struct net_device *dev) int err; if(smctr_debug > 10) - printk("%s: smctr_open_tr\n", dev->name); + printk(KERN_DEBUG "%s: smctr_open_tr\n", dev->name); /* Now we can actually open the adapter. */ if(tp->status == OPEN) @@ -3577,9 +3540,10 @@ static int smctr_open_tr(struct net_device *dev) if(tp->status != INITIALIZED) return (-1); - save_flags(flags); - cli(); - + /* FIXME: it would work a lot better if we masked the irq sources + on the card here, then we could skip the locking and poll nicely */ + spin_lock_irqsave(&tp->lock, flags); + smctr_set_page(dev, (__u8 *)tp->ram_access); if((err = smctr_issue_resume_rx_fcb_cmd(dev, (short)MAC_QUEUE))) @@ -3642,14 +3606,14 @@ static int smctr_open_tr(struct net_device *dev) else { if(err == LOBE_MEDIA_TEST_FAILED) - printk("%s: Lobe Media Test Failure - Check cable?\n", dev->name); + printk(KERN_WARNING "%s: Lobe Media Test Failure - Check cable?\n", dev->name); } } } } out: - restore_flags(flags); + spin_unlock_irqrestore(&tp->lock, flags); return (err); } @@ -3704,6 +3668,8 @@ static int __init smctr_probe1(struct net_device *dev, int ioaddr) goto out; } memset(tp, 0, sizeof(struct net_local)); + spin_lock_init(&tp->lock); + dev->priv = tp; dev->base_addr = ioaddr; @@ -3727,7 +3693,7 @@ static int __init smctr_probe1(struct net_device *dev, int ioaddr) err = smctr_load_firmware(dev); if(err != UCODE_PRESENT && err != SUCCESS) { - printk("%s: Firmware load failed (%d)\n", dev->name, err); + printk(KERN_ERR "%s: Firmware load failed (%d)\n", dev->name, err); err = -EIO; goto out_tp; } @@ -3738,7 +3704,7 @@ static int __init smctr_probe1(struct net_device *dev, int ioaddr) else tp->media_type = MEDIA_UTP_16; - printk("%s: %s %s at Io %#4x, Irq %d, Rom %#4x, Ram %#4x.\n", + printk(KERN_INFO "%s: %s %s at Io %#4x, Irq %d, Rom %#4x, Ram %#4x.\n", dev->name, smctr_name, smctr_model, (unsigned int)dev->base_addr, dev->irq, tp->rom_base, tp->ram_base); @@ -3777,8 +3743,7 @@ static int smctr_process_rx_packet(MAC_HEADER *rmf, __u16 size, { /* Received MAC Frames Processed by RS. */ case INIT: - if((rcode = smctr_rcv_init(dev, rmf, - &correlator)) == HARDWARE_FAILED) + if((rcode = smctr_rcv_init(dev, rmf, &correlator)) == HARDWARE_FAILED) { return (rcode); } @@ -3993,7 +3958,7 @@ static int smctr_ram_memory_test(struct net_device *dev) __u8 err = 0; if(smctr_debug > 10) - printk("%s: smctr_ram_memory_test\n", dev->name); + printk(KERN_DEBUG "%s: smctr_ram_memory_test\n", dev->name); start_pattern = 0x0001; pages_of_ram = tp->ram_size / tp->ram_usable; @@ -4401,7 +4366,7 @@ static int smctr_restart_tx_chain(struct net_device *dev, short queue) int err = 0; if(smctr_debug > 10) - printk("%s: smctr_restart_tx_chain\n", dev->name); + printk(KERN_DEBUG "%s: smctr_restart_tx_chain\n", dev->name); if(tp->num_tx_fcbs_used[queue] != 0 && tp->tx_queue_status[queue] == NOT_TRANSMITING) @@ -4418,7 +4383,7 @@ static int smctr_ring_status_chg(struct net_device *dev) struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 10) - printk("%s: smctr_ring_status_chg\n", dev->name); + printk(KERN_DEBUG "%s: smctr_ring_status_chg\n", dev->name); /* Check for ring_status_flag: whenever MONITOR_STATE_BIT * Bit is set, check value of monitor_state, only then we @@ -4502,7 +4467,7 @@ static int smctr_ring_status_chg(struct net_device *dev) break; case SIGNAL_LOSS: - printk(KERN_INFO "%s: Singal Loss\n", dev->name); + printk(KERN_INFO "%s: Signal Loss\n", dev->name); tp->current_ring_status |= SIGNAL_LOSS; break; @@ -4522,9 +4487,8 @@ static int smctr_rx_frame(struct net_device *dev) __u8 *pbuff; if(smctr_debug > 10) - printk("%s: smctr_rx_frame\n", dev->name); + printk(KERN_DEBUG "%s: smctr_rx_frame\n", dev->name); - cli(); queue = tp->receive_queue_number; while((status = tp->rx_fcb_curr[queue]->frame_status) != SUCCESS) @@ -4554,7 +4518,6 @@ static int smctr_rx_frame(struct net_device *dev) skb_put(skb, rx_size); memcpy(skb->data, pbuff, rx_size); - sti(); /* Update Counters */ tp->MacStat.rx_packets++; @@ -4566,7 +4529,6 @@ static int smctr_rx_frame(struct net_device *dev) netif_rx(skb); dev->last_rx = jiffies; } else { - sti(); } } else @@ -4593,7 +4555,7 @@ static int smctr_send_dat(struct net_device *dev) FCBlock *fcb; if(smctr_debug > 10) - printk("%s: smctr_send_dat\n", dev->name); + printk(KERN_DEBUG "%s: smctr_send_dat\n", dev->name); if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER))) == (FCBlock *)(-1L)) @@ -4670,7 +4632,7 @@ static int smctr_send_packet(struct sk_buff *skb, struct net_device *dev) struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 10) - printk("%s: smctr_send_packet\n", dev->name); + printk(KERN_DEBUG "%s: smctr_send_packet\n", dev->name); /* * Block a transmit overlap @@ -4700,7 +4662,7 @@ static int smctr_send_lobe_media_test(struct net_device *dev) int err; if(smctr_debug > 15) - printk("%s: smctr_send_lobe_media_test\n", dev->name); + printk(KERN_DEBUG "%s: smctr_send_lobe_media_test\n", dev->name); if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(struct trh_hdr) + S_WRAP_DATA + S_WRAP_DATA)) == (FCBlock *)(-1L)) @@ -5241,7 +5203,7 @@ static unsigned short smctr_set_ctrl_attention(struct net_device *dev) static void smctr_set_multicast_list(struct net_device *dev) { if(smctr_debug > 10) - printk("%s: smctr_set_multicast_list\n", dev->name); + printk(KERN_DEBUG "%s: smctr_set_multicast_list\n", dev->name); return; } @@ -5310,7 +5272,7 @@ static int smctr_set_rx_look_ahead(struct net_device *dev) __u16 sword, rword; if(smctr_debug > 10) - printk("%s: smctr_set_rx_look_ahead_flag\n", dev->name); + printk(KERN_DEBUG "%s: smctr_set_rx_look_ahead_flag\n", dev->name); tp->adapter_flags &= ~(FORCED_16BIT_MODE); tp->adapter_flags |= RX_VALID_LOOKAHEAD; @@ -5353,7 +5315,7 @@ static int smctr_setup_single_cmd(struct net_device *dev, unsigned int err; if(smctr_debug > 10) - printk("%s: smctr_setup_single_cmd\n", dev->name); + printk(KERN_DEBUG "%s: smctr_setup_single_cmd\n", dev->name); if((err = smctr_wait_while_cbusy(dev))) return (err); @@ -5403,7 +5365,7 @@ static int smctr_status_chg(struct net_device *dev) struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 10) - printk("%s: smctr_status_chg\n", dev->name); + printk(KERN_DEBUG "%s: smctr_status_chg\n", dev->name); switch(tp->status) { @@ -5440,7 +5402,7 @@ static int smctr_trc_send_packet(struct net_device *dev, FCBlock *fcb, int err = 0; if(smctr_debug > 10) - printk("%s: smctr_trc_send_packet\n", dev->name); + printk(KERN_DEBUG "%s: smctr_trc_send_packet\n", dev->name); fcb->info = FCB_CHAIN_END | FCB_ENABLE_TFS; if(tp->num_tx_fcbs[queue] != 1) @@ -5462,7 +5424,7 @@ static __u16 smctr_tx_complete(struct net_device *dev, __u16 queue) int cstatus; if(smctr_debug > 10) - printk("%s: smctr_tx_complete\n", dev->name); + printk(KERN_DEBUG "%s: smctr_tx_complete\n", dev->name); while((status = tp->tx_fcb_end[queue]->frame_status) != SUCCESS) { @@ -5518,7 +5480,7 @@ static unsigned short smctr_tx_move_frame(struct net_device *dev, __u8 *frag, *page; if(smctr_debug > 10) - printk("%s: smctr_tx_move_frame\n", dev->name); + printk(KERN_DEBUG "%s: smctr_tx_move_frame\n", dev->name); ram_usable = ((unsigned int)tp->ram_usable) << 10; frag = skb->data; @@ -5636,7 +5598,7 @@ static int smctr_update_tx_chain(struct net_device *dev, FCBlock *fcb, struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 20) - printk("smctr_update_tx_chain\n"); + printk(KERN_DEBUG "smctr_update_tx_chain\n"); if(tp->num_tx_fcbs_used[queue] <= 0) return (HARDWARE_FAILED); @@ -5673,7 +5635,7 @@ static int smctr_wait_cmd(struct net_device *dev) unsigned int loop_count = 0x20000; if(smctr_debug > 10) - printk("%s: smctr_wait_cmd\n", dev->name); + printk(KERN_DEBUG "%s: smctr_wait_cmd\n", dev->name); while(loop_count) { @@ -5764,7 +5726,7 @@ int init_module(void) dev_smctr[i] = NULL; if(i == 0) { - printk("%s: register_trdev() returned (<0).\n", + printk(KERN_ERR "%s: register_trdev() returned (<0).\n", cardname); return (-EIO); } diff --git a/drivers/net/tokenring/smctr.h b/drivers/net/tokenring/smctr.h index 5865e55c9c74..b306c7e4c793 100644 --- a/drivers/net/tokenring/smctr.h +++ b/drivers/net/tokenring/smctr.h @@ -1050,6 +1050,8 @@ typedef struct net_local { __u16 QueueSkb; struct tr_statistics MacStat; /* MAC statistics structure */ + + spinlock_t lock; } NET_LOCAL; /************************************ diff --git a/drivers/net/wan/c101.c b/drivers/net/wan/c101.c index 82628d136ef1..bf879f910abc 100644 --- a/drivers/net/wan/c101.c +++ b/drivers/net/wan/c101.c @@ -175,9 +175,8 @@ static int c101_close(struct net_device *dev) static int c101_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - union line_settings *line = &ifr->ifr_settings->ifs_line; const size_t size = sizeof(sync_serial_settings); - sync_serial_settings new_line; + sync_serial_settings new_line, *line = ifr->ifr_settings.ifs_ifsu.sync; hdlc_device *hdlc = dev_to_hdlc(dev); port_t *port = hdlc_to_port(hdlc); @@ -190,10 +189,14 @@ static int c101_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (cmd != SIOCWANDEV) return hdlc_ioctl(dev, ifr, cmd); - switch(ifr->ifr_settings->type) { + switch(ifr->ifr_settings.type) { case IF_GET_IFACE: - ifr->ifr_settings->type = IF_IFACE_SYNC_SERIAL; - if (copy_to_user(&line->sync, &port->settings, size)) + ifr->ifr_settings.type = IF_IFACE_SYNC_SERIAL; + if (ifr->ifr_settings.size < size) { + ifr->ifr_settings.size = size; /* data size wanted */ + return -ENOBUFS; + } + if (copy_to_user(line, &port->settings, size)) return -EFAULT; return 0; @@ -201,7 +204,7 @@ static int c101_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if(!capable(CAP_NET_ADMIN)) return -EPERM; - if (copy_from_user(&new_line, &line->sync, size)) + if (copy_from_user(&new_line, line, size)) return -EFAULT; if (new_line.clock_type != CLOCK_EXT && diff --git a/drivers/net/wan/cycx_main.c b/drivers/net/wan/cycx_main.c index ce1adafaa560..7fc685acf554 100644 --- a/drivers/net/wan/cycx_main.c +++ b/drivers/net/wan/cycx_main.c @@ -44,7 +44,6 @@ #include <linux/kernel.h> /* printk(), and other useful stuff */ #include <linux/module.h> /* support for loadable modules */ #include <linux/ioport.h> /* request_region(), release_region() */ -#include <linux/tqueue.h> /* for kernel task queues */ #include <linux/wanrouter.h> /* WAN router definitions */ #include <linux/cyclomx.h> /* cyclomx common user API definitions */ #include <asm/uaccess.h> /* kernel <-> user copy */ diff --git a/drivers/net/wan/dscc4.c b/drivers/net/wan/dscc4.c index 88f751da1447..aa2e9cbf93f8 100644 --- a/drivers/net/wan/dscc4.c +++ b/drivers/net/wan/dscc4.c @@ -1144,7 +1144,7 @@ done: static int dscc4_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - union line_settings *line = &ifr->ifr_settings->ifs_line; + sync_serial_settings *line = ifr->ifr_settings.ifs_ifsu.sync; struct dscc4_dev_priv *dpriv = dscc4_priv(dev); const size_t size = sizeof(dpriv->settings); int ret = 0; @@ -1155,10 +1155,14 @@ static int dscc4_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (cmd != SIOCWANDEV) return -EOPNOTSUPP; - switch(ifr->ifr_settings->type) { + switch(ifr->ifr_settings.type) { case IF_GET_IFACE: - ifr->ifr_settings->type = IF_IFACE_SYNC_SERIAL; - if (copy_to_user(&line->sync, &dpriv->settings, size)) + ifr->ifr_settings.type = IF_IFACE_SYNC_SERIAL; + if (ifr->ifr_settings.size < size) { + ifr->ifr_settings.size = size; /* data size wanted */ + return -ENOBUFS; + } + if (copy_to_user(line, &dpriv->settings, size)) return -EFAULT; break; @@ -1166,7 +1170,7 @@ static int dscc4_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (copy_from_user(&dpriv->settings, &line->sync, size)) + if (copy_from_user(&dpriv->settings, line, size)) return -EFAULT; ret = dscc4_set_iface(dpriv, dev); break; diff --git a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c index 4544cfd2ded9..01c96aea4eee 100644 --- a/drivers/net/wan/farsync.c +++ b/drivers/net/wan/farsync.c @@ -1010,11 +1010,11 @@ static int fst_set_iface ( struct fst_card_info *card, struct fst_port_info *port, struct ifreq *ifr ) { - union line_settings *line = &ifr->ifr_settings->ifs_line; sync_serial_settings sync; int i; - if ( copy_from_user ( &sync, &line->sync, sizeof ( sync ))) + if (copy_from_user (&sync, ifr->ifr_settings.ifs_ifsu.sync, + sizeof (sync))) return -EFAULT; if ( sync.loopback ) @@ -1022,7 +1022,7 @@ fst_set_iface ( struct fst_card_info *card, struct fst_port_info *port, i = port->index; - switch ( ifr->ifr_settings->type ) + switch (ifr->ifr_settings.type) { case IF_IFACE_V35: FST_WRW ( card, portConfig[i].lineInterface, V35 ); @@ -1067,7 +1067,6 @@ static int fst_get_iface ( struct fst_card_info *card, struct fst_port_info *port, struct ifreq *ifr ) { - union line_settings *line = &ifr->ifr_settings->ifs_line; sync_serial_settings sync; int i; @@ -1078,24 +1077,30 @@ fst_get_iface ( struct fst_card_info *card, struct fst_port_info *port, switch ( port->hwif ) { case V35: - ifr->ifr_settings->type = IF_IFACE_V35; + ifr->ifr_settings.type = IF_IFACE_V35; break; case V24: - ifr->ifr_settings->type = IF_IFACE_V24; + ifr->ifr_settings.type = IF_IFACE_V24; break; case X21: default: - ifr->ifr_settings->type = IF_IFACE_X21; + ifr->ifr_settings.type = IF_IFACE_X21; break; } + if (ifr->ifr_settings.size < sizeof(sync)) { + ifr->ifr_settings.size = sizeof(sync); /* data size wanted */ + return -ENOBUFS; + } + i = port->index; sync.clock_rate = FST_RDL ( card, portConfig[i].lineSpeed ); /* Lucky card and linux use same encoding here */ sync.clock_type = FST_RDB ( card, portConfig[i].internalClock ); sync.loopback = 0; - if ( copy_to_user (&line->sync, &sync, sizeof ( sync ))) + if (copy_to_user (ifr->ifr_settings.ifs_ifsu.sync, &sync, + sizeof(sync))) return -EFAULT; return 0; @@ -1221,7 +1226,7 @@ fst_ioctl ( struct net_device *dev, struct ifreq *ifr, int cmd ) return set_conf_from_info ( card, port, &info ); case SIOCWANDEV: - switch ( ifr->ifr_settings->type ) + switch (ifr->ifr_settings.type) { case IF_GET_IFACE: return fst_get_iface ( card, port, ifr ); diff --git a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c index c9bc0189e1a6..98bb396878e3 100644 --- a/drivers/net/wan/hdlc_cisco.c +++ b/drivers/net/wan/hdlc_cisco.c @@ -247,15 +247,19 @@ static void cisco_close(hdlc_device *hdlc) int hdlc_cisco_ioctl(hdlc_device *hdlc, struct ifreq *ifr) { - cisco_proto *cisco_s = &ifr->ifr_settings->ifs_hdlc.cisco; + cisco_proto *cisco_s = ifr->ifr_settings.ifs_ifsu.cisco; const size_t size = sizeof(cisco_proto); cisco_proto new_settings; struct net_device *dev = hdlc_to_dev(hdlc); int result; - switch (ifr->ifr_settings->type) { + switch (ifr->ifr_settings.type) { case IF_GET_PROTO: - ifr->ifr_settings->type = IF_PROTO_CISCO; + ifr->ifr_settings.type = IF_PROTO_CISCO; + if (ifr->ifr_settings.size < size) { + ifr->ifr_settings.size = size; /* data size wanted */ + return -ENOBUFS; + } if (copy_to_user(cisco_s, &hdlc->state.cisco.settings, size)) return -EFAULT; return 0; diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c index 1860683b44a9..fc18a8a0c7a9 100644 --- a/drivers/net/wan/hdlc_fr.c +++ b/drivers/net/wan/hdlc_fr.c @@ -778,16 +778,20 @@ static void fr_destroy(hdlc_device *hdlc) int hdlc_fr_ioctl(hdlc_device *hdlc, struct ifreq *ifr) { - fr_proto *fr_s = &ifr->ifr_settings->ifs_hdlc.fr; + fr_proto *fr_s = ifr->ifr_settings.ifs_ifsu.fr; const size_t size = sizeof(fr_proto); fr_proto new_settings; struct net_device *dev = hdlc_to_dev(hdlc); fr_proto_pvc pvc; int result; - switch (ifr->ifr_settings->type) { + switch (ifr->ifr_settings.type) { case IF_GET_PROTO: - ifr->ifr_settings->type = IF_PROTO_FR; + ifr->ifr_settings.type = IF_PROTO_FR; + if (ifr->ifr_settings.size < size) { + ifr->ifr_settings.size = size; /* data size wanted */ + return -ENOBUFS; + } if (copy_to_user(fr_s, &hdlc->state.fr.settings, size)) return -EFAULT; return 0; @@ -847,12 +851,12 @@ int hdlc_fr_ioctl(hdlc_device *hdlc, struct ifreq *ifr) if(!capable(CAP_NET_ADMIN)) return -EPERM; - if (copy_from_user(&pvc, &ifr->ifr_settings->ifs_hdlc.fr_pvc, + if (copy_from_user(&pvc, ifr->ifr_settings.ifs_ifsu.fr_pvc, sizeof(fr_proto_pvc))) return -EFAULT; return fr_pvc(hdlc, pvc.dlci, - ifr->ifr_settings->type == IF_PROTO_FR_ADD_PVC); + ifr->ifr_settings.type == IF_PROTO_FR_ADD_PVC); } return -EINVAL; diff --git a/drivers/net/wan/hdlc_generic.c b/drivers/net/wan/hdlc_generic.c index e39b7f871afb..8f00c3e7f714 100644 --- a/drivers/net/wan/hdlc_generic.c +++ b/drivers/net/wan/hdlc_generic.c @@ -38,7 +38,7 @@ #include <linux/hdlc.h> -static const char* version = "HDLC support module revision 1.10"; +static const char* version = "HDLC support module revision 1.11"; static int hdlc_change_mtu(struct net_device *dev, int new_mtu) @@ -95,13 +95,13 @@ int hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (cmd != SIOCWANDEV) return -EINVAL; - switch(ifr->ifr_settings->type) { + switch(ifr->ifr_settings.type) { case IF_PROTO_HDLC: case IF_PROTO_PPP: case IF_PROTO_CISCO: case IF_PROTO_FR: case IF_PROTO_X25: - proto = ifr->ifr_settings->type; + proto = ifr->ifr_settings.type; break; default: diff --git a/drivers/net/wan/hdlc_ppp.c b/drivers/net/wan/hdlc_ppp.c index 925bc67ea643..b8cd395f720d 100644 --- a/drivers/net/wan/hdlc_ppp.c +++ b/drivers/net/wan/hdlc_ppp.c @@ -82,9 +82,9 @@ int hdlc_ppp_ioctl(hdlc_device *hdlc, struct ifreq *ifr) struct net_device *dev = hdlc_to_dev(hdlc); int result; - switch (ifr->ifr_settings->type) { + switch (ifr->ifr_settings.type) { case IF_GET_PROTO: - ifr->ifr_settings->type = IF_PROTO_PPP; + ifr->ifr_settings.type = IF_PROTO_PPP; return 0; /* return protocol only, no settable parameters */ case IF_PROTO_PPP: diff --git a/drivers/net/wan/hdlc_raw.c b/drivers/net/wan/hdlc_raw.c index 4f3b3355888c..d1267a9decc1 100644 --- a/drivers/net/wan/hdlc_raw.c +++ b/drivers/net/wan/hdlc_raw.c @@ -37,15 +37,19 @@ static void raw_rx(struct sk_buff *skb) int hdlc_raw_ioctl(hdlc_device *hdlc, struct ifreq *ifr) { - raw_hdlc_proto *raw_s = &ifr->ifr_settings->ifs_hdlc.raw_hdlc; + raw_hdlc_proto *raw_s = ifr->ifr_settings.ifs_ifsu.raw_hdlc; const size_t size = sizeof(raw_hdlc_proto); raw_hdlc_proto new_settings; struct net_device *dev = hdlc_to_dev(hdlc); int result; - switch (ifr->ifr_settings->type) { + switch (ifr->ifr_settings.type) { case IF_GET_PROTO: - ifr->ifr_settings->type = IF_PROTO_HDLC; + ifr->ifr_settings.type = IF_PROTO_HDLC; + if (ifr->ifr_settings.size < size) { + ifr->ifr_settings.size = size; /* data size wanted */ + return -ENOBUFS; + } if (copy_to_user(raw_s, &hdlc->state.raw_hdlc.settings, size)) return -EFAULT; return 0; diff --git a/drivers/net/wan/hdlc_x25.c b/drivers/net/wan/hdlc_x25.c index 970170c199a8..0817c3fa1dd5 100644 --- a/drivers/net/wan/hdlc_x25.c +++ b/drivers/net/wan/hdlc_x25.c @@ -184,9 +184,9 @@ int hdlc_x25_ioctl(hdlc_device *hdlc, struct ifreq *ifr) struct net_device *dev = hdlc_to_dev(hdlc); int result; - switch (ifr->ifr_settings->type) { + switch (ifr->ifr_settings.type) { case IF_GET_PROTO: - ifr->ifr_settings->type = IF_PROTO_X25; + ifr->ifr_settings.type = IF_PROTO_X25; return 0; /* return protocol only, no settable parameters */ case IF_PROTO_X25: diff --git a/drivers/net/wan/n2.c b/drivers/net/wan/n2.c index f0c6dbeee454..9a1a786bd938 100644 --- a/drivers/net/wan/n2.c +++ b/drivers/net/wan/n2.c @@ -246,9 +246,8 @@ static int n2_close(struct net_device *dev) static int n2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - union line_settings *line = &ifr->ifr_settings->ifs_line; const size_t size = sizeof(sync_serial_settings); - sync_serial_settings new_line; + sync_serial_settings new_line, *line = ifr->ifr_settings.ifs_ifsu.sync; hdlc_device *hdlc = dev_to_hdlc(dev); port_t *port = hdlc_to_port(hdlc); @@ -261,10 +260,14 @@ static int n2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (cmd != SIOCWANDEV) return hdlc_ioctl(dev, ifr, cmd); - switch(ifr->ifr_settings->type) { + switch(ifr->ifr_settings.type) { case IF_GET_IFACE: - ifr->ifr_settings->type = IF_IFACE_SYNC_SERIAL; - if (copy_to_user(&line->sync, &port->settings, size)) + ifr->ifr_settings.type = IF_IFACE_SYNC_SERIAL; + if (ifr->ifr_settings.size < size) { + ifr->ifr_settings.size = size; /* data size wanted */ + return -ENOBUFS; + } + if (copy_to_user(line, &port->settings, size)) return -EFAULT; return 0; @@ -272,7 +275,7 @@ static int n2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if(!capable(CAP_NET_ADMIN)) return -EPERM; - if (copy_from_user(&new_line, &line->sync, size)) + if (copy_from_user(&new_line, line, size)) return -EFAULT; if (new_line.clock_type != CLOCK_EXT && diff --git a/drivers/net/wan/pc300_drv.c b/drivers/net/wan/pc300_drv.c index de422ee63587..7954f7e9c504 100644 --- a/drivers/net/wan/pc300_drv.c +++ b/drivers/net/wan/pc300_drv.c @@ -2542,7 +2542,7 @@ int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; int ch = chan->channel; void *arg = (void *) ifr->ifr_data; - union line_settings * line = &ifr->ifr_settings->ifs_line; + struct if_settings *settings = &ifr->ifr_settings; uclong scabase = card->hw.scabase; if (!capable(CAP_NET_ADMIN)) @@ -2741,13 +2741,19 @@ int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) } case SIOCWANDEV: - switch (ifr->ifr_settings->type) { + switch (ifr->ifr_settings.type) { case IF_GET_IFACE: { const size_t size = sizeof(sync_serial_settings); - ifr->ifr_settings->type = conf->media; + ifr->ifr_settings.type = conf->media; + if (ifr->ifr_settings.size < size) { + /* data size wanted */ + ifr->ifr_settings.size = size; + return -ENOBUFS; + } - if (copy_to_user(&line->sync, &conf->phys_settings, size)) { + if (copy_to_user(settings->ifs_ifsu.sync, + &conf->phys_settings, size)) { return -EFAULT; } return 0; @@ -2764,7 +2770,7 @@ int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) } if (copy_from_user(&conf->phys_settings, - &line->sync, size)) { + settings->ifs_ifsu.sync, size)) { return -EFAULT; } @@ -2773,7 +2779,7 @@ int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) cpc_readb(card->hw.scabase + M_REG(MD2, ch)) | MD2_LOOP_MIR); } - conf->media = ifr->ifr_settings->type; + conf->media = ifr->ifr_settings.type; return 0; } @@ -2787,7 +2793,7 @@ int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) } if (copy_from_user(&conf->phys_settings, - &line->te1, size)) { + settings->ifs_ifsu.te1, size)) { return -EFAULT; }/* Ignoring HDLC slot_map for a while */ @@ -2796,7 +2802,7 @@ int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) cpc_readb(card->hw.scabase + M_REG(MD2, ch)) | MD2_LOOP_MIR); } - conf->media = ifr->ifr_settings->type; + conf->media = ifr->ifr_settings.type; return 0; } default: diff --git a/drivers/net/wan/pc300_tty.c b/drivers/net/wan/pc300_tty.c index 684797d2890c..f4953a99652d 100644 --- a/drivers/net/wan/pc300_tty.c +++ b/drivers/net/wan/pc300_tty.c @@ -728,8 +728,8 @@ static void cpc_tty_rx_work(void * data) if (cpc_tty->tty && (cpc_tty->tty->ldisc.receive_buf)) { CPC_TTY_DBG("%s: call line disc. receive_buf\n",cpc_tty->name); - cpc_tty->tty->ldisc.receive_buf(cpc_tty->tty, buf->data, - &flags, buf->size); + cpc_tty->tty->ldisc.receive_buf(cpc_tty->tty, (char *)(buf->data), + &flags, buf->size); } cpc_tty->buf_rx.first = cpc_tty->buf_rx.first->next; kfree((unsigned char *)buf); diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c index 04179cbf9822..f170e52c30e9 100644 --- a/drivers/net/wan/sdla.c +++ b/drivers/net/wan/sdla.c @@ -1665,7 +1665,10 @@ int __init sdla_c_setup(void) } #ifdef MODULE -static struct net_device sdla0 = {"sdla0", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, sdla_init}; +static struct net_device sdla0 = { + .name = "sdla0", + .init = sdla_init +}; MODULE_LICENSE("GPL"); diff --git a/drivers/net/znet.c b/drivers/net/znet.c index 97ddd0275316..bcc11a8fabcb 100644 --- a/drivers/net/znet.c +++ b/drivers/net/znet.c @@ -1,7 +1,5 @@ /* znet.c: An Zenith Z-Note ethernet driver for linux. */ -static const char version[] = "znet.c:v1.02 9/23/94 becker@cesdis.gsfc.nasa.gov\n"; - /* Written by Donald Becker. @@ -62,6 +60,30 @@ static const char version[] = "znet.c:v1.02 9/23/94 becker@cesdis.gsfc.nasa.gov\ functionality from the serial subsystem. */ +/* 10/2002 + + o Resurected for Linux 2.5+ by Marc Zyngier <maz@wild-wind.fr.eu.org> : + + - Removed strange DMA snooping in znet_sent_packet, which lead to + TX buffer corruption on my laptop. + - Use init_etherdev stuff. + - Use kmalloc-ed DMA buffers. + - Use as few global variables as possible. + - Use proper resources management. + - Use wireless/i82593.h as much as possible (structure, constants) + - Compiles as module or build-in. + + Tested on a vintage Zenith Z-Note 433Lnp+. Probably broken on + anything else. Testers (and detailed bug reports) are welcome :-). + + o TODO : + + - Properly handle multicast + - Understand why some traffic patterns add a 1s latency... + */ + +#include <linux/config.h> +#include <linux/module.h> #include <linux/kernel.h> #include <linux/sched.h> #include <linux/string.h> @@ -69,6 +91,7 @@ static const char version[] = "znet.c:v1.02 9/23/94 becker@cesdis.gsfc.nasa.gov\ #include <linux/interrupt.h> #include <linux/ioport.h> #include <linux/init.h> +#include <linux/delay.h> #include <asm/system.h> #include <asm/bitops.h> #include <asm/io.h> @@ -79,52 +102,35 @@ static const char version[] = "znet.c:v1.02 9/23/94 becker@cesdis.gsfc.nasa.gov\ #include <linux/skbuff.h> #include <linux/if_arp.h> +/* This include could be elsewhere, since it is not wireless specific */ +#include "wireless/i82593.h" + +static const char version[] __initdata = "znet.c:v1.02 9/23/94 becker@cesdis.gsfc.nasa.gov\n"; + #ifndef ZNET_DEBUG #define ZNET_DEBUG 1 #endif static unsigned int znet_debug = ZNET_DEBUG; +MODULE_PARM (znet_debug, "i"); +MODULE_PARM_DESC (znet_debug, "ZNet debug level"); +MODULE_LICENSE("GPL"); /* The DMA modes we need aren't in <dma.h>. */ #define DMA_RX_MODE 0x14 /* Auto init, I/O to mem, ++, demand. */ #define DMA_TX_MODE 0x18 /* Auto init, Mem to I/O, ++, demand. */ #define dma_page_eq(ptr1, ptr2) ((long)(ptr1)>>17 == (long)(ptr2)>>17) -#define DMA_BUF_SIZE 8192 #define RX_BUF_SIZE 8192 #define TX_BUF_SIZE 8192 - -/* Commands to the i82593 channel 0. */ -#define CMD0_CHNL_0 0x00 -#define CMD0_CHNL_1 0x10 /* Switch to channel 1. */ -#define CMD0_NOP (CMD0_CHNL_0) -#define CMD0_PORT_1 CMD0_CHNL_1 -#define CMD1_PORT_0 1 -#define CMD0_IA_SETUP 1 -#define CMD0_CONFIGURE 2 -#define CMD0_MULTICAST_LIST 3 -#define CMD0_TRANSMIT 4 -#define CMD0_DUMP 6 -#define CMD0_DIAGNOSE 7 -#define CMD0_Rx_ENABLE 8 -#define CMD0_Rx_DISABLE 10 -#define CMD0_Rx_STOP 11 -#define CMD0_RETRANSMIT 12 -#define CMD0_ABORT 13 -#define CMD0_RESET 14 - -#define CMD0_ACK 0x80 - -#define CMD0_STAT0 (0 << 5) -#define CMD0_STAT1 (1 << 5) -#define CMD0_STAT2 (2 << 5) -#define CMD0_STAT3 (3 << 5) +#define DMA_BUF_SIZE (RX_BUF_SIZE + 16) /* 8k + 16 bytes for trailers */ #define TX_TIMEOUT 10 -#define net_local znet_private struct znet_private { int rx_dma, tx_dma; struct net_device_stats stats; spinlock_t lock; + short sia_base, sia_size, io_size; + struct i82593_conf_block i593_init; /* The starting, current, and end pointers for the packet buffers. */ ushort *rx_start, *rx_cur, *rx_end; ushort *tx_start, *tx_cur, *tx_end; @@ -132,40 +138,7 @@ struct znet_private { }; /* Only one can be built-in;-> */ -static struct znet_private zn; -static ushort dma_buffer1[DMA_BUF_SIZE/2]; -static ushort dma_buffer2[DMA_BUF_SIZE/2]; -static ushort dma_buffer3[DMA_BUF_SIZE/2 + 8]; - -/* The configuration block. What an undocumented nightmare. The first - set of values are those suggested (without explanation) for ethernet - in the Intel 82586 databook. The rest appear to be completely undocumented, - except for cryptic notes in the Crynwr packet driver. This driver uses - the Crynwr values verbatim. */ - -static unsigned char i593_init[] = { - 0xAA, /* 0: 16-byte input & 80-byte output FIFO. */ - /* threshold, 96-byte FIFO, 82593 mode. */ - 0x88, /* 1: Continuous w/interrupts, 128-clock DMA.*/ - 0x2E, /* 2: 8-byte preamble, NO address insertion, */ - /* 6-byte Ethernet address, loopback off.*/ - 0x00, /* 3: Default priorities & backoff methods. */ - 0x60, /* 4: 96-bit interframe spacing. */ - 0x00, /* 5: 512-bit slot time (low-order). */ - 0xF2, /* 6: Slot time (high-order), 15 COLL retries. */ - 0x00, /* 7: Promisc-off, broadcast-on, default CRC. */ - 0x00, /* 8: Default carrier-sense, collision-detect. */ - 0x40, /* 9: 64-byte minimum frame length. */ - 0x5F, /* A: Type/length checks OFF, no CRC input, - "jabber" termination, etc. */ - 0x00, /* B: Full-duplex disabled. */ - 0x3F, /* C: Default multicast addresses & backoff. */ - 0x07, /* D: Default IFS retriggering. */ - 0x31, /* E: Internal retransmit, drop "runt" packets, - synchr. DRQ deassertion, 6 status bytes. */ - 0x22, /* F: Receive ring-buffer size (8K), - receive-stop register enable. */ -}; +static struct net_device *znet_dev; struct netidblk { char magic[8]; /* The magic number (string) "NETIDBLK" */ @@ -182,33 +155,225 @@ struct netidblk { char pad; }; -int znet_probe(struct net_device *dev); static int znet_open(struct net_device *dev); static int znet_send_packet(struct sk_buff *skb, struct net_device *dev); static void znet_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void znet_rx(struct net_device *dev); static int znet_close(struct net_device *dev); static struct net_device_stats *net_get_stats(struct net_device *dev); -static void set_multicast_list(struct net_device *dev); static void hardware_init(struct net_device *dev); static void update_stop_hit(short ioaddr, unsigned short rx_stop_offset); static void znet_tx_timeout (struct net_device *dev); -#ifdef notdef -static struct sigaction znet_sigaction = { &znet_interrupt, 0, 0, NULL, }; -#endif +/* Request needed resources */ +static int znet_request_resources (struct net_device *dev) +{ + struct znet_private *znet = dev->priv; + unsigned long flags; + + if (request_irq (dev->irq, &znet_interrupt, 0, "ZNet", dev)) + goto failed; + if (request_dma (znet->rx_dma, "ZNet rx")) + goto free_irq; + if (request_dma (znet->tx_dma, "ZNet tx")) + goto free_rx_dma; + if (!request_region (znet->sia_base, znet->sia_size, "ZNet SIA")) + goto free_tx_dma; + if (!request_region (dev->base_addr, znet->io_size, "ZNet I/O")) + goto free_sia; + + return 0; /* Happy ! */ + + free_sia: + release_region (znet->sia_base, znet->sia_size); + free_tx_dma: + flags = claim_dma_lock(); + free_dma (znet->tx_dma); + release_dma_lock (flags); + free_rx_dma: + flags = claim_dma_lock(); + free_dma (znet->rx_dma); + release_dma_lock (flags); + free_irq: + free_irq (dev->irq, dev); + failed: + return -1; +} + +static void znet_release_resources (struct net_device *dev) +{ + struct znet_private *znet = dev->priv; + unsigned long flags; + + release_region (znet->sia_base, znet->sia_size); + release_region (dev->base_addr, znet->io_size); + flags = claim_dma_lock(); + free_dma (znet->tx_dma); + free_dma (znet->rx_dma); + release_dma_lock (flags); + free_irq (dev->irq, dev); +} + +/* Keep the magical SIA stuff in a single function... */ +static void znet_transceiver_power (struct net_device *dev, int on) +{ + struct znet_private *znet = dev->priv; + unsigned char v; + + /* Turn on/off the 82501 SIA, using zenith-specific magic. */ + /* Select LAN control register */ + outb(0x10, znet->sia_base); + + if (on) + v = inb(znet->sia_base + 1) | 0x84; + else + v = inb(znet->sia_base + 1) & ~0x84; + + outb(v, znet->sia_base+1); /* Turn on/off LAN power (bit 2). */ +} + +/* Init the i82593, with current promisc/mcast configuration. + Also used from hardware_init. */ +static void znet_set_multicast_list (struct net_device *dev) +{ + struct znet_private *znet = dev->priv; + short ioaddr = dev->base_addr; + struct i82593_conf_block *cfblk = &znet->i593_init; + + memset(cfblk, 0x00, sizeof(struct i82593_conf_block)); + + /* The configuration block. What an undocumented nightmare. + The first set of values are those suggested (without explanation) + for ethernet in the Intel 82586 databook. The rest appear to be + completely undocumented, except for cryptic notes in the Crynwr + packet driver. This driver uses the Crynwr values verbatim. */ + + /* maz : Rewritten to take advantage of the wanvelan includes. + At least we have names, not just blind values */ + + /* Byte 0 */ + cfblk->fifo_limit = 10; /* = 16 B rx and 80 B tx fifo thresholds */ + cfblk->forgnesi = 0; /* 0=82C501, 1=AMD7992B compatibility */ + cfblk->fifo_32 = 1; + cfblk->d6mod = 0; /* Run in i82593 advanced mode */ + cfblk->throttle_enb = 1; + + /* Byte 1 */ + cfblk->throttle = 8; /* Continuous w/interrupts, 128-clock DMA. */ + cfblk->cntrxint = 0; /* enable continuous mode receive interrupts */ + cfblk->contin = 1; /* enable continuous mode */ + + /* Byte 2 */ + cfblk->addr_len = ETH_ALEN; + cfblk->acloc = 1; /* Disable source addr insertion by i82593 */ + cfblk->preamb_len = 2; /* 8 bytes preamble */ + cfblk->loopback = 0; /* Loopback off */ + + /* Byte 3 */ + cfblk->lin_prio = 0; /* Default priorities & backoff methods. */ + cfblk->tbofstop = 0; + cfblk->exp_prio = 0; + cfblk->bof_met = 0; + + /* Byte 4 */ + cfblk->ifrm_spc = 6; /* 96 bit times interframe spacing */ + + /* Byte 5 */ + cfblk->slottim_low = 0; /* 512 bit times slot time (low) */ + + /* Byte 6 */ + cfblk->slottim_hi = 2; /* 512 bit times slot time (high) */ + cfblk->max_retr = 15; /* 15 collisions retries */ + + /* Byte 7 */ + cfblk->prmisc = ((dev->flags & IFF_PROMISC) ? 1 : 0); /* Promiscuous mode */ + cfblk->bc_dis = 0; /* Enable broadcast reception */ + cfblk->crs_1 = 0; /* Don't transmit without carrier sense */ + cfblk->nocrc_ins = 0; /* i82593 generates CRC */ + cfblk->crc_1632 = 0; /* 32-bit Autodin-II CRC */ + cfblk->crs_cdt = 0; /* CD not to be interpreted as CS */ + + /* Byte 8 */ + cfblk->cs_filter = 0; /* CS is recognized immediately */ + cfblk->crs_src = 0; /* External carrier sense */ + cfblk->cd_filter = 0; /* CD is recognized immediately */ + + /* Byte 9 */ + cfblk->min_fr_len = 64 >> 2; /* Minimum frame length 64 bytes */ + + /* Byte A */ + cfblk->lng_typ = 1; /* Type/length checks OFF */ + cfblk->lng_fld = 1; /* Disable 802.3 length field check */ + cfblk->rxcrc_xf = 1; /* Don't transfer CRC to memory */ + cfblk->artx = 1; /* Disable automatic retransmission */ + cfblk->sarec = 1; /* Disable source addr trig of CD */ + cfblk->tx_jabber = 0; /* Disable jabber jam sequence */ + cfblk->hash_1 = 1; /* Use bits 0-5 in mc address hash */ + cfblk->lbpkpol = 0; /* Loopback pin active high */ + + /* Byte B */ + cfblk->fdx = 0; /* Disable full duplex operation */ + + /* Byte C */ + cfblk->dummy_6 = 0x3f; /* all ones, Default multicast addresses & backoff. */ + cfblk->mult_ia = 0; /* No multiple individual addresses */ + cfblk->dis_bof = 0; /* Disable the backoff algorithm ?! */ + + /* Byte D */ + cfblk->dummy_1 = 1; /* set to 1 */ + cfblk->tx_ifs_retrig = 3; /* Hmm... Disabled */ + cfblk->mc_all = (dev->mc_list || (dev->flags&IFF_ALLMULTI));/* multicast all mode */ + cfblk->rcv_mon = 0; /* Monitor mode disabled */ + cfblk->frag_acpt = 0; /* Do not accept fragments */ + cfblk->tstrttrs = 0; /* No start transmission threshold */ + + /* Byte E */ + cfblk->fretx = 1; /* FIFO automatic retransmission */ + cfblk->runt_eop = 0; /* drop "runt" packets */ + cfblk->hw_sw_pin = 0; /* ?? */ + cfblk->big_endn = 0; /* Big Endian ? no... */ + cfblk->syncrqs = 1; /* Synchronous DRQ deassertion... */ + cfblk->sttlen = 1; /* 6 byte status registers */ + cfblk->rx_eop = 0; /* Signal EOP on packet reception */ + cfblk->tx_eop = 0; /* Signal EOP on packet transmission */ + + /* Byte F */ + cfblk->rbuf_size = RX_BUF_SIZE >> 12; /* Set receive buffer size */ + cfblk->rcvstop = 1; /* Enable Receive Stop Register */ + + if (znet_debug > 2) { + int i; + unsigned char *c; + + for (i = 0, c = (char *) cfblk; i < sizeof (*cfblk); i++) + printk ("%02X ", c[i]); + printk ("\n"); + } + + *znet->tx_cur++ = sizeof(struct i82593_conf_block); + memcpy(znet->tx_cur, cfblk, sizeof(struct i82593_conf_block)); + znet->tx_cur += sizeof(struct i82593_conf_block)/2; + outb(OP0_CONFIGURE | CR0_CHNL, ioaddr); + /* XXX FIXME maz : Add multicast adresses here, so having a + * multicast address configured isn't equal to IFF_ALLMULTI */ +} /* The Z-Note probe is pretty easy. The NETIDBLK exists in the safe-to-probe BIOS area. We just scan for the signature, and pull the vital parameters out of the structure. */ -int __init znet_probe(struct net_device *dev) +static int __init znet_probe (void) { int i; struct netidblk *netinfo; + struct znet_private *znet; + struct net_device *dev; char *p; + if (znet_dev) /* Only look for a single adaptor */ + return -ENODEV; + /* This code scans the region 0xf0000 to 0xfffff for a "NETIDBLK". */ for(p = (char *)phys_to_virt(0xf0000); p < (char *)phys_to_virt(0x100000); p++) if (*p == 'N' && strncmp(p, "NETIDBLK", 8) == 0) @@ -219,6 +384,13 @@ int __init znet_probe(struct net_device *dev) printk(KERN_INFO "No Z-Note ethernet adaptor found.\n"); return -ENODEV; } + + if (!(znet_dev = dev = init_etherdev(0, sizeof(struct znet_private)))) + return -ENOMEM; + + znet = dev->priv; + + SET_MODULE_OWNER (dev); netinfo = (struct netidblk *)p; dev->base_addr = netinfo->iobase1; dev->irq = netinfo->irq1; @@ -230,62 +402,67 @@ int __init znet_probe(struct net_device *dev) printk(" %2.2x", dev->dev_addr[i] = netinfo->netid[i]); printk(", using IRQ %d DMA %d and %d.\n", dev->irq, netinfo->dma1, - netinfo->dma2); + netinfo->dma2); if (znet_debug > 1) { printk(KERN_INFO "%s: vendor '%16.16s' IRQ1 %d IRQ2 %d DMA1 %d DMA2 %d.\n", - dev->name, netinfo->vendor, - netinfo->irq1, netinfo->irq2, - netinfo->dma1, netinfo->dma2); + dev->name, netinfo->vendor, + netinfo->irq1, netinfo->irq2, + netinfo->dma1, netinfo->dma2); printk(KERN_INFO "%s: iobase1 %#x size %d iobase2 %#x size %d net type %2.2x.\n", - dev->name, netinfo->iobase1, netinfo->iosize1, - netinfo->iobase2, netinfo->iosize2, netinfo->nettype); + dev->name, netinfo->iobase1, netinfo->iosize1, + netinfo->iobase2, netinfo->iosize2, netinfo->nettype); } if (znet_debug > 0) - printk("%s%s", KERN_INFO, version); - - dev->priv = (void *) &zn; - zn.rx_dma = netinfo->dma1; - zn.tx_dma = netinfo->dma2; - zn.lock = SPIN_LOCK_UNLOCKED; - - /* These should never fail. You can't add devices to a sealed box! */ - if (request_irq(dev->irq, &znet_interrupt, 0, "ZNet", dev) - || request_dma(zn.rx_dma,"ZNet rx") - || request_dma(zn.tx_dma,"ZNet tx")) { - printk(KERN_WARNING "%s: Not opened -- resource busy?!?\n", dev->name); - return -EBUSY; + printk(KERN_INFO "%s", version); + + znet->rx_dma = netinfo->dma1; + znet->tx_dma = netinfo->dma2; + znet->lock = SPIN_LOCK_UNLOCKED; + znet->sia_base = 0xe6; /* Magic address for the 82501 SIA */ + znet->sia_size = 2; + /* maz: Despite the '593 being advertised above as using a + * single 8bits I/O port, this driver does many 16bits + * access. So set io_size accordingly */ + znet->io_size = 2; + + if (!(znet->rx_start = kmalloc (DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA))) + goto free_netdev; + if (!(znet->tx_start = kmalloc (DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA))) + goto free_rx; + + if (!dma_page_eq (znet->rx_start, znet->rx_start + (RX_BUF_SIZE/2-1)) || + !dma_page_eq (znet->tx_start, znet->tx_start + (TX_BUF_SIZE/2-1))) { + printk (KERN_WARNING "tx/rx crossing DMA frontiers, giving up\n"); + goto free_tx; } - - /* Allocate buffer memory. We can cross a 128K boundary, so we - must be careful about the allocation. It's easiest to waste 8K. */ - if (dma_page_eq(dma_buffer1, &dma_buffer1[RX_BUF_SIZE/2-1])) - zn.rx_start = dma_buffer1; - else - zn.rx_start = dma_buffer2; - - if (dma_page_eq(dma_buffer3, &dma_buffer3[RX_BUF_SIZE/2-1])) - zn.tx_start = dma_buffer3; - else - zn.tx_start = dma_buffer2; - zn.rx_end = zn.rx_start + RX_BUF_SIZE/2; - zn.tx_buf_len = TX_BUF_SIZE/2; - zn.tx_end = zn.tx_start + zn.tx_buf_len; + + znet->rx_end = znet->rx_start + RX_BUF_SIZE/2; + znet->tx_buf_len = TX_BUF_SIZE/2; + znet->tx_end = znet->tx_start + znet->tx_buf_len; /* The ZNET-specific entries in the device structure. */ dev->open = &znet_open; dev->hard_start_xmit = &znet_send_packet; dev->stop = &znet_close; dev->get_stats = net_get_stats; - dev->set_multicast_list = &set_multicast_list; + dev->set_multicast_list = &znet_set_multicast_list; dev->tx_timeout = znet_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; - /* Fill in the 'dev' with ethernet-generic values. */ - ether_setup(dev); - return 0; + + free_tx: + kfree (znet->tx_start); + free_rx: + kfree (znet->rx_start); + free_netdev: + unregister_netdev (dev); + kfree (dev); + znet_dev = NULL; + + return -ENOMEM; } @@ -296,9 +473,14 @@ static int znet_open(struct net_device *dev) if (znet_debug > 2) printk(KERN_DEBUG "%s: znet_open() called.\n", dev->name); - /* Turn on the 82501 SIA, using zenith-specific magic. */ - outb(0x10, 0xe6); /* Select LAN control register */ - outb(inb(0xe7) | 0x84, 0xe7); /* Turn on LAN power (bit 2). */ + /* These should never fail. You can't add devices to a sealed box! */ + if (znet_request_resources (dev)) { + printk(KERN_WARNING "%s: Not opened -- resource busy?!?\n", dev->name); + return -EBUSY; + } + + znet_transceiver_power (dev, 1); + /* According to the Crynwr driver we should wait 50 msec. for the LAN clock to stabilize. My experiments indicates that the '593 can be initialized immediately. The delay is probably needed for the @@ -307,10 +489,17 @@ static int znet_open(struct net_device *dev) Until this proves to be a problem we rely on the higher layers for the delay and save allocating a timer entry. */ + /* maz : Well, I'm getting every time the following message + * without the delay on a 486@33. This machine is much too + * fast... :-) So maybe the Crynwr driver wasn't wrong after + * all, even if the message is completly harmless on my + * setup. */ + mdelay (50); + /* This follows the packet driver's lead, and checks for success. */ if (inb(ioaddr) != 0x10 && inb(ioaddr) != 0x00) printk(KERN_WARNING "%s: Problem turning on the transceiver power.\n", - dev->name); + dev->name); hardware_init(dev); netif_start_queue (dev); @@ -324,20 +513,20 @@ static void znet_tx_timeout (struct net_device *dev) int ioaddr = dev->base_addr; ushort event, tx_status, rx_offset, state; - outb (CMD0_STAT0, ioaddr); + outb (CR0_STATUS_0, ioaddr); event = inb (ioaddr); - outb (CMD0_STAT1, ioaddr); + outb (CR0_STATUS_1, ioaddr); tx_status = inw (ioaddr); - outb (CMD0_STAT2, ioaddr); + outb (CR0_STATUS_2, ioaddr); rx_offset = inw (ioaddr); - outb (CMD0_STAT3, ioaddr); + outb (CR0_STATUS_3, ioaddr); state = inb (ioaddr); printk (KERN_WARNING "%s: transmit timed out, status %02x %04x %04x %02x," " resetting.\n", dev->name, event, tx_status, rx_offset, state); - if (tx_status == 0x0400) + if (tx_status == TX_LOST_CRS) printk (KERN_WARNING "%s: Tx carrier error, check transceiver cable.\n", dev->name); - outb (CMD0_RESET, ioaddr); + outb (OP0_RESET, ioaddr); hardware_init (dev); netif_wake_queue (dev); } @@ -345,7 +534,7 @@ static void znet_tx_timeout (struct net_device *dev) static int znet_send_packet(struct sk_buff *skb, struct net_device *dev) { int ioaddr = dev->base_addr; - struct net_local *lp = (struct net_local *)dev->priv; + struct znet_private *znet = dev->priv; unsigned long flags; if (znet_debug > 4) @@ -354,7 +543,7 @@ static int znet_send_packet(struct sk_buff *skb, struct net_device *dev) netif_stop_queue (dev); /* Check that the part hasn't reset itself, probably from suspend. */ - outb(CMD0_STAT0, ioaddr); + outb(CR0_STATUS_0, ioaddr); if (inw(ioaddr) == 0x0010 && inw(ioaddr) == 0x0000 && inw(ioaddr) == 0x0010) @@ -363,44 +552,33 @@ static int znet_send_packet(struct sk_buff *skb, struct net_device *dev) if (1) { short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; unsigned char *buf = (void *)skb->data; - ushort *tx_link = zn.tx_cur - 1; + ushort *tx_link = znet->tx_cur - 1; ushort rnd_len = (length + 1)>>1; - lp->stats.tx_bytes+=length; - - { - short dma_port = ((zn.tx_dma&3)<<2) + IO_DMA2_BASE; - unsigned addr = inb(dma_port); - addr |= inb(dma_port) << 8; - addr <<= 1; - if (((int)zn.tx_cur & 0x1ffff) != addr) - printk(KERN_WARNING "Address mismatch at Tx: %#x vs %#x.\n", - (int)zn.tx_cur & 0xffff, addr); - zn.tx_cur = (ushort *)(((int)zn.tx_cur & 0xfe0000) | addr); - } - - if (zn.tx_cur >= zn.tx_end) - zn.tx_cur = zn.tx_start; - *zn.tx_cur++ = length; - if (zn.tx_cur + rnd_len + 1 > zn.tx_end) { - int semi_cnt = (zn.tx_end - zn.tx_cur)<<1; /* Cvrt to byte cnt. */ - memcpy(zn.tx_cur, buf, semi_cnt); + znet->stats.tx_bytes+=length; + + if (znet->tx_cur >= znet->tx_end) + znet->tx_cur = znet->tx_start; + *znet->tx_cur++ = length; + if (znet->tx_cur + rnd_len + 1 > znet->tx_end) { + int semi_cnt = (znet->tx_end - znet->tx_cur)<<1; /* Cvrt to byte cnt. */ + memcpy(znet->tx_cur, buf, semi_cnt); rnd_len -= semi_cnt>>1; - memcpy(zn.tx_start, buf + semi_cnt, length - semi_cnt); - zn.tx_cur = zn.tx_start + rnd_len; + memcpy(znet->tx_start, buf + semi_cnt, length - semi_cnt); + znet->tx_cur = znet->tx_start + rnd_len; } else { - memcpy(zn.tx_cur, buf, skb->len); - zn.tx_cur += rnd_len; + memcpy(znet->tx_cur, buf, skb->len); + znet->tx_cur += rnd_len; } - *zn.tx_cur++ = 0; + *znet->tx_cur++ = 0; - spin_lock_irqsave(&lp->lock, flags); + spin_lock_irqsave(&znet->lock, flags); { - *tx_link = CMD0_TRANSMIT + CMD0_CHNL_1; + *tx_link = OP0_TRANSMIT | CR0_CHNL; /* Is this always safe to do? */ - outb(CMD0_TRANSMIT + CMD0_CHNL_1,ioaddr); + outb(OP0_TRANSMIT | CR0_CHNL, ioaddr); } - spin_unlock_irqrestore (&lp->lock, flags); + spin_unlock_irqrestore (&znet->lock, flags); dev->trans_start = jiffies; netif_start_queue (dev); @@ -416,7 +594,7 @@ static int znet_send_packet(struct sk_buff *skb, struct net_device *dev) static void znet_interrupt(int irq, void *dev_id, struct pt_regs * regs) { struct net_device *dev = dev_id; - struct net_local *lp = (struct net_local *)dev->priv; + struct znet_private *znet = dev->priv; int ioaddr; int boguscnt = 20; @@ -425,73 +603,77 @@ static void znet_interrupt(int irq, void *dev_id, struct pt_regs * regs) return; } - spin_lock (&lp->lock); + spin_lock (&znet->lock); ioaddr = dev->base_addr; - outb(CMD0_STAT0, ioaddr); + outb(CR0_STATUS_0, ioaddr); do { ushort status = inb(ioaddr); if (znet_debug > 5) { ushort result, rx_ptr, running; - outb(CMD0_STAT1, ioaddr); + outb(CR0_STATUS_1, ioaddr); result = inw(ioaddr); - outb(CMD0_STAT2, ioaddr); + outb(CR0_STATUS_2, ioaddr); rx_ptr = inw(ioaddr); - outb(CMD0_STAT3, ioaddr); + outb(CR0_STATUS_3, ioaddr); running = inb(ioaddr); printk(KERN_DEBUG "%s: interrupt, status %02x, %04x %04x %02x serial %d.\n", dev->name, status, result, rx_ptr, running, boguscnt); } - if ((status & 0x80) == 0) + if ((status & SR0_INTERRUPT) == 0) break; - if ((status & 0x0F) == 4) { /* Transmit done. */ + if ((status & 0x0F) == SR0_TRANSMIT_DONE) { int tx_status; - outb(CMD0_STAT1, ioaddr); + outb(CR0_STATUS_1, ioaddr); tx_status = inw(ioaddr); /* It's undocumented, but tx_status seems to match the i82586. */ - if (tx_status & 0x2000) { - lp->stats.tx_packets++; - lp->stats.collisions += tx_status & 0xf; + if (tx_status & TX_OK) { + znet->stats.tx_packets++; + znet->stats.collisions += tx_status & TX_NCOL_MASK; } else { - if (tx_status & 0x0600) lp->stats.tx_carrier_errors++; - if (tx_status & 0x0100) lp->stats.tx_fifo_errors++; - if (!(tx_status & 0x0040)) lp->stats.tx_heartbeat_errors++; - if (tx_status & 0x0020) lp->stats.tx_aborted_errors++; + if (tx_status & (TX_LOST_CTS | TX_LOST_CRS)) + znet->stats.tx_carrier_errors++; + if (tx_status & TX_UND_RUN) + znet->stats.tx_fifo_errors++; + if (!(tx_status & TX_HRT_BEAT)) + znet->stats.tx_heartbeat_errors++; + if (tx_status & TX_MAX_COL) + znet->stats.tx_aborted_errors++; /* ...and the catch-all. */ - if ((tx_status | 0x0760) != 0x0760) - lp->stats.tx_errors++; + if ((tx_status | (TX_LOST_CRS | TX_LOST_CTS | TX_UND_RUN | TX_HRT_BEAT | TX_MAX_COL)) != (TX_LOST_CRS | TX_LOST_CTS | TX_UND_RUN | TX_HRT_BEAT | TX_MAX_COL)) + znet->stats.tx_errors++; } netif_wake_queue (dev); } - if ((status & 0x40) - || (status & 0x0f) == 11) { + if ((status & SR0_RECEPTION) || + (status & SR0_EVENT_MASK) == SR0_STOP_REG_HIT) { znet_rx(dev); } /* Clear the interrupts we've handled. */ - outb(CMD0_ACK,ioaddr); + outb(CR0_INT_ACK, ioaddr); } while (boguscnt--); - spin_unlock (&lp->lock); + spin_unlock (&znet->lock); return; } static void znet_rx(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct znet_private *znet = dev->priv; int ioaddr = dev->base_addr; int boguscount = 1; short next_frame_end_offset = 0; /* Offset of next frame start. */ short *cur_frame_end; short cur_frame_end_offset; - outb(CMD0_STAT2, ioaddr); + outb(CR0_STATUS_2, ioaddr); cur_frame_end_offset = inw(ioaddr); - if (cur_frame_end_offset == zn.rx_cur - zn.rx_start) { + if (cur_frame_end_offset == znet->rx_cur - znet->rx_start) { printk(KERN_WARNING "%s: Interrupted, but nothing to receive, offset %03x.\n", dev->name, cur_frame_end_offset); return; @@ -501,7 +683,7 @@ static void znet_rx(struct net_device *dev) the same area of the backwards links we now have. This allows us to pass packets to the upper layers in the order they were received -- important for fast-path sequential operations. */ - while (zn.rx_start + cur_frame_end_offset != zn.rx_cur + while (znet->rx_start + cur_frame_end_offset != znet->rx_cur && ++boguscount < 5) { unsigned short hi_cnt, lo_cnt, hi_status, lo_status; int count, status; @@ -510,10 +692,10 @@ static void znet_rx(struct net_device *dev) /* Oh no, we have a special case: the frame trailer wraps around the end of the ring buffer. We've saved space at the end of the ring buffer for just this problem. */ - memcpy(zn.rx_end, zn.rx_start, 8); + memcpy(znet->rx_end, znet->rx_start, 8); cur_frame_end_offset += (RX_BUF_SIZE/2); } - cur_frame_end = zn.rx_start + cur_frame_end_offset - 4; + cur_frame_end = znet->rx_start + cur_frame_end_offset - 4; lo_status = *cur_frame_end++; hi_status = *cur_frame_end++; @@ -538,7 +720,7 @@ static void znet_rx(struct net_device *dev) /* Now step forward through the list. */ do { - ushort *this_rfp_ptr = zn.rx_start + next_frame_end_offset; + ushort *this_rfp_ptr = znet->rx_start + next_frame_end_offset; int status = this_rfp_ptr[-4]; int pkt_len = this_rfp_ptr[-2]; @@ -547,15 +729,20 @@ static void znet_rx(struct net_device *dev) " next %04x.\n", next_frame_end_offset<<1, status, pkt_len, this_rfp_ptr[-3]<<1); /* Once again we must assume that the i82586 docs apply. */ - if ( ! (status & 0x2000)) { /* There was an error. */ - lp->stats.rx_errors++; - if (status & 0x0800) lp->stats.rx_crc_errors++; - if (status & 0x0400) lp->stats.rx_frame_errors++; - if (status & 0x0200) lp->stats.rx_over_errors++; /* Wrong. */ - if (status & 0x0100) lp->stats.rx_fifo_errors++; - if (status & 0x0080) lp->stats.rx_length_errors++; + if ( ! (status & RX_RCV_OK)) { /* There was an error. */ + znet->stats.rx_errors++; + if (status & RX_CRC_ERR) znet->stats.rx_crc_errors++; + if (status & RX_ALG_ERR) znet->stats.rx_frame_errors++; +#if 0 + if (status & 0x0200) znet->stats.rx_over_errors++; /* Wrong. */ + if (status & 0x0100) znet->stats.rx_fifo_errors++; +#else + /* maz : Wild guess... */ + if (status & RX_OVRRUN) znet->stats.rx_over_errors++; +#endif + if (status & RX_SRT_FRM) znet->stats.rx_length_errors++; } else if (pkt_len > 1536) { - lp->stats.rx_length_errors++; + znet->stats.rx_length_errors++; } else { /* Malloc up new buffer. */ struct sk_buff *skb; @@ -564,18 +751,18 @@ static void znet_rx(struct net_device *dev) if (skb == NULL) { if (znet_debug) printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name); - lp->stats.rx_dropped++; + znet->stats.rx_dropped++; break; } skb->dev = dev; - if (&zn.rx_cur[(pkt_len+1)>>1] > zn.rx_end) { - int semi_cnt = (zn.rx_end - zn.rx_cur)<<1; - memcpy(skb_put(skb,semi_cnt), zn.rx_cur, semi_cnt); - memcpy(skb_put(skb,pkt_len-semi_cnt), zn.rx_start, + if (&znet->rx_cur[(pkt_len+1)>>1] > znet->rx_end) { + int semi_cnt = (znet->rx_end - znet->rx_cur)<<1; + memcpy(skb_put(skb,semi_cnt), znet->rx_cur, semi_cnt); + memcpy(skb_put(skb,pkt_len-semi_cnt), znet->rx_start, pkt_len - semi_cnt); } else { - memcpy(skb_put(skb,pkt_len), zn.rx_cur, pkt_len); + memcpy(skb_put(skb,pkt_len), znet->rx_cur, pkt_len); if (znet_debug > 6) { unsigned int *packet = (unsigned int *) skb->data; printk(KERN_DEBUG "Packet data is %08x %08x %08x %08x.\n", packet[0], @@ -585,17 +772,17 @@ static void znet_rx(struct net_device *dev) skb->protocol=eth_type_trans(skb,dev); netif_rx(skb); dev->last_rx = jiffies; - lp->stats.rx_packets++; - lp->stats.rx_bytes += pkt_len; + znet->stats.rx_packets++; + znet->stats.rx_bytes += pkt_len; } - zn.rx_cur = this_rfp_ptr; - if (zn.rx_cur >= zn.rx_end) - zn.rx_cur -= RX_BUF_SIZE/2; - update_stop_hit(ioaddr, (zn.rx_cur - zn.rx_start)<<1); + znet->rx_cur = this_rfp_ptr; + if (znet->rx_cur >= znet->rx_end) + znet->rx_cur -= RX_BUF_SIZE/2; + update_stop_hit(ioaddr, (znet->rx_cur - znet->rx_start)<<1); next_frame_end_offset = this_rfp_ptr[-3]; if (next_frame_end_offset == 0) /* Read all the frames? */ break; /* Done for now */ - this_rfp_ptr = zn.rx_start + next_frame_end_offset; + this_rfp_ptr = znet->rx_start + next_frame_end_offset; } while (--boguscount); /* If any worth-while packets have been received, dev_rint() @@ -607,26 +794,19 @@ static void znet_rx(struct net_device *dev) /* The inverse routine to znet_open(). */ static int znet_close(struct net_device *dev) { - unsigned long flags; int ioaddr = dev->base_addr; netif_stop_queue (dev); - outb(CMD0_RESET, ioaddr); /* CMD0_RESET */ - - flags=claim_dma_lock(); - disable_dma(zn.rx_dma); - disable_dma(zn.tx_dma); - release_dma_lock(flags); - - free_irq(dev->irq, dev); + outb(OP0_RESET, ioaddr); /* CMD0_RESET */ if (znet_debug > 1) printk(KERN_DEBUG "%s: Shutting down ethercard.\n", dev->name); /* Turn off transceiver power. */ - outb(0x10, 0xe6); /* Select LAN control register */ - outb(inb(0xe7) & ~0x84, 0xe7); /* Turn on LAN power (bit 2). */ - + znet_transceiver_power (dev, 0); + + znet_release_resources (dev); + return 0; } @@ -634,60 +814,30 @@ static int znet_close(struct net_device *dev) closed. */ static struct net_device_stats *net_get_stats(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct znet_private *znet = dev->priv; - return &lp->stats; + return &znet->stats; } -/* Set or clear the multicast filter for this adaptor. - As a side effect this routine must also initialize the device parameters. - This is taken advantage of in open(). - - N.B. that we change i593_init[] in place. This (properly) makes the - mode change persistent, but must be changed if this code is moved to - a multiple adaptor environment. - */ -static void set_multicast_list(struct net_device *dev) +static void show_dma(struct net_device *dev) { short ioaddr = dev->base_addr; - - if (dev->flags&IFF_PROMISC) { - /* Enable promiscuous mode */ - i593_init[7] &= ~3; i593_init[7] |= 1; - i593_init[13] &= ~8; i593_init[13] |= 8; - } else if (dev->mc_list || (dev->flags&IFF_ALLMULTI)) { - /* Enable accept-all-multicast mode */ - i593_init[7] &= ~3; i593_init[7] |= 0; - i593_init[13] &= ~8; i593_init[13] |= 8; - } else { /* Enable normal mode. */ - i593_init[7] &= ~3; i593_init[7] |= 0; - i593_init[13] &= ~8; i593_init[13] |= 0; - } - *zn.tx_cur++ = sizeof(i593_init); - memcpy(zn.tx_cur, i593_init, sizeof(i593_init)); - zn.tx_cur += sizeof(i593_init)/2; - outb(CMD0_CONFIGURE+CMD0_CHNL_1, ioaddr); -#ifdef not_tested - if (num_addrs > 0) { - int addrs_len = 6*num_addrs; - *zn.tx_cur++ = addrs_len; - memcpy(zn.tx_cur, addrs, addrs_len); - outb(CMD0_MULTICAST_LIST+CMD0_CHNL_1, ioaddr); - zn.tx_cur += addrs_len>>1; - } -#endif -} - -void show_dma(void) -{ + unsigned char stat = inb (ioaddr); + struct znet_private *znet = dev->priv; unsigned long flags; - short dma_port = ((zn.tx_dma&3)<<2) + IO_DMA2_BASE; + short dma_port = ((znet->tx_dma&3)<<2) + IO_DMA2_BASE; unsigned addr = inb(dma_port); - addr |= inb(dma_port) << 8; + short residue; - flags=claim_dma_lock(); - printk("Addr: %04x cnt:%3x...", addr<<1, get_dma_residue(zn.tx_dma)); - release_dma_lock(flags); + addr |= inb(dma_port) << 8; + residue = get_dma_residue(znet->tx_dma); + + if (znet_debug > 1) { + flags=claim_dma_lock(); + printk(KERN_DEBUG "Stat:%02x Addr: %04x cnt:%3x\n", + stat, addr<<1, residue); + release_dma_lock(flags); + } } /* Initialize the hardware. We have to do this when the board is open()ed @@ -696,72 +846,78 @@ static void hardware_init(struct net_device *dev) { unsigned long flags; short ioaddr = dev->base_addr; + struct znet_private *znet = dev->priv; - zn.rx_cur = zn.rx_start; - zn.tx_cur = zn.tx_start; + znet->rx_cur = znet->rx_start; + znet->tx_cur = znet->tx_start; /* Reset the chip, and start it up. */ - outb(CMD0_RESET, ioaddr); + outb(OP0_RESET, ioaddr); flags=claim_dma_lock(); - disable_dma(zn.rx_dma); /* reset by an interrupting task. */ - clear_dma_ff(zn.rx_dma); - set_dma_mode(zn.rx_dma, DMA_RX_MODE); - set_dma_addr(zn.rx_dma, (unsigned int) zn.rx_start); - set_dma_count(zn.rx_dma, RX_BUF_SIZE); - enable_dma(zn.rx_dma); + disable_dma(znet->rx_dma); /* reset by an interrupting task. */ + clear_dma_ff(znet->rx_dma); + set_dma_mode(znet->rx_dma, DMA_RX_MODE); + set_dma_addr(znet->rx_dma, (unsigned int) znet->rx_start); + set_dma_count(znet->rx_dma, RX_BUF_SIZE); + enable_dma(znet->rx_dma); /* Now set up the Tx channel. */ - disable_dma(zn.tx_dma); - clear_dma_ff(zn.tx_dma); - set_dma_mode(zn.tx_dma, DMA_TX_MODE); - set_dma_addr(zn.tx_dma, (unsigned int) zn.tx_start); - set_dma_count(zn.tx_dma, zn.tx_buf_len<<1); - enable_dma(zn.tx_dma); + disable_dma(znet->tx_dma); + clear_dma_ff(znet->tx_dma); + set_dma_mode(znet->tx_dma, DMA_TX_MODE); + set_dma_addr(znet->tx_dma, (unsigned int) znet->tx_start); + set_dma_count(znet->tx_dma, znet->tx_buf_len<<1); + enable_dma(znet->tx_dma); release_dma_lock(flags); if (znet_debug > 1) - printk(KERN_DEBUG "%s: Initializing the i82593, tx buf %p... ", dev->name, - zn.tx_start); + printk(KERN_DEBUG "%s: Initializing the i82593, rx buf %p tx buf %p\n", + dev->name, znet->rx_start,znet->tx_start); /* Do an empty configure command, just like the Crynwr driver. This resets to chip to its default values. */ - *zn.tx_cur++ = 0; - *zn.tx_cur++ = 0; - printk("stat:%02x ", inb(ioaddr)); show_dma(); - outb(CMD0_CONFIGURE+CMD0_CHNL_1, ioaddr); - *zn.tx_cur++ = sizeof(i593_init); - memcpy(zn.tx_cur, i593_init, sizeof(i593_init)); - zn.tx_cur += sizeof(i593_init)/2; - printk("stat:%02x ", inb(ioaddr)); show_dma(); - outb(CMD0_CONFIGURE+CMD0_CHNL_1, ioaddr); - *zn.tx_cur++ = 6; - memcpy(zn.tx_cur, dev->dev_addr, 6); - zn.tx_cur += 3; - printk("stat:%02x ", inb(ioaddr)); show_dma(); - outb(CMD0_IA_SETUP + CMD0_CHNL_1, ioaddr); - printk("stat:%02x ", inb(ioaddr)); show_dma(); + *znet->tx_cur++ = 0; + *znet->tx_cur++ = 0; + show_dma(dev); + outb(OP0_CONFIGURE | CR0_CHNL, ioaddr); + + znet_set_multicast_list (dev); + + *znet->tx_cur++ = 6; + memcpy(znet->tx_cur, dev->dev_addr, 6); + znet->tx_cur += 3; + show_dma(dev); + outb(OP0_IA_SETUP | CR0_CHNL, ioaddr); + show_dma(dev); update_stop_hit(ioaddr, 8192); - if (znet_debug > 1) printk("enabling Rx.\n"); - outb(CMD0_Rx_ENABLE+CMD0_CHNL_0, ioaddr); + if (znet_debug > 1) printk(KERN_DEBUG "enabling Rx.\n"); + outb(OP0_RCV_ENABLE, ioaddr); netif_start_queue (dev); } static void update_stop_hit(short ioaddr, unsigned short rx_stop_offset) { - outb(CMD0_PORT_1, ioaddr); + outb(OP0_SWIT_TO_PORT_1 | CR0_CHNL, ioaddr); if (znet_debug > 5) printk(KERN_DEBUG "Updating stop hit with value %02x.\n", - (rx_stop_offset >> 6) | 0x80); - outb((rx_stop_offset >> 6) | 0x80, ioaddr); - outb(CMD1_PORT_0, ioaddr); + (rx_stop_offset >> 6) | CR1_STOP_REG_UPDATE); + outb((rx_stop_offset >> 6) | CR1_STOP_REG_UPDATE, ioaddr); + outb(OP1_SWIT_TO_PORT_0, ioaddr); } - -/* - * Local variables: - * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c znet.c" - * version-control: t - * kept-new-versions: 5 - * c-indent-level: 4 - * tab-width: 4 - * End: - */ + +static __exit void znet_cleanup (void) +{ +#ifdef MODULE + if (znet_dev) { + struct znet_private *znet = znet_dev->priv; + + kfree (znet->rx_start); + kfree (znet->tx_start); + unregister_netdev (znet_dev); + kfree (znet_dev); + } +#endif +} + +module_init (znet_probe); +module_exit (znet_cleanup); diff --git a/drivers/scsi/3w-xxxx.h b/drivers/scsi/3w-xxxx.h index 5a5d7f6a056f..585f7f47517a 100644 --- a/drivers/scsi/3w-xxxx.h +++ b/drivers/scsi/3w-xxxx.h @@ -468,7 +468,6 @@ void tw_unmask_command_interrupt(TW_Device_Extension *tw_dev); /* Scsi_Host_Template Initializer */ #define TWXXXX { \ - next : NULL, \ module : NULL, \ proc_name : "3w-xxxx", \ proc_info : tw_scsi_proc_info, \ diff --git a/drivers/scsi/53c7,8xx.c b/drivers/scsi/53c7,8xx.c index be1887f0da38..9828a423df49 100644 --- a/drivers/scsi/53c7,8xx.c +++ b/drivers/scsi/53c7,8xx.c @@ -1153,7 +1153,6 @@ NCR53c7x0_init (struct Scsi_Host *host) { /* * Function : static int normal_init(Scsi_Host_Template *tpnt, int board, * int chip, u32 base, int io_port, int irq, int dma, int pcivalid, - * unsigned char pci_bus, unsigned char pci_device_fn, * struct pci_dev *pci_dev, long long options); * * Purpose : initializes a NCR53c7,8x0 based on base addresses, @@ -1161,7 +1160,7 @@ NCR53c7x0_init (struct Scsi_Host *host) { * * Useful where a new NCR chip is backwards compatible with * a supported chip, but the DEVICE ID has changed so it - * doesn't show up when the autoprobe does a pcibios_find_device. + * doesn't show up when the autoprobe does a pci_find_device. * * Inputs : tpnt - Template for this SCSI adapter, board - board level * product, chip - 810, 820, or 825, bus - PCI bus, device_fn - @@ -1174,7 +1173,6 @@ NCR53c7x0_init (struct Scsi_Host *host) { static int __init normal_init (Scsi_Host_Template *tpnt, int board, int chip, u32 base, int io_port, int irq, int dma, int pci_valid, - unsigned char pci_bus, unsigned char pci_device_fn, struct pci_dev *pci_dev, long long options) { struct Scsi_Host *instance; @@ -1275,8 +1273,7 @@ normal_init (Scsi_Host_Template *tpnt, int board, int chip, hostdata->board = board; hostdata->chip = chip; if ((hostdata->pci_valid = pci_valid)) { - hostdata->pci_bus = pci_bus; - hostdata->pci_device_fn = pci_device_fn; + hostdata->pci_dev = pci_dev; } /* @@ -1377,7 +1374,7 @@ normal_init (Scsi_Host_Template *tpnt, int board, int chip, * * Useful where a new NCR chip is backwards compatible with * a supported chip, but the DEVICE ID has changed so it - * doesn't show up when the autoprobe does a pcibios_find_device. + * doesn't show up when the autoprobe does a pci_find_device. * * Inputs : tpnt - Template for this SCSI adapter, board - board level * product, chip - 810, 820, or 825, bus - PCI bus, device_fn - @@ -1511,7 +1508,7 @@ ncr_pci_init (Scsi_Host_Template *tpnt, int board, int chip, } return normal_init (tpnt, board, chip, (int) base, io_port, - (int) irq, DMA_NONE, 1, bus, device_fn, pdev, options); + (int) irq, DMA_NONE, 1, pdev, options); } @@ -5085,8 +5082,7 @@ intr_bf (struct Scsi_Host *host, struct NCR53c7x0_cmd *cmd) { if ((hostdata->chip / 100) == 8) { save_flags (flags); cli(); - tmp = pcibios_read_config_word (hostdata->pci_bus, - hostdata->pci_device_fn, PCI_STATUS, &pci_status); + tmp = pci_read_config_word (hostdata->pcidev, PCI_STATUS, &pci_status); restore_flags (flags); if (tmp == PCIBIOS_SUCCESSFUL) { if (pci_status & PCI_STATUS_REC_TARGET_ABORT) { diff --git a/drivers/scsi/53c7,8xx.h b/drivers/scsi/53c7,8xx.h index 220c7b885581..59b87eb1bf73 100644 --- a/drivers/scsi/53c7,8xx.h +++ b/drivers/scsi/53c7,8xx.h @@ -1159,12 +1159,12 @@ struct NCR53c7x0_hostdata { 700-66, rest are last three digits of part number */ /* - * PCI bus, device, function, only for NCR53c8x0 chips. + * PCI device, only for NCR53c8x0 chips. * pci_valid indicates that the PCI configuration information * is valid, and we can twiddle MAX_LAT, etc. as recommended * for maximum performance in the NCR documentation. */ - unsigned char pci_bus, pci_device_fn; + struct pci_dev *pci_dev; unsigned pci_valid:1; u32 *dsp; /* dsp to restart with after diff --git a/drivers/scsi/Config.help b/drivers/scsi/Config.help index 972b997683c8..bd522b41d789 100644 --- a/drivers/scsi/Config.help +++ b/drivers/scsi/Config.help @@ -496,9 +496,27 @@ CONFIG_SCSI_FD_MCS module, say M here and read <file:Documentation/modules.txt>. CONFIG_SCSI_GENERIC_NCR5380 - This is the generic NCR family of SCSI controllers, not to be - confused with the NCR 53c7 or 8xx controllers. It is explained in - section 3.8 of the SCSI-HOWTO, available from + This is a driver for the old NCR 53c80 series of SCSI controllers + on boards using PIO. Most boards such as the Trantor T130 fit this + category, along with a large number of ISA 8bit controllers shipped + for free with SCSI scanners. If you have a PAS16, T128 or DMX3191 + you should select the specific driver for that card rather than + generic 5380 support. + + It is explained in section 3.8 of the SCSI-HOWTO, available from + <http://www.linuxdoc.org/docs.html#howto>. If it doesn't work out + of the box, you may have to change some settings in + <file:drivers/scsi/g_NCR5380.h>. + + This driver is also available as a module ( = code which can be + inserted in and removed from the running kernel whenever you want). + The module will be called g_NCR5380.o. If you want to compile it as + a module, say M here and read <file:Documentation/modules.txt>. + +CONFIG_SCSI_GENERIC_NCR5380_MMIO + This is a driver for the old NCR 53c80 series of SCSI controllers + on boards using memory mapped I/O. + It is explained in section 3.8 of the SCSI-HOWTO, available from <http://www.linuxdoc.org/docs.html#howto>. If it doesn't work out of the box, you may have to change some settings in <file:drivers/scsi/g_NCR5380.h>. @@ -516,11 +534,6 @@ CONFIG_SCSI_GENERIC_NCR53C400 not detect your card. See the file <file:drivers/scsi/README.g_NCR5380> for details. -CONFIG_SCSI_G_NCR5380_PORT - The NCR5380 and NCR53c400 SCSI controllers come in two varieties: - port or memory mapped. You should know what you have. The most - common card, Trantor T130B, uses port mapped mode. - CONFIG_SCSI_NCR_D700 This is a driver for the MicroChannel Dual 700 card produced by NCR and commonly used in 345x/35xx/4100 class machines. It always diff --git a/drivers/scsi/Config.in b/drivers/scsi/Config.in index 8ad12993d81a..6e845c346c98 100644 --- a/drivers/scsi/Config.in +++ b/drivers/scsi/Config.in @@ -92,12 +92,10 @@ if [ "$CONFIG_MCA" = "y" ]; then dep_tristate 'Future Domain MCS-600/700 SCSI support' CONFIG_SCSI_FD_MCS $CONFIG_SCSI fi dep_tristate 'Intel/ICP (former GDT SCSI Disk Array) RAID Controller support' CONFIG_SCSI_GDTH $CONFIG_SCSI -dep_tristate 'Generic NCR5380/53c400 SCSI support' CONFIG_SCSI_GENERIC_NCR5380 $CONFIG_SCSI +dep_tristate 'Generic NCR5380/53c400 SCSI PIO support' CONFIG_SCSI_GENERIC_NCR5380 $CONFIG_SCSI +dep_tristate 'Generic NCR5380/53c400 SCSI MMIO support' CONFIG_SCSI_GENERIC_NCR5380_MMIO $CONFIG_SCSI if [ "$CONFIG_SCSI_GENERIC_NCR5380" != "n" ]; then bool ' Enable NCR53c400 extensions' CONFIG_SCSI_GENERIC_NCR53C400 - choice 'NCR5380/53c400 mapping method (use Port for T130B)' \ - "Port CONFIG_SCSI_G_NCR5380_PORT \ - Memory CONFIG_SCSI_G_NCR5380_MEM" Port fi if [ "$CONFIG_MCA" = "y" ]; then dep_tristate 'IBMMCA SCSI support' CONFIG_SCSI_IBMMCA $CONFIG_SCSI diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile index 1edb859c1b50..a12fc0b42138 100644 --- a/drivers/scsi/Makefile +++ b/drivers/scsi/Makefile @@ -65,6 +65,7 @@ obj-$(CONFIG_SCSI_FD_MCS) += fd_mcs.o obj-$(CONFIG_SCSI_FUTURE_DOMAIN)+= fdomain.o obj-$(CONFIG_SCSI_IN2000) += in2000.o obj-$(CONFIG_SCSI_GENERIC_NCR5380) += g_NCR5380.o +obj-$(CONFIG_SCSI_GENERIC_NCR5380_MMIO) += g_NCR5380_mmio.o obj-$(CONFIG_SCSI_NCR53C406A) += NCR53c406a.o obj-$(CONFIG_SCSI_NCR_D700) += NCR_D700.o 53c700.o obj-$(CONFIG_SCSI_SYM53C416) += sym53c416.o diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c index d54ca6312e41..3aeb47776ebc 100644 --- a/drivers/scsi/NCR5380.c +++ b/drivers/scsi/NCR5380.c @@ -1,6 +1,3 @@ -#ifndef NDEBUG -#define NDEBUG (NDEBUG_RESTART_SELECT | NDEBUG_ABORT) -#endif /* * NCR 5380 generic driver routines. These should make it *trivial* * to implement 5380 SCSI drivers under Linux with a non-trantor @@ -316,8 +313,8 @@ static int do_abort(struct Scsi_Host *host); static void do_reset(struct Scsi_Host *host); -static struct Scsi_Host *first_instance = NULL; -static Scsi_Host_Template *the_template = NULL; +static struct NCR5380_hostdata *first_host = NULL; +static struct NCR5380_hostdata *last_host = NULL; static struct timer_list usleep_timer; /* @@ -348,7 +345,18 @@ static __inline__ void initialize_SCp(Scsi_Cmnd * cmd) } } -#include <linux/delay.h> +static struct { + unsigned char value; + const char *name; +} phases[] = { + {PHASE_DATAOUT, "DATAOUT"}, + {PHASE_DATAIN, "DATAIN"}, + {PHASE_CMDOUT, "CMDOUT"}, + {PHASE_STATIN, "STATIN"}, + {PHASE_MSGOUT, "MSGOUT"}, + {PHASE_MSGIN, "MSGIN"}, + {PHASE_UNKNOWN, "UNKNOWN"} +}; #ifdef NDEBUG static struct { @@ -430,18 +438,6 @@ static void NCR5380_print(struct Scsi_Host *instance) printk("\n"); } -static struct { - unsigned char value; - const char *name; -} phases[] = { - {PHASE_DATAOUT, "DATAOUT"}, - {PHASE_DATAIN, "DATAIN"}, - {PHASE_CMDOUT, "CMDOUT"}, - {PHASE_STATIN, "STATIN"}, - {PHASE_MSGOUT, "MSGOUT"}, - {PHASE_MSGIN, "MSGIN"}, - {PHASE_UNKNOWN, "UNKNOWN"} -}; /* * NCR5380_print_phase - show SCSI phase @@ -470,44 +466,6 @@ static void NCR5380_print_phase(struct Scsi_Host *instance) #endif /* - * We need to have our coroutine active given these constraints : - * 1. The mutex flag, main_running, can only be set when the main - * routine can actually process data, otherwise SCSI commands - * will never get issued. - * - * 2. NCR5380_main() shouldn't be called before it has exited, because - * other drivers have had kernel stack overflows in similar - * situations. - * - * 3. We don't want to inline NCR5380_main() because of space concerns, - * even though it is only called in two places. - * - * So, the solution is to set the mutex in an inline wrapper for the - * main coroutine, and have the main coroutine exit with interrupts - * disabled after the final search through the queues so that no race - * conditions are possible. - */ - -static unsigned long main_running = 0; - -/* - * Function : run_main(void) - * - * Purpose : insure that the coroutine is running and will process our - * request. main_running is checked/set here (in an inline function) - * rather than in NCR5380_main itself to reduce the chances of stack - * overflow. - * FIXME: NCR5380_main should probably be run with schedule_task or be a - * thread. - */ - -static __inline__ void run_main(void) -{ - if (!test_and_set_bit(0, &main_running)) - NCR5380_main(); -} - -/* * These need tweaking, and would probably work best as per-device * flags initialized differently for disk, tape, cd, etc devices. * People with broken devices are free to experiment as to what gives @@ -621,13 +579,17 @@ static int NCR5380_set_timer(struct Scsi_Host *instance) static void NCR5380_timer_fn(unsigned long unused) { struct Scsi_Host *instance; + struct NCR5380_hostdata *hostdata; unsigned long flags; spin_lock_irqsave(&timer_lock, flags); - for (; expires_first && time_before_eq(((struct NCR5380_hostdata *) expires_first->hostdata)->time_expires, jiffies);) { - instance = ((struct NCR5380_hostdata *) expires_first->hostdata)->next_timer; - ((struct NCR5380_hostdata *) expires_first->hostdata)->next_timer = NULL; - ((struct NCR5380_hostdata *) expires_first->hostdata)->time_expires = 0; + for (; expires_first && time_before_eq(((struct NCR5380_hostdata *) expires_first->hostdata)->time_expires, jiffies);) + { + hostdata = (struct NCR5380_hostdata *) expires_first->hostdata; + schedule_work(&hostdata->coroutine); + instance = hostdata->next_timer; + hostdata->next_timer = NULL; + hostdata->time_expires = 0; expires_first = instance; } @@ -636,10 +598,7 @@ static void NCR5380_timer_fn(unsigned long unused) usleep_timer.expires = ((struct NCR5380_hostdata *) expires_first->hostdata)->time_expires; add_timer(&usleep_timer); } - spin_unlock_irqrestore(&timer_lock, flags); - - run_main(); } /** @@ -779,6 +738,22 @@ static void __init NCR5380_print_options(struct Scsi_Host *instance) } /** + * NCR5380_coroutine_running - coroutine status + * @instance: controller to check + * + * Return true if the co-routine for this controller is running + * or scheduled to run + * + * FIXME: this test function belongs in the workqueue code! + */ + +static int NCR5380_coroutine_running(struct Scsi_Host *instance) +{ + struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *)instance->hostdata; + return test_bit(0, &hostdata->coroutine.pending); +} + +/** * NCR5380_print_status - dump controller info * @instance: controller to dump * @@ -794,7 +769,7 @@ static void NCR5380_print_status(struct Scsi_Host *instance) char *start; int len; - printk("NCR5380 : coroutine is%s running.\n", main_running ? "" : "n't"); + printk("NCR5380 : coroutine is%s running.\n", NCR5380_coroutine_running(instance)? "" : "n't"); NCR5380_dprint(NDEBUG_ANY, instance); NCR5380_dprint_phase(NDEBUG_ANY, instance); @@ -837,7 +812,7 @@ int NCR5380_proc_info(char *buffer, char **start, off_t offset, int length, int struct NCR5380_hostdata *hostdata; Scsi_Cmnd *ptr; - for (instance = first_instance; instance && instance->host_no != hostno; instance = instance->next); + instance = scsi_host_hn_get(hostno); if (!instance) return (-ESRCH); hostdata = (struct NCR5380_hostdata *) instance->hostdata; @@ -881,7 +856,7 @@ int NCR5380_proc_info(char *buffer, char **start, off_t offset, int length, int SPRINTF("Highwater I/O busy_spin_counts -- write: %d read: %d\n", pas_wmaxi, pas_maxi); #endif spin_lock_irq(instance->host_lock); - SPRINTF("NCR5380 : coroutine is%s running.\n", main_running ? "" : "n't"); + SPRINTF("NCR5380 : coroutine is%s running.\n", NCR5380_coroutine_running(instance) ? "" : "n't"); if (!hostdata->connected) SPRINTF("scsi%d: no currently connected command\n", instance->host_no); else @@ -904,8 +879,7 @@ int NCR5380_proc_info(char *buffer, char **start, off_t offset, int length, int return length; } -static -char *lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, char *pos, char *buffer, int length) +static char *lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, char *pos, char *buffer, int length) { SPRINTF("scsi%d : destination target %d, lun %d\n", cmd->host->host_no, cmd->target, cmd->lun); SPRINTF(" command = "); @@ -913,8 +887,7 @@ char *lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, char *pos, char *buffer, int length) return (pos); } -static -char *lprint_command(unsigned char *command, char *pos, char *buffer, int length) +static char *lprint_command(unsigned char *command, char *pos, char *buffer, int length) { int i, s; pos = lprint_opcode(command[0], pos, buffer, length); @@ -924,8 +897,7 @@ char *lprint_command(unsigned char *command, char *pos, char *buffer, int length return (pos); } -static -char *lprint_opcode(int opcode, char *pos, char *buffer, int length) +static char *lprint_opcode(int opcode, char *pos, char *buffer, int length) { SPRINTF("%2d (0x%02x)", opcode, opcode); return (pos); @@ -943,10 +915,12 @@ char *lprint_opcode(int opcode, char *pos, char *buffer, int length) * Notes : I assume that the host, hostno, and id bits have been * set correctly. I don't care about the irq and other fields. * + * Returns 0 for success + * * Locks: interrupts must be enabled when we are called */ -static void __init NCR5380_init(struct Scsi_Host *instance, int flags) +static int __init NCR5380_init(struct Scsi_Host *instance, int flags) { NCR5380_local_declare(); int i, pass; @@ -982,6 +956,9 @@ static void __init NCR5380_init(struct Scsi_Host *instance, int flags) hostdata->connected = NULL; hostdata->issue_queue = NULL; hostdata->disconnected_queue = NULL; + + INIT_WORK(&hostdata->coroutine, NCR5380_main, hostdata); + #ifdef NCR5380_STATS for (i = 0; i < 8; ++i) { hostdata->time_read[i] = 0; @@ -1000,10 +977,16 @@ static void __init NCR5380_init(struct Scsi_Host *instance, int flags) else hostdata->flags = FLAG_CHECK_LAST_BYTE_SENT | flags; - if (!the_template) { - the_template = instance->hostt; - first_instance = instance; - } + hostdata->next = NULL; + + if (!first_host) + first_host = hostdata; + else + last_host->next = hostdata; + + last_host = hostdata; + + hostdata->host = instance; hostdata->time_expires = 0; hostdata->next_timer = NULL; @@ -1041,22 +1024,28 @@ static void __init NCR5380_init(struct Scsi_Host *instance, int flags) case 1: case 3: case 5: - printk("scsi%d: SCSI bus busy, waiting up to five seconds\n", instance->host_no); + printk(KERN_INFO "scsi%d: SCSI bus busy, waiting up to five seconds\n", instance->host_no); timeout = jiffies + 5 * HZ; - while (time_before(jiffies, timeout) && (NCR5380_read(STATUS_REG) & SR_BSY)); + while (time_before(jiffies, timeout) && (NCR5380_read(STATUS_REG) & SR_BSY)) + { + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(1); + } break; case 2: - printk("scsi%d: bus busy, attempting abort\n", instance->host_no); + printk(KERN_WARNING "scsi%d: bus busy, attempting abort\n", instance->host_no); do_abort(instance); break; case 4: - printk("scsi%d: bus busy, attempting reset\n", instance->host_no); + printk(KERN_WARNING "scsi%d: bus busy, attempting reset\n", instance->host_no); do_reset(instance); break; case 6: - printk("scsi%d: bus locked solid or invalid override\n", instance->host_no); + printk(KERN_ERR "scsi%d: bus locked solid or invalid override\n", instance->host_no); + return -ENXIO; } } + return 0; } /** @@ -1072,15 +1061,11 @@ static void __init NCR5380_init(struct Scsi_Host *instance, int flags) * retake this lock. Called functions take dma lock. */ -/* Only make static if a wrapper function is used */ -#ifndef NCR5380_queue_command -static -#endif -int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) { +static int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) +{ struct Scsi_Host *instance = cmd->host; struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata; Scsi_Cmnd *tmp; - unsigned long flags; #if (NDEBUG & NDEBUG_NO_WRITE) switch (cmd->cmnd[0]) { @@ -1093,7 +1078,6 @@ int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) { } #endif /* (NDEBUG & NDEBUG_NO_WRITE) */ - spin_lock_irqsave(instance->host_lock, flags); #ifdef NCR5380_STATS switch (cmd->cmnd[0]) { case WRITE: @@ -1141,9 +1125,8 @@ int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) { dprintk(NDEBUG_QUEUES, ("scsi%d : command added to %s of queue\n", instance->host_no, (cmd->cmnd[0] == REQUEST_SENSE) ? "head" : "tail")); /* Run the coroutine if it isn't already running. */ - spin_unlock_irqrestore(instance->host_lock, flags); - - run_main(); + /* Kick off command processing */ + schedule_work(&hostdata->coroutine); return 0; } @@ -1155,21 +1138,22 @@ int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) { * NCR5380_queue_command() and NCR5380_intr() will try to start it * in case it is not running. * - * Locks; The caller must hold the io_request_lock. The lock will still be - * held on return but may be dropped while running. Called functions take - * the DMA lock. + * Locks: called as its own thread with no locks held. Takes the + * host lock and called routines may take the isa dma lock. */ -static void NCR5380_main(void) { +static void NCR5380_main(void *p) +{ + struct NCR5380_hostdata *hostdata = p; Scsi_Cmnd *tmp, *prev; struct Scsi_Host *instance; - struct NCR5380_hostdata *hostdata; int done; - + unsigned long flags; + /* * We run (with interrupts disabled) until we're sure that none of * the host adapters have anything that can be done, at which point - * we set main_running to 0 and exit. + * we can exit * * Interrupts are enabled before doing various other internal * instructions, after we've decided that we need to run through @@ -1178,113 +1162,112 @@ static void NCR5380_main(void) { * this should prevent any race conditions. */ + instance = hostdata->host; + + spin_lock_irqsave(instance->host_lock, flags); + do { /* Lock held here */ done = 1; - for (instance = first_instance; instance && instance->hostt == the_template; instance = instance->next) { - hostdata = (struct NCR5380_hostdata *) instance->hostdata; - /* Lock held here */ - if (!hostdata->connected && !hostdata->selecting) { - dprintk(NDEBUG_MAIN, ("scsi%d : not connected\n", instance->host_no)); - /* - * Search through the issue_queue for a command destined - * for a target that's not busy. - */ - for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, prev = NULL; tmp; prev = tmp, tmp = (Scsi_Cmnd *) tmp->host_scribble) - { - if (prev != tmp) - dprintk(NDEBUG_LISTS, ("MAIN tmp=%p target=%d busy=%d lun=%d\n", tmp, tmp->target, hostdata->busy[tmp->target], tmp->lun)); - /* When we find one, remove it from the issue queue. */ - if (!(hostdata->busy[tmp->target] & (1 << tmp->lun))) { - if (prev) { - REMOVE(prev, prev->host_scribble, tmp, tmp->host_scribble); - prev->host_scribble = tmp->host_scribble; - } else { - REMOVE(-1, hostdata->issue_queue, tmp, tmp->host_scribble); - hostdata->issue_queue = (Scsi_Cmnd *) tmp->host_scribble; - } - tmp->host_scribble = NULL; - - - /* - * Attempt to establish an I_T_L nexus here. - * On success, instance->hostdata->connected is set. - * On failure, we must add the command back to the - * issue queue so we can keep trying. - */ - dprintk(NDEBUG_MAIN|NDEBUG_QUEUES, ("scsi%d : main() : command for target %d lun %d removed from issue_queue\n", instance->host_no, tmp->target, tmp->lun)); + if (!hostdata->connected && !hostdata->selecting) { + dprintk(NDEBUG_MAIN, ("scsi%d : not connected\n", instance->host_no)); + /* + * Search through the issue_queue for a command destined + * for a target that's not busy. + */ + for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, prev = NULL; tmp; prev = tmp, tmp = (Scsi_Cmnd *) tmp->host_scribble) + { + if (prev != tmp) + dprintk(NDEBUG_LISTS, ("MAIN tmp=%p target=%d busy=%d lun=%d\n", tmp, tmp->target, hostdata->busy[tmp->target], tmp->lun)); + /* When we find one, remove it from the issue queue. */ + if (!(hostdata->busy[tmp->target] & (1 << tmp->lun))) { + if (prev) { + REMOVE(prev, prev->host_scribble, tmp, tmp->host_scribble); + prev->host_scribble = tmp->host_scribble; + } else { + REMOVE(-1, hostdata->issue_queue, tmp, tmp->host_scribble); + hostdata->issue_queue = (Scsi_Cmnd *) tmp->host_scribble; + } + tmp->host_scribble = NULL; - /* - * A successful selection is defined as one that - * leaves us with the command connected and - * in hostdata->connected, OR has terminated the - * command. - * - * With successful commands, we fall through - * and see if we can do an information transfer, - * with failures we will restart. - */ - hostdata->selecting = 0; - /* RvC: have to preset this to indicate a new command is being performed */ - - if (!NCR5380_select(instance, tmp, - /* - * REQUEST SENSE commands are issued without tagged - * queueing, even on SCSI-II devices because the - * contingent allegiance condition exists for the - * entire unit. - */ - (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE : TAG_NEXT)) { - break; - } else { - LIST(tmp, hostdata->issue_queue); - tmp->host_scribble = (unsigned char *) hostdata->issue_queue; - hostdata->issue_queue = tmp; - done = 0; - dprintk(NDEBUG_MAIN|NDEBUG_QUEUES, ("scsi%d : main(): select() failed, returned to issue_queue\n", instance->host_no)); - } - /* lock held here still */ - } /* if target/lun is not busy */ - } /* for */ - /* exited locked */ - } /* if (!hostdata->connected) */ - if (hostdata->selecting) { - tmp = (Scsi_Cmnd *) hostdata->selecting; - /* Selection will drop and retake the lock */ - if (!NCR5380_select(instance, tmp, (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE : TAG_NEXT)) { - /* Ok ?? */ - } else { - /* RvC: device failed, so we wait a long time - this is needed for Mustek scanners, that - do not respond to commands immediately - after a scan */ - printk(KERN_DEBUG "scsi%d: device %d did not respond in time\n", instance->host_no, tmp->target); - //spin_lock_irq(&io_request_lock); - LIST(tmp, hostdata->issue_queue); - tmp->host_scribble = (unsigned char *) hostdata->issue_queue; - hostdata->issue_queue = tmp; - //spin_unlock_irq(&io_request_lock); - - hostdata->time_expires = jiffies + USLEEP_WAITLONG; - NCR5380_set_timer(instance); - } - } /* if hostdata->selecting */ - if (hostdata->connected + /* + * Attempt to establish an I_T_L nexus here. + * On success, instance->hostdata->connected is set. + * On failure, we must add the command back to the + * issue queue so we can keep trying. + */ + dprintk(NDEBUG_MAIN|NDEBUG_QUEUES, ("scsi%d : main() : command for target %d lun %d removed from issue_queue\n", instance->host_no, tmp->target, tmp->lun)); + + /* + * A successful selection is defined as one that + * leaves us with the command connected and + * in hostdata->connected, OR has terminated the + * command. + * + * With successful commands, we fall through + * and see if we can do an information transfer, + * with failures we will restart. + */ + hostdata->selecting = 0; + /* RvC: have to preset this to indicate a new command is being performed */ + + if (!NCR5380_select(instance, tmp, + /* + * REQUEST SENSE commands are issued without tagged + * queueing, even on SCSI-II devices because the + * contingent allegiance condition exists for the + * entire unit. + */ + (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE : TAG_NEXT)) { + break; + } else { + LIST(tmp, hostdata->issue_queue); + tmp->host_scribble = (unsigned char *) hostdata->issue_queue; + hostdata->issue_queue = tmp; + done = 0; + dprintk(NDEBUG_MAIN|NDEBUG_QUEUES, ("scsi%d : main(): select() failed, returned to issue_queue\n", instance->host_no)); + } + /* lock held here still */ + } /* if target/lun is not busy */ + } /* for */ + /* exited locked */ + } /* if (!hostdata->connected) */ + if (hostdata->selecting) { + tmp = (Scsi_Cmnd *) hostdata->selecting; + /* Selection will drop and retake the lock */ + if (!NCR5380_select(instance, tmp, (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE : TAG_NEXT)) { + /* Ok ?? */ + } else { + /* RvC: device failed, so we wait a long time + this is needed for Mustek scanners, that + do not respond to commands immediately + after a scan */ + printk(KERN_DEBUG "scsi%d: device %d did not respond in time\n", instance->host_no, tmp->target); + //spin_lock_irq(&io_request_lock); + LIST(tmp, hostdata->issue_queue); + tmp->host_scribble = (unsigned char *) hostdata->issue_queue; + hostdata->issue_queue = tmp; + //spin_unlock_irq(&io_request_lock); + + hostdata->time_expires = jiffies + USLEEP_WAITLONG; + NCR5380_set_timer(instance); + } + } /* if hostdata->selecting */ + if (hostdata->connected #ifdef REAL_DMA - && !hostdata->dmalen + && !hostdata->dmalen #endif - && (!hostdata->time_expires || time_before_eq(hostdata->time_expires, jiffies)) - ) { - dprintk(NDEBUG_MAIN, ("scsi%d : main() : performing information transfer\n", instance->host_no)); - NCR5380_information_transfer(instance); - dprintk(NDEBUG_MAIN, ("scsi%d : main() : done set false\n", instance->host_no)); - done = 0; - } else - break; - } /* for instance */ + && (!hostdata->time_expires || time_before_eq(hostdata->time_expires, jiffies)) + ) { + dprintk(NDEBUG_MAIN, ("scsi%d : main() : performing information transfer\n", instance->host_no)); + NCR5380_information_transfer(instance); + dprintk(NDEBUG_MAIN, ("scsi%d : main() : done set false\n", instance->host_no)); + done = 0; + } else + break; } while (!done); - /* Exit lock held */ - clear_bit(0, &main_running); + + spin_unlock_irqrestore(instance->host_lock, flags); } #ifndef DONT_USE_INTR @@ -1308,6 +1291,7 @@ static void NCR5380_intr(int irq, void *dev_id, struct pt_regs *regs) struct Scsi_Host *instance; int done; unsigned char basr; + struct NCR5380_hostdata *hostdata; dprintk(NDEBUG_INTR, ("scsi : NCR5380 irq %d triggered\n", irq)); @@ -1315,8 +1299,9 @@ static void NCR5380_intr(int irq, void *dev_id, struct pt_regs *regs) done = 1; /* The instance list is constant while the driver is loaded */ - for (instance = first_instance; instance && (instance->hostt == the_template); instance = instance->next) + for (hostdata = first_host; hostdata != NULL; hostdata = hostdata->next) { + instance = hostdata->host; if (instance->irq == irq) { spin_lock_irq(instance->host_lock); /* Look for pending interrupts */ @@ -1385,8 +1370,8 @@ static void NCR5380_intr(int irq, void *dev_id, struct pt_regs *regs) } } /* if BASR_IRQ */ spin_unlock_irq(instance->host_lock); - if (!done) - run_main(); + if(!done) + schedule_work(&hostdata->coroutine); } /* if (instance->irq == irq) */ } } while (!done); diff --git a/drivers/scsi/NCR5380.h b/drivers/scsi/NCR5380.h index 0e3f396cff11..e48586b990dd 100644 --- a/drivers/scsi/NCR5380.h +++ b/drivers/scsi/NCR5380.h @@ -248,6 +248,8 @@ #ifndef ASM struct NCR5380_hostdata { NCR5380_implementation_fields; /* implementation specific */ + struct Scsi_Host *host; /* Host backpointer */ + struct NCR5380_hostdata *next; /* Next in our hot chain */ unsigned char id_mask, id_higher_mask; /* 1 << id, all bits greater */ unsigned char targets_present; /* targets we have connected to, so we can call a select @@ -269,6 +271,7 @@ struct NCR5380_hostdata { struct Scsi_Host *next_timer; int select_time; /* timer in select for target response */ volatile Scsi_Cmnd *selecting; + struct work_struct coroutine; /* our co-routine */ #ifdef NCR5380_STATS unsigned timebase; /* Base for time calcs */ long time_read[8]; /* time to do reads */ @@ -281,7 +284,6 @@ struct NCR5380_hostdata { }; #ifdef __KERNEL__ -static struct Scsi_Host *first_instance; /* linked list of 5380's */ #define dprintk(a,b) do {} while(0) #define NCR5380_dprint(a,b) do {} while(0) @@ -290,36 +292,22 @@ static struct Scsi_Host *first_instance; /* linked list of 5380's */ #if defined(AUTOPROBE_IRQ) static int NCR5380_probe_irq(struct Scsi_Host *instance, int possible); #endif -static void NCR5380_init(struct Scsi_Host *instance, int flags); +static int NCR5380_init(struct Scsi_Host *instance, int flags); static void NCR5380_information_transfer(struct Scsi_Host *instance); #ifndef DONT_USE_INTR static void NCR5380_intr(int irq, void *dev_id, struct pt_regs *regs); -static void do_NCR5380_intr(int irq, void *dev_id, struct pt_regs *regs); #endif -static void NCR5380_main(void); +static void NCR5380_main(void *ptr); static void NCR5380_print_options(struct Scsi_Host *instance); +#ifdef NDEBUG static void NCR5380_print_phase(struct Scsi_Host *instance); static void NCR5380_print(struct Scsi_Host *instance); -#ifndef NCR5380_abort -static #endif -int NCR5380_abort(Scsi_Cmnd * cmd); -#ifndef NCR5380_bus_reset -static -#endif -int NCR5380_bus_reset(Scsi_Cmnd * cmd); -#ifndef NCR5380_host_reset -static -#endif -int NCR5380_host_reset(Scsi_Cmnd * cmd); -#ifndef NCR5380_device_reset -static -#endif -int NCR5380_device_reset(Scsi_Cmnd * cmd); -#ifndef NCR5380_queue_command -static -#endif -int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)); +static int NCR5380_abort(Scsi_Cmnd * cmd); +static int NCR5380_bus_reset(Scsi_Cmnd * cmd); +static int NCR5380_host_reset(Scsi_Cmnd * cmd); +static int NCR5380_device_reset(Scsi_Cmnd * cmd); +static int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)); static void NCR5380_reselect(struct Scsi_Host *instance); diff --git a/drivers/scsi/NCR53c406a.c b/drivers/scsi/NCR53c406a.c index 98595897746d..d8025c6886c4 100644 --- a/drivers/scsi/NCR53c406a.c +++ b/drivers/scsi/NCR53c406a.c @@ -26,9 +26,9 @@ #define USE_PIO 1 #define USE_BIOS 0 -/* #define BIOS_ADDR 0xD8000 */ /* define this if autoprobe fails */ -/* #define PORT_BASE 0x330 */ /* define this if autoprobe fails */ -/* #define IRQ_LEV 0 */ /* define this if autoprobe fails */ + /* #define BIOS_ADDR 0xD8000 *//* define this if autoprobe fails */ + /* #define PORT_BASE 0x330 *//* define this if autoprobe fails */ + /* #define IRQ_LEV 0 *//* define this if autoprobe fails */ #define DMA_CHAN 5 /* this is ignored if DMA is disabled */ /* Set this to 0 if you encounter kernel lockups while transferring @@ -63,7 +63,7 @@ #define WATCHDOG 5000000 -#define SYNC_MODE 0 /* Synchronous transfer mode */ +#define SYNC_MODE 0 /* Synchronous transfer mode */ #if DEBUG #undef NCR53C406A_DEBUG @@ -161,24 +161,24 @@ /*----------------------------------------------------------------*/ enum Phase { - idle, - data_out, - data_in, - command_ph, - status_ph, - message_out, - message_in + idle, + data_out, + data_in, + command_ph, + status_ph, + message_out, + message_in }; /* Static function prototypes */ -static void NCR53c406a_intr(int, void *, struct pt_regs *); -static void do_NCR53c406a_intr(int, void *, struct pt_regs *); -static void internal_done(Scsi_Cmnd *); -static void wait_intr(void); -static void chip_init(void); -static void calc_port_addr(void); +static void NCR53c406a_intr(int, void *, struct pt_regs *); +static void do_NCR53c406a_intr(int, void *, struct pt_regs *); +static void internal_done(Scsi_Cmnd *); +static void wait_intr(void); +static void chip_init(void); +static void calc_port_addr(void); #ifndef IRQ_LEV -static int irq_probe(void); +static int irq_probe(void); #endif /* ================================================================= */ @@ -188,26 +188,26 @@ static void *bios_base; #endif #if PORT_BASE -static int port_base = PORT_BASE; +static int port_base = PORT_BASE; #else -static int port_base; +static int port_base; #endif #if IRQ_LEV -static int irq_level = IRQ_LEV; +static int irq_level = IRQ_LEV; #else -static int irq_level = -1; /* 0 is 'no irq', so use -1 for 'uninitialized'*/ +static int irq_level = -1; /* 0 is 'no irq', so use -1 for 'uninitialized' */ #endif #if USE_DMA -static int dma_chan; +static int dma_chan; #endif #if USE_PIO -static int fast_pio = USE_FAST_PIO; +static int fast_pio = USE_FAST_PIO; #endif -static Scsi_Cmnd *current_SC; +static Scsi_Cmnd *current_SC; static volatile int internal_done_flag; static volatile int internal_done_errcode; static char info_msg[256]; @@ -217,15 +217,14 @@ static char info_msg[256]; /* possible BIOS locations */ #if USE_BIOS static void *addresses[] = { - (void *)0xd8000, - (void *)0xc8000 + (void *) 0xd8000, + (void *) 0xc8000 }; #define ADDRESS_COUNT (sizeof( addresses ) / sizeof( unsigned )) -#endif /* USE_BIOS */ - +#endif /* USE_BIOS */ + /* possible i/o port addresses */ -static unsigned short ports[] = - { 0x230, 0x330, 0x280, 0x290, 0x330, 0x340, 0x300, 0x310, 0x348, 0x350 }; +static unsigned short ports[] = { 0x230, 0x330, 0x280, 0x290, 0x330, 0x340, 0x300, 0x310, 0x348, 0x350 }; #define PORT_COUNT (sizeof( ports ) / sizeof( unsigned short )) /* possible interrupt channels */ @@ -235,847 +234,835 @@ static unsigned short intrs[] = { 10, 11, 12, 15 }; /* signatures for NCR 53c406a based controllers */ #if USE_BIOS struct signature { - char *signature; - int sig_offset; - int sig_length; + char *signature; + int sig_offset; + int sig_length; } signatures[] __initdata = { - /* 1 2 3 4 5 6 */ - /* 123456789012345678901234567890123456789012345678901234567890 */ - { "Copyright (C) Acculogic, Inc.\r\n2.8M Diskette Extension Bios ver 4.04.03 03/01/1993", 61, 82 }, -}; + /* 1 2 3 4 5 6 */ + /* 123456789012345678901234567890123456789012345678901234567890 */ + { +"Copyright (C) Acculogic, Inc.\r\n2.8M Diskette Extension Bios ver 4.04.03 03/01/1993", 61, 82},}; + #define SIGNATURE_COUNT (sizeof( signatures ) / sizeof( struct signature )) -#endif /* USE_BIOS */ +#endif /* USE_BIOS */ /* ============================================================ */ /* Control Register Set 0 */ -static int TC_LSB; /* transfer counter lsb */ -static int TC_MSB; /* transfer counter msb */ -static int SCSI_FIFO; /* scsi fifo register */ -static int CMD_REG; /* command register */ -static int STAT_REG; /* status register */ +static int TC_LSB; /* transfer counter lsb */ +static int TC_MSB; /* transfer counter msb */ +static int SCSI_FIFO; /* scsi fifo register */ +static int CMD_REG; /* command register */ +static int STAT_REG; /* status register */ static int DEST_ID; /* selection/reselection bus id */ static int INT_REG; /* interrupt status register */ static int SRTIMOUT; /* select/reselect timeout reg */ -static int SEQ_REG; /* sequence step register */ +static int SEQ_REG; /* sequence step register */ static int SYNCPRD; /* synchronous transfer period */ static int FIFO_FLAGS; /* indicates # of bytes in fifo */ static int SYNCOFF; /* synchronous offset register */ -static int CONFIG1; /* configuration register */ -static int CLKCONV; /* clock conversion reg */ -/*static int TESTREG;*/ /* test mode register */ +static int CONFIG1; /* configuration register */ +static int CLKCONV; /* clock conversion reg */ + /*static int TESTREG;*//* test mode register */ static int CONFIG2; /* Configuration 2 Register */ -static int CONFIG3; /* Configuration 3 Register */ +static int CONFIG3; /* Configuration 3 Register */ static int CONFIG4; /* Configuration 4 Register */ static int TC_HIGH; /* Transfer Counter High */ -/*static int FIFO_BOTTOM;*/ /* Reserve FIFO byte register */ + /*static int FIFO_BOTTOM;*//* Reserve FIFO byte register */ /* Control Register Set 1 */ -/*static int JUMPER_SENSE;*/ /* Jumper sense port reg (r/w) */ -/*static int SRAM_PTR;*/ /* SRAM address pointer reg (r/w) */ -/*static int SRAM_DATA;*/ /* SRAM data register (r/w) */ + /*static int JUMPER_SENSE;*//* Jumper sense port reg (r/w) */ + /*static int SRAM_PTR;*//* SRAM address pointer reg (r/w) */ + /*static int SRAM_DATA;*//* SRAM data register (r/w) */ static int PIO_FIFO; /* PIO FIFO registers (r/w) */ -/*static int PIO_FIFO1;*/ /* */ -/*static int PIO_FIFO2;*/ /* */ -/*static int PIO_FIFO3;*/ /* */ + /*static int PIO_FIFO1;*//* */ + /*static int PIO_FIFO2;*//* */ + /*static int PIO_FIFO3;*//* */ static int PIO_STATUS; /* PIO status (r/w) */ -/*static int ATA_CMD;*/ /* ATA command/status reg (r/w) */ -/*static int ATA_ERR;*/ /* ATA features/error register (r/w)*/ + /*static int ATA_CMD;*//* ATA command/status reg (r/w) */ + /*static int ATA_ERR;*//* ATA features/error register (r/w) */ static int PIO_FLAG; /* PIO flag interrupt enable (r/w) */ static int CONFIG5; /* Configuration 5 register (r/w) */ -/*static int SIGNATURE;*/ /* Signature Register (r) */ -/*static int CONFIG6;*/ /* Configuration 6 register (r) */ + /*static int SIGNATURE;*//* Signature Register (r) */ + /*static int CONFIG6;*//* Configuration 6 register (r) */ /* ============================================================== */ #if USE_DMA -static __inline__ int -NCR53c406a_dma_setup (unsigned char *ptr, - unsigned int count, - unsigned char mode) { - unsigned limit; - unsigned long flags = 0; - - VDEB(printk("dma: before count=%d ", count)); - if (dma_chan <=3) { - if (count > 65536) - count = 65536; - limit = 65536 - (((unsigned) ptr) & 0xFFFF); - } else { - if (count > (65536<<1)) - count = (65536<<1); - limit = (65536<<1) - (((unsigned) ptr) & 0x1FFFF); - } - - if (count > limit) count = limit; - - VDEB(printk("after count=%d\n", count)); - if ((count & 1) || (((unsigned) ptr) & 1)) - panic ("NCR53c406a: attempted unaligned DMA transfer\n"); - - flags=claim_dma_lock(); - disable_dma(dma_chan); - clear_dma_ff(dma_chan); - set_dma_addr(dma_chan, (long) ptr); - set_dma_count(dma_chan, count); - set_dma_mode(dma_chan, mode); - enable_dma(dma_chan); - release_dma_lock(flags); - - return count; +static __inline__ int NCR53c406a_dma_setup(unsigned char *ptr, unsigned int count, unsigned char mode) +{ + unsigned limit; + unsigned long flags = 0; + + VDEB(printk("dma: before count=%d ", count)); + if (dma_chan <= 3) { + if (count > 65536) + count = 65536; + limit = 65536 - (((unsigned) ptr) & 0xFFFF); + } else { + if (count > (65536 << 1)) + count = (65536 << 1); + limit = (65536 << 1) - (((unsigned) ptr) & 0x1FFFF); + } + + if (count > limit) + count = limit; + + VDEB(printk("after count=%d\n", count)); + if ((count & 1) || (((unsigned) ptr) & 1)) + panic("NCR53c406a: attempted unaligned DMA transfer\n"); + + flags = claim_dma_lock(); + disable_dma(dma_chan); + clear_dma_ff(dma_chan); + set_dma_addr(dma_chan, (long) ptr); + set_dma_count(dma_chan, count); + set_dma_mode(dma_chan, mode); + enable_dma(dma_chan); + release_dma_lock(flags); + + return count; } -static __inline__ int -NCR53c406a_dma_write(unsigned char *src, unsigned int count) { - return NCR53c406a_dma_setup (src, count, DMA_MODE_WRITE); +static __inline__ int NCR53c406a_dma_write(unsigned char *src, unsigned int count) +{ + return NCR53c406a_dma_setup(src, count, DMA_MODE_WRITE); } -static __inline__ int -NCR53c406a_dma_read(unsigned char *src, unsigned int count) { - return NCR53c406a_dma_setup (src, count, DMA_MODE_READ); +static __inline__ int NCR53c406a_dma_read(unsigned char *src, unsigned int count) +{ + return NCR53c406a_dma_setup(src, count, DMA_MODE_READ); } -static __inline__ int -NCR53c406a_dma_residual (void) { - register int tmp; - unsigned long flags; - - flags=claim_dma_lock(); - clear_dma_ff(dma_chan); - tmp = get_dma_residue(dma_chan); - release_dma_lock(flags); - - return tmp; +static __inline__ int NCR53c406a_dma_residual(void) +{ + register int tmp; + unsigned long flags; + + flags = claim_dma_lock(); + clear_dma_ff(dma_chan); + tmp = get_dma_residue(dma_chan); + release_dma_lock(flags); + + return tmp; } -#endif /* USE_DMA */ +#endif /* USE_DMA */ #if USE_PIO -static __inline__ int NCR53c406a_pio_read(unsigned char *request, - unsigned int reqlen) +static __inline__ int NCR53c406a_pio_read(unsigned char *request, unsigned int reqlen) { - int i; - int len; /* current scsi fifo size */ - unsigned long flags = 0; - - REG1; - while (reqlen) { - i = inb(PIO_STATUS); - /* VDEB(printk("pio_status=%x\n", i)); */ - if (i & 0x80) - return 0; - - switch( i & 0x1e ) { - default: - case 0x10: - len=0; break; - case 0x0: - len=1; break; - case 0x8: - len=42; break; - case 0xc: - len=84; break; - case 0xe: - len=128; break; - } - - if ((i & 0x40) && len == 0) { /* fifo empty and interrupt occurred */ - return 0; - } - - if (len) { - if( len > reqlen ) - len = reqlen; - - save_flags(flags); - cli(); - if( fast_pio && len > 3 ) { - insl(PIO_FIFO,request,len>>2); - request += len & 0xfc; - reqlen -= len & 0xfc; - } - else { - while(len--) { - *request++ = inb(PIO_FIFO); - reqlen--; - } - } - restore_flags(flags); - } - } - return 0; + int i; + int len; /* current scsi fifo size */ + + REG1; + while (reqlen) { + i = inb(PIO_STATUS); + /* VDEB(printk("pio_status=%x\n", i)); */ + if (i & 0x80) + return 0; + + switch (i & 0x1e) { + default: + case 0x10: + len = 0; + break; + case 0x0: + len = 1; + break; + case 0x8: + len = 42; + break; + case 0xc: + len = 84; + break; + case 0xe: + len = 128; + break; + } + + if ((i & 0x40) && len == 0) { /* fifo empty and interrupt occurred */ + return 0; + } + + if (len) { + if (len > reqlen) + len = reqlen; + + if (fast_pio && len > 3) { + insl(PIO_FIFO, request, len >> 2); + request += len & 0xfc; + reqlen -= len & 0xfc; + } else { + while (len--) { + *request++ = inb(PIO_FIFO); + reqlen--; + } + } + } + } + return 0; } -static __inline__ int NCR53c406a_pio_write(unsigned char *request, - unsigned int reqlen) +static __inline__ int NCR53c406a_pio_write(unsigned char *request, unsigned int reqlen) { - int i = 0; - int len; /* current scsi fifo size */ - unsigned long flags = 0; - - REG1; - while (reqlen && !(i&0x40)) { - i = inb(PIO_STATUS); - /* VDEB(printk("pio_status=%x\n", i)); */ - if (i & 0x80) /* error */ - return 0; - - switch( i & 0x1e ) { - case 0x10: - len=128; break; - case 0x0: - len=84; break; - case 0x8: - len=42; break; - case 0xc: - len=1; break; - default: - case 0xe: - len=0; break; - } - - if (len) { - if( len > reqlen ) - len = reqlen; - - save_flags(flags); - cli(); - if( fast_pio && len > 3 ) { - outsl(PIO_FIFO,request,len>>2); - request += len & 0xfc; - reqlen -= len & 0xfc; - } - else { - while(len--) { - outb(*request++, PIO_FIFO); - reqlen--; - } - } - restore_flags(flags); - } - } - return 0; + int i = 0; + int len; /* current scsi fifo size */ + + REG1; + while (reqlen && !(i & 0x40)) { + i = inb(PIO_STATUS); + /* VDEB(printk("pio_status=%x\n", i)); */ + if (i & 0x80) /* error */ + return 0; + + switch (i & 0x1e) { + case 0x10: + len = 128; + break; + case 0x0: + len = 84; + break; + case 0x8: + len = 42; + break; + case 0xc: + len = 1; + break; + default: + case 0xe: + len = 0; + break; + } + + if (len) { + if (len > reqlen) + len = reqlen; + + if (fast_pio && len > 3) { + outsl(PIO_FIFO, request, len >> 2); + request += len & 0xfc; + reqlen -= len & 0xfc; + } else { + while (len--) { + outb(*request++, PIO_FIFO); + reqlen--; + } + } + } + } + return 0; } -#endif /* USE_PIO */ +#endif /* USE_PIO */ -int __init -NCR53c406a_detect(Scsi_Host_Template * tpnt){ - struct Scsi_Host *shpnt = NULL; +static int __init NCR53c406a_detect(Scsi_Host_Template * tpnt) +{ + struct Scsi_Host *shpnt = NULL; #ifndef PORT_BASE - int i; + int i; #endif - + #if USE_BIOS - int ii, jj; - bios_base = 0; - /* look for a valid signature */ - for( ii=0; ii < ADDRESS_COUNT && !bios_base; ii++) - for( jj=0; (jj < SIGNATURE_COUNT) && !bios_base; jj++) - if(!memcmp((void *) addresses[ii]+signatures[jj].sig_offset, - (void *) signatures[jj].signature, - (int) signatures[jj].sig_length)) - bios_base=addresses[ii]; - - if(!bios_base){ - printk("NCR53c406a: BIOS signature not found\n"); - return 0; - } - - DEB(printk("NCR53c406a BIOS found at %X\n", (unsigned int) bios_base);); -#endif /* USE_BIOS */ - + int ii, jj; + bios_base = 0; + /* look for a valid signature */ + for (ii = 0; ii < ADDRESS_COUNT && !bios_base; ii++) + for (jj = 0; (jj < SIGNATURE_COUNT) && !bios_base; jj++) + if (!memcmp((void *) addresses[ii] + signatures[jj].sig_offset, (void *) signatures[jj].signature, (int) signatures[jj].sig_length)) + bios_base = addresses[ii]; + + if (!bios_base) { + printk("NCR53c406a: BIOS signature not found\n"); + return 0; + } + + DEB(printk("NCR53c406a BIOS found at %X\n", (unsigned int) bios_base); + ); +#endif /* USE_BIOS */ + #ifdef PORT_BASE - if (!request_region(port_base, 0x10, "NCR53c406a")) /* ports already snatched */ - port_base = 0; - -#else /* autodetect */ - if (port_base) { /* LILO override */ - if (!request_region(port_base, 0x10, "NCR53c406a")) - port_base = 0; - } - else { - for(i=0; i<PORT_COUNT && !port_base; i++){ - if(!request_region(ports[i], 0x10, "NCR53c406a")){ - DEB(printk("NCR53c406a: port %x in use\n", ports[i])); - } - else { - VDEB(printk("NCR53c406a: port %x available\n", ports[i])); - outb(C5_IMG, ports[i] + 0x0d); /* reg set 1 */ - if( (inb(ports[i] + 0x0e) ^ inb(ports[i] + 0x0e)) == 7 - && (inb(ports[i] + 0x0e) ^ inb(ports[i] + 0x0e)) == 7 - && (inb(ports[i] + 0x0e) & 0xf8) == 0x58 ) { - port_base = ports[i]; - VDEB(printk("NCR53c406a: Sig register valid\n")); - VDEB(printk("port_base=%x\n", port_base)); - break; - } - release_region(ports[i], 0x10); - } - } - } -#endif /* PORT_BASE */ - - if(!port_base){ /* no ports found */ - printk("NCR53c406a: no available ports found\n"); - return 0; - } - - DEB(printk("NCR53c406a detected\n")); - - calc_port_addr(); - chip_init(); - + if (!request_region(port_base, 0x10, "NCR53c406a")) /* ports already snatched */ + port_base = 0; + +#else /* autodetect */ + if (port_base) { /* LILO override */ + if (!request_region(port_base, 0x10, "NCR53c406a")) + port_base = 0; + } else { + for (i = 0; i < PORT_COUNT && !port_base; i++) { + if (!request_region(ports[i], 0x10, "NCR53c406a")) { + DEB(printk("NCR53c406a: port %x in use\n", ports[i])); + } else { + VDEB(printk("NCR53c406a: port %x available\n", ports[i])); + outb(C5_IMG, ports[i] + 0x0d); /* reg set 1 */ + if ((inb(ports[i] + 0x0e) ^ inb(ports[i] + 0x0e)) == 7 && (inb(ports[i] + 0x0e) ^ inb(ports[i] + 0x0e)) == 7 && (inb(ports[i] + 0x0e) & 0xf8) == 0x58) { + port_base = ports[i]; + VDEB(printk("NCR53c406a: Sig register valid\n")); + VDEB(printk("port_base=%x\n", port_base)); + break; + } + release_region(ports[i], 0x10); + } + } + } +#endif /* PORT_BASE */ + + if (!port_base) { /* no ports found */ + printk("NCR53c406a: no available ports found\n"); + return 0; + } + + DEB(printk("NCR53c406a detected\n")); + + calc_port_addr(); + chip_init(); + #ifndef IRQ_LEV - if (irq_level < 0) { /* LILO override if >= 0*/ - irq_level=irq_probe(); - if (irq_level < 0) { /* Trouble */ - printk("NCR53c406a: IRQ problem, irq_level=%d, giving up\n", irq_level); - goto err_release; - } - } + if (irq_level < 0) { /* LILO override if >= 0 */ + irq_level = irq_probe(); + if (irq_level < 0) { /* Trouble */ + printk("NCR53c406a: IRQ problem, irq_level=%d, giving up\n", irq_level); + goto err_release; + } + } #endif - - DEB(printk("NCR53c406a: using port_base %x\n", port_base)); - - tpnt->present = 1; - tpnt->proc_name = "NCR53c406a"; - - shpnt = scsi_register(tpnt, 0); - if (!shpnt) { - printk("NCR53c406a: Unable to register host, giving up.\n"); - goto err_release; - } - - if(irq_level > 0) { - if(request_irq(irq_level, do_NCR53c406a_intr, 0, "NCR53c406a", shpnt)){ - printk("NCR53c406a: unable to allocate IRQ %d\n", irq_level); - goto err_free_scsi; - } - tpnt->can_queue = 1; - DEB(printk("NCR53c406a: allocated IRQ %d\n", irq_level)); - } - else if (irq_level == 0) { - tpnt->can_queue = 0; - DEB(printk("NCR53c406a: No interrupts detected\n")); + + DEB(printk("NCR53c406a: using port_base %x\n", port_base)); + + tpnt->present = 1; + tpnt->proc_name = "NCR53c406a"; + + shpnt = scsi_register(tpnt, 0); + if (!shpnt) { + printk("NCR53c406a: Unable to register host, giving up.\n"); + goto err_release; + } + + if (irq_level > 0) { + if (request_irq(irq_level, do_NCR53c406a_intr, 0, "NCR53c406a", shpnt)) { + printk("NCR53c406a: unable to allocate IRQ %d\n", irq_level); + goto err_free_scsi; + } + tpnt->can_queue = 1; + DEB(printk("NCR53c406a: allocated IRQ %d\n", irq_level)); + } else if (irq_level == 0) { + tpnt->can_queue = 0; + DEB(printk("NCR53c406a: No interrupts detected\n")); #if USE_DMA - printk("NCR53c406a: No interrupts found and DMA mode defined. Giving up.\n"); - goto err_free_scsi; -#endif /* USE_DMA */ - } - else { - DEB(printk("NCR53c406a: Shouldn't get here!\n")); - goto err_free_scsi; - } - + printk("NCR53c406a: No interrupts found and DMA mode defined. Giving up.\n"); + goto err_free_scsi; +#endif /* USE_DMA */ + } else { + DEB(printk("NCR53c406a: Shouldn't get here!\n")); + goto err_free_scsi; + } + #if USE_DMA - dma_chan = DMA_CHAN; - if(request_dma(dma_chan, "NCR53c406a") != 0){ - printk("NCR53c406a: unable to allocate DMA channel %d\n", dma_chan); - goto err_free_irq; - } - - DEB(printk("Allocated DMA channel %d\n", dma_chan)); -#endif /* USE_DMA */ - - shpnt->irq = irq_level; - shpnt->io_port = port_base; - shpnt->n_io_port = 0x10; + dma_chan = DMA_CHAN; + if (request_dma(dma_chan, "NCR53c406a") != 0) { + printk("NCR53c406a: unable to allocate DMA channel %d\n", dma_chan); + goto err_free_irq; + } + + DEB(printk("Allocated DMA channel %d\n", dma_chan)); +#endif /* USE_DMA */ + + shpnt->irq = irq_level; + shpnt->io_port = port_base; + shpnt->n_io_port = 0x10; #if USE_DMA - shpnt->dma = dma_chan; + shpnt->dma = dma_chan; #endif - + #if USE_DMA - sprintf(info_msg, "NCR53c406a at 0x%x, IRQ %d, DMA channel %d.", - port_base, irq_level, dma_chan); + sprintf(info_msg, "NCR53c406a at 0x%x, IRQ %d, DMA channel %d.", port_base, irq_level, dma_chan); #else - sprintf(info_msg, "NCR53c406a at 0x%x, IRQ %d, %s PIO mode.", - port_base, irq_level, fast_pio ? "fast" : "slow"); + sprintf(info_msg, "NCR53c406a at 0x%x, IRQ %d, %s PIO mode.", port_base, irq_level, fast_pio ? "fast" : "slow"); #endif - - return (tpnt->present); + + return (tpnt->present); #if USE_DMA - err_free_irq: - if(irq_level) - free_irq(irq_level, shpnt); -#endif - err_free_scsi: - scsi_unregister(shpnt); - err_release: - release_region(port_base, 0x10); - return 0; + err_free_irq: + if (irq_level) + free_irq(irq_level, shpnt); +#endif + err_free_scsi: + scsi_unregister(shpnt); + err_release: + release_region(port_base, 0x10); + return 0; } /* called from init/main.c */ -void __init NCR53c406a_setup(char *str, int *ints) +static void __init NCR53c406a_setup(char *str, int *ints) { - static size_t setup_idx = 0; - size_t i; - - DEB(printk("NCR53c406a: Setup called\n");); - - if (setup_idx >= PORT_COUNT - 1) { - printk("NCR53c406a: Setup called too many times. Bad LILO params?\n"); - return; - } - if (ints[0] < 1 || ints[0] > 3) { - printk("NCR53c406a: Malformed command line\n"); - printk("NCR53c406a: Usage: ncr53c406a=<PORTBASE>[,<IRQ>[,<FASTPIO>]]\n"); - return; - } - for (i = 0; i < PORT_COUNT && !port_base; i++) - if (ports[i] == ints[1]) { - port_base = ints[1]; - DEB(printk("NCR53c406a: Specified port_base 0x%X\n", port_base);) - } - if (!port_base) { - printk("NCR53c406a: Invalid PORTBASE 0x%X specified\n", ints[1]); - return; - } - - if (ints[0] > 1) { - if (ints[2] == 0) { - irq_level = 0; - DEB(printk("NCR53c406a: Specified irq %d\n", irq_level);) - } - else - for (i = 0; i < INTR_COUNT && irq_level < 0; i++) - if (intrs[i] == ints[2]) { - irq_level = ints[2]; - DEB(printk("NCR53c406a: Specified irq %d\n", port_base);) - } - if (irq_level < 0) - printk("NCR53c406a: Invalid IRQ %d specified\n", ints[2]); - } - - if (ints[0] > 2) - fast_pio = ints[3]; - - DEB(printk("NCR53c406a: port_base=0x%X, irq=%d, fast_pio=%d\n", - port_base, irq_level, fast_pio);) + static size_t setup_idx = 0; + size_t i; + + DEB(printk("NCR53c406a: Setup called\n"); + ); + + if (setup_idx >= PORT_COUNT - 1) { + printk("NCR53c406a: Setup called too many times. Bad LILO params?\n"); + return; + } + if (ints[0] < 1 || ints[0] > 3) { + printk("NCR53c406a: Malformed command line\n"); + printk("NCR53c406a: Usage: ncr53c406a=<PORTBASE>[,<IRQ>[,<FASTPIO>]]\n"); + return; + } + for (i = 0; i < PORT_COUNT && !port_base; i++) + if (ports[i] == ints[1]) { + port_base = ints[1]; + DEB(printk("NCR53c406a: Specified port_base 0x%X\n", port_base); + ) + } + if (!port_base) { + printk("NCR53c406a: Invalid PORTBASE 0x%X specified\n", ints[1]); + return; + } + + if (ints[0] > 1) { + if (ints[2] == 0) { + irq_level = 0; + DEB(printk("NCR53c406a: Specified irq %d\n", irq_level); + ) + } else + for (i = 0; i < INTR_COUNT && irq_level < 0; i++) + if (intrs[i] == ints[2]) { + irq_level = ints[2]; + DEB(printk("NCR53c406a: Specified irq %d\n", port_base); + ) + } + if (irq_level < 0) + printk("NCR53c406a: Invalid IRQ %d specified\n", ints[2]); + } + + if (ints[0] > 2) + fast_pio = ints[3]; + + DEB(printk("NCR53c406a: port_base=0x%X, irq=%d, fast_pio=%d\n", port_base, irq_level, fast_pio);) } -const char* -NCR53c406a_info(struct Scsi_Host *SChost){ - DEB(printk("NCR53c406a_info called\n")); - return (info_msg); +__setup("ncr53c406a=", NCR53c406a_setup); + +static const char *NCR53c406a_info(struct Scsi_Host *SChost) +{ + DEB(printk("NCR53c406a_info called\n")); + return (info_msg); } -static void internal_done(Scsi_Cmnd *SCpnt) { - internal_done_errcode = SCpnt->result; - ++internal_done_flag; +static void internal_done(Scsi_Cmnd * SCpnt) +{ + internal_done_errcode = SCpnt->result; + ++internal_done_flag; } -static void wait_intr(void) { - int i = jiffies + WATCHDOG; - - while(time_after(i,jiffies) && !(inb(STAT_REG)&0xe0)) /* wait for a pseudo-interrupt */ - barrier(); - - if (time_before_eq(i,jiffies)) { /* Timed out */ - rtrc(0); - current_SC->result = DID_TIME_OUT << 16; - current_SC->SCp.phase = idle; - current_SC->scsi_done(current_SC); - return; - } - - NCR53c406a_intr(0, NULL, NULL); +static void wait_intr(void) +{ + int i = jiffies + WATCHDOG; + + while (time_after(i, jiffies) && !(inb(STAT_REG) & 0xe0)) { /* wait for a pseudo-interrupt */ + cpu_relax(); + barrier(); + } + + if (time_before_eq(i, jiffies)) { /* Timed out */ + rtrc(0); + current_SC->result = DID_TIME_OUT << 16; + current_SC->SCp.phase = idle; + current_SC->scsi_done(current_SC); + return; + } + + NCR53c406a_intr(0, NULL, NULL); } -int NCR53c406a_command(Scsi_Cmnd *SCpnt){ - DEB(printk("NCR53c406a_command called\n")); - NCR53c406a_queue(SCpnt, internal_done); - if(irq_level) - while (!internal_done_flag); - else /* interrupts not supported */ - while (!internal_done_flag) - wait_intr(); - - internal_done_flag = 0; - return internal_done_errcode; +static int NCR53c406a_command(Scsi_Cmnd * SCpnt) +{ + DEB(printk("NCR53c406a_command called\n")); + NCR53c406a_queue(SCpnt, internal_done); + if (irq_level) + while (!internal_done_flag) + cpu_relax(); + else /* interrupts not supported */ + while (!internal_done_flag) + wait_intr(); + + internal_done_flag = 0; + return internal_done_errcode; } -int -NCR53c406a_queue(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)){ - int i; - unsigned long flags = 0; +static int NCR53c406a_queue(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) +{ + int i; + + VDEB(printk("NCR53c406a_queue called\n")); + DEB(printk("cmd=%02x, cmd_len=%02x, target=%02x, lun=%02x, bufflen=%d\n", SCpnt->cmnd[0], SCpnt->cmd_len, SCpnt->target, SCpnt->lun, SCpnt->request_bufflen)); - VDEB(printk("NCR53c406a_queue called\n")); - DEB(printk("cmd=%02x, cmd_len=%02x, target=%02x, lun=%02x, bufflen=%d\n", - SCpnt->cmnd[0], - SCpnt->cmd_len, - SCpnt->target, - SCpnt->lun, - SCpnt->request_bufflen)); - #if 0 - VDEB(for(i=0; i<SCpnt->cmd_len; i++) - printk("cmd[%d]=%02x ", i, SCpnt->cmnd[i])); - VDEB(printk("\n")); + VDEB(for (i = 0; i < SCpnt->cmd_len; i++) + printk("cmd[%d]=%02x ", i, SCpnt->cmnd[i])); + VDEB(printk("\n")); #endif - - current_SC = SCpnt; - current_SC->scsi_done = done; - current_SC->SCp.phase = command_ph; - current_SC->SCp.Status = 0; - current_SC->SCp.Message = 0; - - save_flags(flags); - cli(); - REG0; - outb(SCpnt->target, DEST_ID); /* set destination */ - outb(FLUSH_FIFO, CMD_REG); /* reset the fifos */ - - for(i=0; i<SCpnt->cmd_len; i++){ - outb(SCpnt->cmnd[i], SCSI_FIFO); - } - outb(SELECT_NO_ATN, CMD_REG); - restore_flags(flags); - - rtrc(1); - return 0; + + current_SC = SCpnt; + current_SC->scsi_done = done; + current_SC->SCp.phase = command_ph; + current_SC->SCp.Status = 0; + current_SC->SCp.Message = 0; + + /* We are locked here already by the mid layer */ + REG0; + outb(SCpnt->target, DEST_ID); /* set destination */ + outb(FLUSH_FIFO, CMD_REG); /* reset the fifos */ + + for (i = 0; i < SCpnt->cmd_len; i++) { + outb(SCpnt->cmnd[i], SCSI_FIFO); + } + outb(SELECT_NO_ATN, CMD_REG); + + rtrc(1); + return 0; +} + +static int NCR53c406a_abort(Scsi_Cmnd * SCpnt) +{ + DEB(printk("NCR53c406a_abort called\n")); + return FAILED; /* Don't know how to abort */ +} + +static int NCR53c406a_host_reset(Scsi_Cmnd * SCpnt) +{ + DEB(printk("NCR53c406a_reset called\n")); + outb(C4_IMG, CONFIG4); /* Select reg set 0 */ + outb(CHIP_RESET, CMD_REG); + outb(SCSI_NOP, CMD_REG); /* required after reset */ + outb(SCSI_RESET, CMD_REG); + chip_init(); + + rtrc(2); + return SUCCESS; } -int -NCR53c406a_abort(Scsi_Cmnd *SCpnt){ - DEB(printk("NCR53c406a_abort called\n")); - return SCSI_ABORT_SNOOZE; /* Don't know how to abort */ +static int NCR53c406a_device_reset(Scsi_Cmnd * SCpnt) +{ + return FAILED; } -int -NCR53c406a_reset(Scsi_Cmnd *SCpnt, unsigned int ignored){ - DEB(printk("NCR53c406a_reset called\n")); - outb(C4_IMG, CONFIG4); /* Select reg set 0 */ - outb(CHIP_RESET, CMD_REG); - outb(SCSI_NOP, CMD_REG); /* required after reset */ - outb(SCSI_RESET, CMD_REG); - chip_init(); - - rtrc(2); - if (irq_level) - return SCSI_RESET_PENDING; /* should get an interrupt */ - else - return SCSI_RESET_WAKEUP; /* won't get any interrupts */ +static int NCR53c406a_bus_reset(Scsi_Cmnd * SCpnt) +{ + return FAILED; } -int -NCR53c406a_biosparm(Scsi_Disk *disk, struct block_device *dev, int* info_array){ - int size; - - DEB(printk("NCR53c406a_biosparm called\n")); - - size = disk->capacity; - info_array[0] = 64; /* heads */ - info_array[1] = 32; /* sectors */ - info_array[2] = size>>11; /* cylinders */ - if (info_array[2] > 1024) { /* big disk */ - info_array[0] = 255; - info_array[1] = 63; - info_array[2] = size / (255*63); - } - return 0; - } - - static void -do_NCR53c406a_intr(int unused, void *dev_id, struct pt_regs *regs){ - unsigned long flags; - struct Scsi_Host * dev = dev_id; - - spin_lock_irqsave(dev->host_lock, flags); - NCR53c406a_intr(0, dev_id, regs); - spin_unlock_irqrestore(dev->host_lock, flags); +static int NCR53c406a_biosparm(Scsi_Disk * disk, struct block_device *dev, int *info_array) +{ + int size; + + DEB(printk("NCR53c406a_biosparm called\n")); + + size = disk->capacity; + info_array[0] = 64; /* heads */ + info_array[1] = 32; /* sectors */ + info_array[2] = size >> 11; /* cylinders */ + if (info_array[2] > 1024) { /* big disk */ + info_array[0] = 255; + info_array[1] = 63; + info_array[2] = size / (255 * 63); + } + return 0; +} + +static void do_NCR53c406a_intr(int unused, void *dev_id, struct pt_regs *regs) +{ + unsigned long flags; + struct Scsi_Host *dev = dev_id; + + spin_lock_irqsave(dev->host_lock, flags); + NCR53c406a_intr(0, dev_id, regs); + spin_unlock_irqrestore(dev->host_lock, flags); } - static void -NCR53c406a_intr(int unused, void *dev_id, struct pt_regs *regs){ - DEB(unsigned char fifo_size;) - DEB(unsigned char seq_reg;) - unsigned char status, int_reg; - unsigned long flags = 0; +static void NCR53c406a_intr(int unused, void *dev_id, struct pt_regs *regs) +{ + DEB(unsigned char fifo_size; + ) + DEB(unsigned char seq_reg; + ) + unsigned char status, int_reg; #if USE_PIO - unsigned char pio_status; - struct scatterlist *sglist; - unsigned int sgcount; + unsigned char pio_status; + struct scatterlist *sglist; + unsigned int sgcount; #endif - - VDEB(printk("NCR53c406a_intr called\n")); - - save_flags(flags); - cli(); + + VDEB(printk("NCR53c406a_intr called\n")); + #if USE_PIO - REG1; - pio_status = inb(PIO_STATUS); + REG1; + pio_status = inb(PIO_STATUS); #endif - REG0; - status = inb(STAT_REG); - DEB(seq_reg = inb(SEQ_REG)); - int_reg = inb(INT_REG); - DEB(fifo_size = inb(FIFO_FLAGS) & 0x1f); - restore_flags(flags); - + REG0; + status = inb(STAT_REG); + DEB(seq_reg = inb(SEQ_REG)); + int_reg = inb(INT_REG); + DEB(fifo_size = inb(FIFO_FLAGS) & 0x1f); + #if NCR53C406A_DEBUG - printk("status=%02x, seq_reg=%02x, int_reg=%02x, fifo_size=%02x", - status, seq_reg, int_reg, fifo_size); + printk("status=%02x, seq_reg=%02x, int_reg=%02x, fifo_size=%02x", status, seq_reg, int_reg, fifo_size); #if (USE_DMA) - printk("\n"); + printk("\n"); #else - printk(", pio=%02x\n", pio_status); -#endif /* USE_DMA */ -#endif /* NCR53C406A_DEBUG */ - - if(int_reg & 0x80){ /* SCSI reset intr */ - rtrc(3); - DEB(printk("NCR53c406a: reset intr received\n")); - current_SC->SCp.phase = idle; - current_SC->result = DID_RESET << 16; - current_SC->scsi_done(current_SC); - return; - } - + printk(", pio=%02x\n", pio_status); +#endif /* USE_DMA */ +#endif /* NCR53C406A_DEBUG */ + + if (int_reg & 0x80) { /* SCSI reset intr */ + rtrc(3); + DEB(printk("NCR53c406a: reset intr received\n")); + current_SC->SCp.phase = idle; + current_SC->result = DID_RESET << 16; + current_SC->scsi_done(current_SC); + return; + } #if USE_PIO - if(pio_status & 0x80) { - printk("NCR53C406A: Warning: PIO error!\n"); - current_SC->SCp.phase = idle; - current_SC->result = DID_ERROR << 16; - current_SC->scsi_done(current_SC); - return; - } -#endif /* USE_PIO */ - - if(status & 0x20) { /* Parity error */ - printk("NCR53c406a: Warning: parity error!\n"); - current_SC->SCp.phase = idle; - current_SC->result = DID_PARITY << 16; - current_SC->scsi_done(current_SC); - return; - } - - if(status & 0x40) { /* Gross error */ - printk("NCR53c406a: Warning: gross error!\n"); - current_SC->SCp.phase = idle; - current_SC->result = DID_ERROR << 16; - current_SC->scsi_done(current_SC); - return; - } - - if(int_reg & 0x20){ /* Disconnect */ - DEB(printk("NCR53c406a: disconnect intr received\n")); - if(current_SC->SCp.phase != message_in){ /* Unexpected disconnect */ - current_SC->result = DID_NO_CONNECT << 16; - } - else{ /* Command complete, return status and message */ - current_SC->result = (current_SC->SCp.Status & 0xff) - | ((current_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16); - } - - rtrc(0); - current_SC->SCp.phase = idle; - current_SC->scsi_done( current_SC ); - return; - } - - switch(status & 0x07){ /* scsi phase */ - case 0x00: /* DATA-OUT */ - if(int_reg & 0x10){ /* Target requesting info transfer */ - rtrc(5); - current_SC->SCp.phase = data_out; - VDEB(printk("NCR53c406a: Data-Out phase\n")); - outb(FLUSH_FIFO, CMD_REG); - LOAD_DMA_COUNT(current_SC->request_bufflen); /* Max transfer size */ + if (pio_status & 0x80) { + printk("NCR53C406A: Warning: PIO error!\n"); + current_SC->SCp.phase = idle; + current_SC->result = DID_ERROR << 16; + current_SC->scsi_done(current_SC); + return; + } +#endif /* USE_PIO */ + + if (status & 0x20) { /* Parity error */ + printk("NCR53c406a: Warning: parity error!\n"); + current_SC->SCp.phase = idle; + current_SC->result = DID_PARITY << 16; + current_SC->scsi_done(current_SC); + return; + } + + if (status & 0x40) { /* Gross error */ + printk("NCR53c406a: Warning: gross error!\n"); + current_SC->SCp.phase = idle; + current_SC->result = DID_ERROR << 16; + current_SC->scsi_done(current_SC); + return; + } + + if (int_reg & 0x20) { /* Disconnect */ + DEB(printk("NCR53c406a: disconnect intr received\n")); + if (current_SC->SCp.phase != message_in) { /* Unexpected disconnect */ + current_SC->result = DID_NO_CONNECT << 16; + } else { /* Command complete, return status and message */ + current_SC->result = (current_SC->SCp.Status & 0xff) + | ((current_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16); + } + + rtrc(0); + current_SC->SCp.phase = idle; + current_SC->scsi_done(current_SC); + return; + } + + switch (status & 0x07) { /* scsi phase */ + case 0x00: /* DATA-OUT */ + if (int_reg & 0x10) { /* Target requesting info transfer */ + rtrc(5); + current_SC->SCp.phase = data_out; + VDEB(printk("NCR53c406a: Data-Out phase\n")); + outb(FLUSH_FIFO, CMD_REG); + LOAD_DMA_COUNT(current_SC->request_bufflen); /* Max transfer size */ #if USE_DMA /* No s/g support for DMA */ - NCR53c406a_dma_write(current_SC->request_buffer, - current_SC->request_bufflen); -#endif /* USE_DMA */ - outb(TRANSFER_INFO | DMA_OP, CMD_REG); + NCR53c406a_dma_write(current_SC->request_buffer, current_SC->request_bufflen); +#endif /* USE_DMA */ + outb(TRANSFER_INFO | DMA_OP, CMD_REG); #if USE_PIO - if (!current_SC->use_sg) /* Don't use scatter-gather */ - NCR53c406a_pio_write(current_SC->request_buffer, - current_SC->request_bufflen); - else { /* use scatter-gather */ - sgcount = current_SC->use_sg; - sglist = current_SC->request_buffer; - while( sgcount-- ) { - NCR53c406a_pio_write(page_address(sglist->page) + sglist->offset, sglist->length); - sglist++; - } - } - REG0; -#endif /* USE_PIO */ - } - break; - - case 0x01: /* DATA-IN */ - if(int_reg & 0x10){ /* Target requesting info transfer */ - rtrc(6); - current_SC->SCp.phase = data_in; - VDEB(printk("NCR53c406a: Data-In phase\n")); - outb(FLUSH_FIFO, CMD_REG); - LOAD_DMA_COUNT(current_SC->request_bufflen); /* Max transfer size */ + if (!current_SC->use_sg) /* Don't use scatter-gather */ + NCR53c406a_pio_write(current_SC->request_buffer, current_SC->request_bufflen); + else { /* use scatter-gather */ + sgcount = current_SC->use_sg; + sglist = current_SC->request_buffer; + while (sgcount--) { + NCR53c406a_pio_write(page_address(sglist->page) + sglist->offset, sglist->length); + sglist++; + } + } + REG0; +#endif /* USE_PIO */ + } + break; + + case 0x01: /* DATA-IN */ + if (int_reg & 0x10) { /* Target requesting info transfer */ + rtrc(6); + current_SC->SCp.phase = data_in; + VDEB(printk("NCR53c406a: Data-In phase\n")); + outb(FLUSH_FIFO, CMD_REG); + LOAD_DMA_COUNT(current_SC->request_bufflen); /* Max transfer size */ #if USE_DMA /* No s/g support for DMA */ - NCR53c406a_dma_read(current_SC->request_buffer, - current_SC->request_bufflen); -#endif /* USE_DMA */ - outb(TRANSFER_INFO | DMA_OP, CMD_REG); + NCR53c406a_dma_read(current_SC->request_buffer, current_SC->request_bufflen); +#endif /* USE_DMA */ + outb(TRANSFER_INFO | DMA_OP, CMD_REG); #if USE_PIO - if (!current_SC->use_sg) /* Don't use scatter-gather */ - NCR53c406a_pio_read(current_SC->request_buffer, - current_SC->request_bufflen); - else { /* Use scatter-gather */ - sgcount = current_SC->use_sg; - sglist = current_SC->request_buffer; - while( sgcount-- ) { - NCR53c406a_pio_read(page_address(sglist->page) + sglist->offset, sglist->length); - sglist++; - } - } - REG0; -#endif /* USE_PIO */ - } - break; - - case 0x02: /* COMMAND */ - current_SC->SCp.phase = command_ph; - printk("NCR53c406a: Warning: Unknown interrupt occurred in command phase!\n"); - break; - - case 0x03: /* STATUS */ - rtrc(7); - current_SC->SCp.phase = status_ph; - VDEB(printk("NCR53c406a: Status phase\n")); - outb(FLUSH_FIFO, CMD_REG); - outb(INIT_CMD_COMPLETE, CMD_REG); - break; - - case 0x04: /* Reserved */ - case 0x05: /* Reserved */ - printk("NCR53c406a: WARNING: Reserved phase!!!\n"); - break; - - case 0x06: /* MESSAGE-OUT */ - DEB(printk("NCR53c406a: Message-Out phase\n")); - current_SC->SCp.phase = message_out; - outb(SET_ATN, CMD_REG); /* Reject the message */ - outb(MSG_ACCEPT, CMD_REG); - break; - - case 0x07: /* MESSAGE-IN */ - rtrc(4); - VDEB(printk("NCR53c406a: Message-In phase\n")); - current_SC->SCp.phase = message_in; - - current_SC->SCp.Status = inb(SCSI_FIFO); - current_SC->SCp.Message = inb(SCSI_FIFO); - - VDEB(printk("SCSI FIFO size=%d\n", inb(FIFO_FLAGS) & 0x1f)); - DEB(printk("Status = %02x Message = %02x\n", - current_SC->SCp.Status, current_SC->SCp.Message)); - - if(current_SC->SCp.Message == SAVE_POINTERS || - current_SC->SCp.Message == DISCONNECT) { - outb(SET_ATN, CMD_REG); /* Reject message */ - DEB(printk("Discarding SAVE_POINTERS message\n")); - } - outb(MSG_ACCEPT, CMD_REG); - break; - } + if (!current_SC->use_sg) /* Don't use scatter-gather */ + NCR53c406a_pio_read(current_SC->request_buffer, current_SC->request_bufflen); + else { /* Use scatter-gather */ + sgcount = current_SC->use_sg; + sglist = current_SC->request_buffer; + while (sgcount--) { + NCR53c406a_pio_read(page_address(sglist->page) + sglist->offset, sglist->length); + sglist++; + } + } + REG0; +#endif /* USE_PIO */ + } + break; + + case 0x02: /* COMMAND */ + current_SC->SCp.phase = command_ph; + printk("NCR53c406a: Warning: Unknown interrupt occurred in command phase!\n"); + break; + + case 0x03: /* STATUS */ + rtrc(7); + current_SC->SCp.phase = status_ph; + VDEB(printk("NCR53c406a: Status phase\n")); + outb(FLUSH_FIFO, CMD_REG); + outb(INIT_CMD_COMPLETE, CMD_REG); + break; + + case 0x04: /* Reserved */ + case 0x05: /* Reserved */ + printk("NCR53c406a: WARNING: Reserved phase!!!\n"); + break; + + case 0x06: /* MESSAGE-OUT */ + DEB(printk("NCR53c406a: Message-Out phase\n")); + current_SC->SCp.phase = message_out; + outb(SET_ATN, CMD_REG); /* Reject the message */ + outb(MSG_ACCEPT, CMD_REG); + break; + + case 0x07: /* MESSAGE-IN */ + rtrc(4); + VDEB(printk("NCR53c406a: Message-In phase\n")); + current_SC->SCp.phase = message_in; + + current_SC->SCp.Status = inb(SCSI_FIFO); + current_SC->SCp.Message = inb(SCSI_FIFO); + + VDEB(printk("SCSI FIFO size=%d\n", inb(FIFO_FLAGS) & 0x1f)); + DEB(printk("Status = %02x Message = %02x\n", current_SC->SCp.Status, current_SC->SCp.Message)); + + if (current_SC->SCp.Message == SAVE_POINTERS || current_SC->SCp.Message == DISCONNECT) { + outb(SET_ATN, CMD_REG); /* Reject message */ + DEB(printk("Discarding SAVE_POINTERS message\n")); + } + outb(MSG_ACCEPT, CMD_REG); + break; + } } #ifndef IRQ_LEV static int irq_probe(void) { - int irqs, irq; - int i; - - inb(INT_REG); /* clear the interrupt register */ - irqs = probe_irq_on(); - - /* Invalid command will cause an interrupt */ - REG0; - outb(0xff, CMD_REG); - - /* Wait for the interrupt to occur */ - i = jiffies + WATCHDOG; - while(time_after(i, jiffies) && !(inb(STAT_REG) & 0x80)) - barrier(); - if (time_before_eq(i, jiffies)) { /* Timed out, must be hardware trouble */ - probe_irq_off(irqs); - return -1; - } - - irq = probe_irq_off(irqs); - - /* Kick the chip */ - outb(CHIP_RESET, CMD_REG); - outb(SCSI_NOP, CMD_REG); - chip_init(); - - return irq; + int irqs, irq; + int i; + + inb(INT_REG); /* clear the interrupt register */ + irqs = probe_irq_on(); + + /* Invalid command will cause an interrupt */ + REG0; + outb(0xff, CMD_REG); + + /* Wait for the interrupt to occur */ + i = jiffies + WATCHDOG; + while (time_after(i, jiffies) && !(inb(STAT_REG) & 0x80)) + barrier(); + if (time_before_eq(i, jiffies)) { /* Timed out, must be hardware trouble */ + probe_irq_off(irqs); + return -1; + } + + irq = probe_irq_off(irqs); + + /* Kick the chip */ + outb(CHIP_RESET, CMD_REG); + outb(SCSI_NOP, CMD_REG); + chip_init(); + + return irq; } -#endif /* IRQ_LEV */ +#endif /* IRQ_LEV */ static void chip_init(void) { - REG1; + REG1; #if USE_DMA - outb(0x00, PIO_STATUS); -#else /* USE_PIO */ - outb(0x01, PIO_STATUS); + outb(0x00, PIO_STATUS); +#else /* USE_PIO */ + outb(0x01, PIO_STATUS); #endif - outb(0x00, PIO_FLAG); - - outb(C4_IMG, CONFIG4); /* REG0; */ - outb(C3_IMG, CONFIG3); - outb(C2_IMG, CONFIG2); - outb(C1_IMG, CONFIG1); - - outb(0x05, CLKCONV); /* clock conversion factor */ - outb(0x9C, SRTIMOUT); /* Selection timeout */ - outb(0x05, SYNCPRD); /* Synchronous transfer period */ - outb(SYNC_MODE, SYNCOFF); /* synchronous mode */ + outb(0x00, PIO_FLAG); + + outb(C4_IMG, CONFIG4); /* REG0; */ + outb(C3_IMG, CONFIG3); + outb(C2_IMG, CONFIG2); + outb(C1_IMG, CONFIG1); + + outb(0x05, CLKCONV); /* clock conversion factor */ + outb(0x9C, SRTIMOUT); /* Selection timeout */ + outb(0x05, SYNCPRD); /* Synchronous transfer period */ + outb(SYNC_MODE, SYNCOFF); /* synchronous mode */ } -void __init calc_port_addr(void) +static void __init calc_port_addr(void) { - /* Control Register Set 0 */ - TC_LSB = (port_base+0x00); - TC_MSB = (port_base+0x01); - SCSI_FIFO = (port_base+0x02); - CMD_REG = (port_base+0x03); - STAT_REG = (port_base+0x04); - DEST_ID = (port_base+0x04); - INT_REG = (port_base+0x05); - SRTIMOUT = (port_base+0x05); - SEQ_REG = (port_base+0x06); - SYNCPRD = (port_base+0x06); - FIFO_FLAGS = (port_base+0x07); - SYNCOFF = (port_base+0x07); - CONFIG1 = (port_base+0x08); - CLKCONV = (port_base+0x09); - /* TESTREG = (port_base+0x0A); */ - CONFIG2 = (port_base+0x0B); - CONFIG3 = (port_base+0x0C); - CONFIG4 = (port_base+0x0D); - TC_HIGH = (port_base+0x0E); - /* FIFO_BOTTOM = (port_base+0x0F); */ - - /* Control Register Set 1 */ - /* JUMPER_SENSE = (port_base+0x00);*/ - /* SRAM_PTR = (port_base+0x01);*/ - /* SRAM_DATA = (port_base+0x02);*/ - PIO_FIFO = (port_base+0x04); - /* PIO_FIFO1 = (port_base+0x05);*/ - /* PIO_FIFO2 = (port_base+0x06);*/ - /* PIO_FIFO3 = (port_base+0x07);*/ - PIO_STATUS = (port_base+0x08); - /* ATA_CMD = (port_base+0x09);*/ - /* ATA_ERR = (port_base+0x0A);*/ - PIO_FLAG = (port_base+0x0B); - CONFIG5 = (port_base+0x0D); - /* SIGNATURE = (port_base+0x0E);*/ - /* CONFIG6 = (port_base+0x0F);*/ + /* Control Register Set 0 */ + TC_LSB = (port_base + 0x00); + TC_MSB = (port_base + 0x01); + SCSI_FIFO = (port_base + 0x02); + CMD_REG = (port_base + 0x03); + STAT_REG = (port_base + 0x04); + DEST_ID = (port_base + 0x04); + INT_REG = (port_base + 0x05); + SRTIMOUT = (port_base + 0x05); + SEQ_REG = (port_base + 0x06); + SYNCPRD = (port_base + 0x06); + FIFO_FLAGS = (port_base + 0x07); + SYNCOFF = (port_base + 0x07); + CONFIG1 = (port_base + 0x08); + CLKCONV = (port_base + 0x09); + /* TESTREG = (port_base+0x0A); */ + CONFIG2 = (port_base + 0x0B); + CONFIG3 = (port_base + 0x0C); + CONFIG4 = (port_base + 0x0D); + TC_HIGH = (port_base + 0x0E); + /* FIFO_BOTTOM = (port_base+0x0F); */ + + /* Control Register Set 1 */ + /* JUMPER_SENSE = (port_base+0x00); */ + /* SRAM_PTR = (port_base+0x01); */ + /* SRAM_DATA = (port_base+0x02); */ + PIO_FIFO = (port_base + 0x04); + /* PIO_FIFO1 = (port_base+0x05); */ + /* PIO_FIFO2 = (port_base+0x06); */ + /* PIO_FIFO3 = (port_base+0x07); */ + PIO_STATUS = (port_base + 0x08); + /* ATA_CMD = (port_base+0x09); */ + /* ATA_ERR = (port_base+0x0A); */ + PIO_FLAG = (port_base + 0x0B); + CONFIG5 = (port_base + 0x0D); + /* SIGNATURE = (port_base+0x0E); */ + /* CONFIG6 = (port_base+0x0F); */ } + MODULE_LICENSE("GPL"); /* Eventually this will go into an include file, but this will be later */ diff --git a/drivers/scsi/NCR53c406a.h b/drivers/scsi/NCR53c406a.h index b056a9367f8b..a29b8f6b6157 100644 --- a/drivers/scsi/NCR53c406a.h +++ b/drivers/scsi/NCR53c406a.h @@ -26,50 +26,34 @@ * Use SG_NONE if DMA mode is enabled! */ #define NCR53c406a { \ - proc_name: "NCR53c406a" /* proc_name */, \ - name: "NCR53c406a" /* name */, \ - detect: NCR53c406a_detect /* detect */, \ - info: NCR53c406a_info /* info */, \ - command: NCR53c406a_command /* command */, \ - queuecommand: NCR53c406a_queue /* queuecommand */, \ - abort: NCR53c406a_abort /* abort */, \ - reset: NCR53c406a_reset /* reset */, \ - bios_param: NCR53c406a_biosparm /* biosparm */, \ - can_queue: 1 /* can_queue */, \ - this_id: 7 /* SCSI ID of the chip */, \ - sg_tablesize: 32 /*SG_ALL*/ /*SG_NONE*/, \ - cmd_per_lun: 1 /* commands per lun */, \ - unchecked_isa_dma: 1 /* unchecked_isa_dma */, \ - use_clustering: ENABLE_CLUSTERING \ + proc_name: "NCR53c406a" /* proc_name */, \ + name: "NCR53c406a" /* name */, \ + detect: NCR53c406a_detect /* detect */, \ + info: NCR53c406a_info /* info */, \ + command: NCR53c406a_command /* command */, \ + queuecommand: NCR53c406a_queue /* queuecommand */, \ + eh_abort_handler: NCR53c406a_abort /* abort */, \ + eh_bus_reset_handler: NCR53c406a_bus_reset /* reset */, \ + eh_device_reset_handler: NCR53c406a_device_reset /* reset */, \ + eh_host_reset_handler: NCR53c406a_host_reset /* reset */, \ + bios_param: NCR53c406a_biosparm /* biosparm */, \ + can_queue: 1 /* can_queue */, \ + this_id: 7 /* SCSI ID of the chip */, \ + sg_tablesize: 32 /*SG_ALL*/ /*SG_NONE*/, \ + cmd_per_lun: 1 /* commands per lun */, \ + unchecked_isa_dma: 1 /* unchecked_isa_dma */, \ + use_clustering: ENABLE_CLUSTERING \ } -int NCR53c406a_detect(Scsi_Host_Template *); -const char* NCR53c406a_info(struct Scsi_Host *); +static int NCR53c406a_detect(Scsi_Host_Template *); +static const char *NCR53c406a_info(struct Scsi_Host *); -int NCR53c406a_command(Scsi_Cmnd *); -int NCR53c406a_queue(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -int NCR53c406a_abort(Scsi_Cmnd *); -int NCR53c406a_reset(Scsi_Cmnd *, unsigned int); -int NCR53c406a_biosparm(Disk *, struct block_device *, int []); - -#endif /* _NCR53C406A_H */ - -/* - * Overrides for Emacs so that we get a uniform tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-indent-level: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * indent-tabs-mode: nil - * tab-width: 8 - * End: - */ +static int NCR53c406a_command(Scsi_Cmnd *); +static int NCR53c406a_queue(Scsi_Cmnd *, void (*done) (Scsi_Cmnd *)); +static int NCR53c406a_abort(Scsi_Cmnd *); +static int NCR53c406a_bus_reset(Scsi_Cmnd *); +static int NCR53c406a_device_reset(Scsi_Cmnd *); +static int NCR53c406a_host_reset(Scsi_Cmnd *); +static int NCR53c406a_biosparm(Disk *, struct block_device *, int[]); +#endif /* _NCR53C406A_H */ diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index 6df9ff071b23..47afc6acda9e 100644 --- a/drivers/scsi/advansys.c +++ b/drivers/scsi/advansys.c @@ -1570,7 +1570,6 @@ typedef struct asc_dvc_cfg { uchar isa_dma_speed; uchar isa_dma_channel; uchar chip_version; - ushort pci_device_id; ushort lib_serial_no; ushort lib_version; ushort mcode_date; @@ -1580,6 +1579,7 @@ typedef struct asc_dvc_cfg { uchar sdtr_period_offset[ASC_MAX_TID + 1]; ushort pci_slot_info; uchar adapter_info[6]; + struct pci_dev *pci_dev; } ASC_DVC_CFG; #define ASC_DEF_DVC_CNTL 0xFFFF @@ -3075,7 +3075,6 @@ typedef struct adv_dvc_cfg { ushort disc_enable; /* enable disconnection */ uchar chip_version; /* chip version */ uchar termination; /* Term. Ctrl. bits 6-5 of SCSI_CFG1 register */ - ushort pci_device_id; /* PCI device code number */ ushort lib_version; /* Adv Library version number */ ushort control_flag; /* Microcode Control Flag */ ushort mcode_date; /* Microcode date */ @@ -3086,6 +3085,7 @@ typedef struct adv_dvc_cfg { ushort serial1; /* EEPROM serial number word 1 */ ushort serial2; /* EEPROM serial number word 2 */ ushort serial3; /* EEPROM serial number word 3 */ + struct pci_dev *pci_dev; /* pointer to the pci dev structure for this board */ } ADV_DVC_CFG; struct adv_dvc_var; @@ -4957,7 +4957,7 @@ advansys_detect(Scsi_Host_Template *tpnt) #ifdef CONFIG_PCI case ASC_IS_PCI: shp->irq = asc_dvc_varp->irq_no = pci_devp->irq; - asc_dvc_varp->cfg->pci_device_id = pci_devp->device; + asc_dvc_varp->cfg->pci_dev = pci_devp; asc_dvc_varp->cfg->pci_slot_info = ASC_PCI_MKID(pci_devp->bus->number, PCI_SLOT(pci_devp->devfn), @@ -4981,7 +4981,7 @@ advansys_detect(Scsi_Host_Template *tpnt) */ #ifdef CONFIG_PCI shp->irq = adv_dvc_varp->irq_no = pci_devp->irq; - adv_dvc_varp->cfg->pci_device_id = pci_devp->device; + adv_dvc_varp->cfg->pci_dev = pci_devp; adv_dvc_varp->cfg->pci_slot_info = ASC_PCI_MKID(pci_devp->bus->number, PCI_SLOT(pci_devp->devfn), @@ -9040,10 +9040,7 @@ DvcReadPCIConfigByte( { #ifdef CONFIG_PCI uchar byte_data; - pcibios_read_config_byte(ASC_PCI_ID2BUS(asc_dvc->cfg->pci_slot_info), - PCI_DEVFN(ASC_PCI_ID2DEV(asc_dvc->cfg->pci_slot_info), - ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info)), - offset, &byte_data); + pci_read_config_byte(asc_dvc->cfg->pci_dev, offset, &byte_data); return byte_data; #else /* !defined(CONFIG_PCI) */ return 0; @@ -9062,10 +9059,7 @@ DvcWritePCIConfigByte( ) { #ifdef CONFIG_PCI - pcibios_write_config_byte(ASC_PCI_ID2BUS(asc_dvc->cfg->pci_slot_info), - PCI_DEVFN(ASC_PCI_ID2DEV(asc_dvc->cfg->pci_slot_info), - ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info)), - offset, byte_data); + pci_write_config_byte(asc_dvc->cfg->pci_dev, offset, byte_data); #endif /* CONFIG_PCI */ } @@ -9163,10 +9157,7 @@ DvcAdvReadPCIConfigByte( { #ifdef CONFIG_PCI uchar byte_data; - pcibios_read_config_byte(ASC_PCI_ID2BUS(asc_dvc->cfg->pci_slot_info), - PCI_DEVFN(ASC_PCI_ID2DEV(asc_dvc->cfg->pci_slot_info), - ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info)), - offset, &byte_data); + pci_read_config_byte(asc_dvc->cfg->pci_dev, offset, &byte_data); return byte_data; #else /* CONFIG_PCI */ return 0; @@ -9185,10 +9176,7 @@ DvcAdvWritePCIConfigByte( ) { #ifdef CONFIG_PCI - pcibios_write_config_byte(ASC_PCI_ID2BUS(asc_dvc->cfg->pci_slot_info), - PCI_DEVFN(ASC_PCI_ID2DEV(asc_dvc->cfg->pci_slot_info), - ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info)), - offset, byte_data); + pci_write_config_byte(asc_dvc->cfg->pci_dev, offset, byte_data); #else /* CONFIG_PCI */ return 0; #endif /* CONFIG_PCI */ @@ -9548,7 +9536,7 @@ asc_prt_asc_dvc_cfg(ASC_DVC_CFG *h) printk( " pci_device_id %d, lib_serial_no %u, lib_version %u, mcode_date 0x%x,\n", - h->pci_device_id, h->lib_serial_no, h->lib_version, h->mcode_date); + h->pci_dev->device, h->lib_serial_no, h->lib_version, h->mcode_date); printk( " mcode_version %d, overrun_buf 0x%lx\n", @@ -9673,7 +9661,7 @@ asc_prt_adv_dvc_cfg(ADV_DVC_CFG *h) printk( " mcode_version 0x%x, pci_device_id 0x%x, lib_version %u\n", - h->mcode_version, h->pci_device_id, h->lib_version); + h->mcode_version, h->pci_dev->device, h->lib_version); printk( " control_flag 0x%x, pci_slot_info 0x%x\n", @@ -12342,7 +12330,7 @@ AscInitFromAscDvcVar( ushort pci_device_id; iop_base = asc_dvc->iop_base; - pci_device_id = asc_dvc->cfg->pci_device_id; + pci_device_id = asc_dvc->cfg->pci_dev->device; warn_code = 0; cfg_msw = AscGetChipCfgMsw(iop_base); if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) { diff --git a/drivers/scsi/aha1740.c b/drivers/scsi/aha1740.c index de1e23c9fbb7..0290f59c8aab 100644 --- a/drivers/scsi/aha1740.c +++ b/drivers/scsi/aha1740.c @@ -64,6 +64,8 @@ struct aha1740_hostdata { #define HOSTDATA(host) ((struct aha1740_hostdata *) &host->hostdata) +static spinlock_t aha1740_lock = SPIN_LOCK_UNLOCKED; + /* One for each IRQ level (9-15) */ static struct Scsi_Host * aha_host[8] = {NULL, }; @@ -258,7 +260,7 @@ void aha1740_intr_handle(int irq, void *dev_id, struct pt_regs * regs) continue; } if (SCtmp->host_scribble) - scsi_free(SCtmp->host_scribble, 512); + kfree(SCtmp->host_scribble); /* Fetch the sense data, and tuck it away, in the required slot. The Adaptec automatically fetches it, and there is no guarantee that we will still have it in the cdb when we come @@ -346,8 +348,8 @@ int aha1740_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *)) #endif /* locate an available ecb */ - save_flags(flags); - cli(); + + spin_lock_irqsave(&aha1740_lock, flags); ecbno = host->last_ecb_used + 1; /* An optimization */ if (ecbno >= AHA1740_ECBS) ecbno = 0; @@ -366,7 +368,7 @@ int aha1740_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *)) doubles as reserved flag */ host->last_ecb_used = ecbno; - restore_flags(flags); + spin_unlock_irqrestore(&aha1740_lock, flags); #ifdef DEBUG printk("Sending command (%d %x)...", ecbno, done); @@ -390,14 +392,18 @@ int aha1740_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *)) DEB(unsigned char * ptr); host->ecb[ecbno].sg = 1; /* SCSI Initiator Command w/scatter-gather*/ - SCpnt->host_scribble = (unsigned char *) scsi_malloc(512); + SCpnt->host_scribble = (unsigned char *)kmalloc(512, GFP_KERNEL); + if(SCpnt->host_scribble == NULL) + { + printk(KERN_WARNING "aha1740: out of memory in queuecommand!\n"); + return 1; + } sgpnt = (struct scatterlist *) SCpnt->request_buffer; cptr = (struct aha1740_chain *) SCpnt->host_scribble; - if (cptr == NULL) panic("aha1740.c: unable to allocate DMA memory\n"); for(i=0; i<SCpnt->use_sg; i++) { cptr[i].datalen = sgpnt[i].length; - cptr[i].dataptr = isa_virt_to_bus(sgpnt[i].address); + cptr[i].dataptr = isa_virt_to_bus(page_address(sgpnt[i].page) + sgpnt[i].offset); } host->ecb[ecbno].datalen = SCpnt->use_sg * sizeof(struct aha1740_chain); host->ecb[ecbno].dataptr = isa_virt_to_bus(cptr); @@ -448,13 +454,12 @@ int aha1740_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *)) int loopcnt; unsigned int base = SCpnt->host->io_port; DEB(printk("aha1740[%d] critical section\n",ecbno)); - save_flags(flags); - cli(); + + spin_lock_irqsave(&aha1740_lock, flags); for (loopcnt = 0; ; loopcnt++) { if (inb(G2STAT(base)) & G2STAT_MBXOUT) break; if (loopcnt == LOOPCNT_WARN) { printk("aha1740[%d]_mbxout wait!\n",ecbno); - cli(); /* printk may have done a sti()! */ } if (loopcnt == LOOPCNT_MAX) panic("aha1740.c: mbxout busy!\n"); @@ -464,13 +469,12 @@ int aha1740_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *)) if (! (inb(G2STAT(base)) & G2STAT_BUSY)) break; if (loopcnt == LOOPCNT_WARN) { printk("aha1740[%d]_attn wait!\n",ecbno); - cli(); } if (loopcnt == LOOPCNT_MAX) panic("aha1740.c: attn wait failed!\n"); } outb(ATTN_START | (target & 7), ATTN(base)); /* Start it up */ - restore_flags(flags); + spin_unlock_irqrestore(&aha1740_lock, flags); DEB(printk("aha1740[%d] request queued.\n",ecbno)); } else @@ -488,7 +492,10 @@ int aha1740_command(Scsi_Cmnd * SCpnt) aha1740_queuecommand(SCpnt, internal_done); SCpnt->SCp.Status = 0; while (!SCpnt->SCp.Status) + { + cpu_relax(); barrier(); + } return SCpnt->result; } diff --git a/drivers/scsi/aic7xxx/aic7xxx_linux.c b/drivers/scsi/aic7xxx/aic7xxx_linux.c index 21e35f436d75..0b7dc4a3e2fc 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_linux.c +++ b/drivers/scsi/aic7xxx/aic7xxx_linux.c @@ -398,26 +398,26 @@ MODULE_DESCRIPTION("Adaptec Aic77XX/78XX SCSI Host Bus Adapter driver"); MODULE_LICENSE("Dual BSD/GPL"); #endif MODULE_PARM(aic7xxx, "s"); -MODULE_PARM_DESC(aic7xxx, "period delimited, options string. - verbose Enable verbose/diagnostic logging - no_probe Disable EISA/VLB controller probing - no_reset Supress initial bus resets - extended Enable extended geometry on all controllers - periodic_otag Send an ordered tagged transaction periodically - to prevent tag starvation. This may be - required by some older disk drives/RAID arrays. - reverse_scan Sort PCI devices highest Bus/Slot to lowest - tag_info:<tag_str> Set per-target tag depth - seltime:<int> Selection Timeout(0/256ms,1/128ms,2/64ms,3/32ms) - - Sample /etc/modules.conf line: - Enable verbose logging - Disable EISA/VLB probing - Set tag depth on Controller 2/Target 2 to 10 tags - Shorten the selection timeout to 128ms from its default of 256 - - options aic7xxx='\"verbose.no_probe.tag_info:{{}.{}.{..10}}.seltime:1\"' -"); +MODULE_PARM_DESC(aic7xxx, "period delimited, options string.\n" \ +" verbose Enable verbose/diagnostic logging\n" \ +" no_probe Disable EISA/VLB controller probing\n" \ +" no_reset Supress initial bus resets\n" \ +" extended Enable extended geometry on all controllers\n" \ +" periodic_otag Send an ordered tagged transaction periodically\n" \ +" to prevent tag starvation. This may be\n" \ +" required by some older disk drives/RAID arrays. \n" \ +" reverse_scan Sort PCI devices highest Bus/Slot to lowest\n" \ +" tag_info:<tag_str> Set per-target tag depth\n" \ +" seltime:<int> Selection Timeout(0/256ms,1/128ms,2/64ms,3/32ms)\n" \ +"\n" \ +" Sample /etc/modules.conf line:\n" \ +" Enable verbose logging\n" \ +" Disable EISA/VLB probing\n" \ +" Set tag depth on Controller 2/Target 2 to 10 tags\n" \ +" Shorten the selection timeout to 128ms from its default of 256\n" \ +" \n" \ +" options aic7xxx='\"verbose.no_probe.tag_info:{{}.{}.{..10}}.seltime:1\"'\n" +); #endif static void ahc_linux_handle_scsi_status(struct ahc_softc *, diff --git a/drivers/scsi/atp870u.h b/drivers/scsi/atp870u.h index af2bbdbd1e54..e5b0440f5f6d 100644 --- a/drivers/scsi/atp870u.h +++ b/drivers/scsi/atp870u.h @@ -37,18 +37,13 @@ extern const char *atp870u_info(struct Scsi_Host *); extern int atp870u_proc_info(char *, char **, off_t, int, int, int); #define ATP870U { \ - next: NULL, \ - module: NULL, \ proc_info: atp870u_proc_info, \ - name: NULL, \ detect: atp870u_detect, \ release: atp870u_release, \ info: atp870u_info, \ command: atp870u_command, \ queuecommand: atp870u_queuecommand, \ - eh_strategy_handler: NULL, \ eh_abort_handler: atp870u_abort, \ - slave_attach: NULL, \ bios_param: atp870u_biosparam, \ can_queue: qcnt, /* max simultaneous cmds */\ this_id: 7, /* scsi id of host adapter */\ diff --git a/drivers/scsi/dmx3191d.c b/drivers/scsi/dmx3191d.c index ddd53bc8b4cb..8ba4784ec6fb 100644 --- a/drivers/scsi/dmx3191d.c +++ b/drivers/scsi/dmx3191d.c @@ -31,6 +31,7 @@ #include <linux/signal.h> #include <linux/stat.h> #include <linux/version.h> +#include <linux/delay.h> #include "scsi.h" #include "hosts.h" @@ -52,7 +53,7 @@ #include "NCR5380.c" -int __init dmx3191d_detect(Scsi_Host_Template *tmpl) { +static int __init dmx3191d_detect(Scsi_Host_Template *tmpl) { int boards = 0; struct Scsi_Host *instance = NULL; struct pci_dev *pdev = NULL; @@ -90,7 +91,7 @@ int __init dmx3191d_detect(Scsi_Host_Template *tmpl) { instance->irq = pdev->irq; NCR5380_init(instance, FLAG_NO_PSEUDO_DMA | FLAG_DTC3181E); - if (request_irq(pdev->irq, dmx3191d_do_intr, SA_SHIRQ, + if (request_irq(pdev->irq, dmx3191d_intr, SA_SHIRQ, DMX3191D_DRIVER_NAME, instance)) { printk(KERN_WARNING "dmx3191: IRQ %d not available - switching to polled mode.\n", pdev->irq); /* Steam powered scsi controllers run without an IRQ @@ -103,13 +104,13 @@ int __init dmx3191d_detect(Scsi_Host_Template *tmpl) { return boards; } -const char * dmx3191d_info(struct Scsi_Host *host) { +static const char * dmx3191d_info(struct Scsi_Host *host) { static const char *info ="Domex DMX3191D"; return info; } -int dmx3191d_release_resources(struct Scsi_Host *instance) +static int dmx3191d_release_resources(struct Scsi_Host *instance) { release_region(instance->io_port, DMX3191D_REGION); if(instance->irq!=IRQ_NONE) diff --git a/drivers/scsi/dmx3191d.h b/drivers/scsi/dmx3191d.h index 7c72016b4834..33bae953b1ed 100644 --- a/drivers/scsi/dmx3191d.h +++ b/drivers/scsi/dmx3191d.h @@ -20,16 +20,15 @@ #define PCI_DEVICE_ID_DOMEX_DMX3191D 0x0001 #endif -#ifndef ASM -int dmx3191d_abort(Scsi_Cmnd *); -int dmx3191d_detect(Scsi_Host_Template *); -const char* dmx3191d_info(struct Scsi_Host *); -int dmx3191d_proc_info(char *, char **, off_t, int, int, int); -int dmx3191d_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -int dmx3191d_release_resources(struct Scsi_Host *); -int dmx3191d_bus_reset(Scsi_Cmnd *); -int dmx3191d_host_reset(Scsi_Cmnd *); -int dmx3191d_device_reset(Scsi_Cmnd *); +static int dmx3191d_abort(Scsi_Cmnd *); +static int dmx3191d_detect(Scsi_Host_Template *); +static const char* dmx3191d_info(struct Scsi_Host *); +static int dmx3191d_proc_info(char *, char **, off_t, int, int, int); +static int dmx3191d_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); +static int dmx3191d_release_resources(struct Scsi_Host *); +static int dmx3191d_bus_reset(Scsi_Cmnd *); +static int dmx3191d_host_reset(Scsi_Cmnd *); +static int dmx3191d_device_reset(Scsi_Cmnd *); #define DMX3191D { \ @@ -64,9 +63,9 @@ int dmx3191d_device_reset(Scsi_Cmnd *); #define NCR5380_intr dmx3191d_intr #define NCR5380_proc_info dmx3191d_proc_info #define NCR5380_queue_command dmx3191d_queue_command -#define NCR5380_reset dmx3191d_reset - -#endif /* ASM */ +#define NCR5380_host_reset dmx3191d_host_reset +#define NCR5380_bus_reset dmx3191d_bus_reset +#define NCR5380_device_reset dmx3191d_device_reset #endif /* __DMX3191D_H */ diff --git a/drivers/scsi/dtc.c b/drivers/scsi/dtc.c index 2fa2cd414363..980787b95baf 100644 --- a/drivers/scsi/dtc.c +++ b/drivers/scsi/dtc.c @@ -2,7 +2,7 @@ #define AUTOSENSE #define PSEUDO_DMA #define DONT_USE_INTR -#define UNSAFE /* Leave interrupts enabled during pseudo-dma I/O */ +#define UNSAFE /* Leave interrupts enabled during pseudo-dma I/O */ #define xNDEBUG (NDEBUG_INTR+NDEBUG_RESELECTION+\ NDEBUG_SELECTION+NDEBUG_ARBITRATION) #define DMA_WORKS_RIGHT @@ -77,6 +77,7 @@ #include <linux/signal.h> #include <linux/sched.h> #include <linux/blk.h> +#include <linux/delay.h> #include <asm/io.h> #include "scsi.h" #include "hosts.h" @@ -101,65 +102,77 @@ */ /* - */ + */ /* Offset from DTC_5380_OFFSET */ #define DTC_CONTROL_REG 0x100 /* rw */ #define D_CR_ACCESS 0x80 /* ro set=can access 3280 registers */ #define CSR_DIR_READ 0x40 /* rw direction, 1 = read 0 = write */ -#define CSR_RESET 0x80 /* wo Resets 53c400 */ -#define CSR_5380_REG 0x80 /* ro 5380 registers can be accessed */ -#define CSR_TRANS_DIR 0x40 /* rw Data transfer direction */ -#define CSR_SCSI_BUFF_INTR 0x20 /* rw Enable int on transfer ready */ -#define CSR_5380_INTR 0x10 /* rw Enable 5380 interrupts */ -#define CSR_SHARED_INTR 0x08 /* rw Interrupt sharing */ -#define CSR_HOST_BUF_NOT_RDY 0x04 /* ro Host buffer not ready */ -#define CSR_SCSI_BUF_RDY 0x02 /* ro SCSI buffer ready */ -#define CSR_GATED_5380_IRQ 0x01 /* ro Last block xferred */ +#define CSR_RESET 0x80 /* wo Resets 53c400 */ +#define CSR_5380_REG 0x80 /* ro 5380 registers can be accessed */ +#define CSR_TRANS_DIR 0x40 /* rw Data transfer direction */ +#define CSR_SCSI_BUFF_INTR 0x20 /* rw Enable int on transfer ready */ +#define CSR_5380_INTR 0x10 /* rw Enable 5380 interrupts */ +#define CSR_SHARED_INTR 0x08 /* rw Interrupt sharing */ +#define CSR_HOST_BUF_NOT_RDY 0x04 /* ro Host buffer not ready */ +#define CSR_SCSI_BUF_RDY 0x02 /* ro SCSI buffer ready */ +#define CSR_GATED_5380_IRQ 0x01 /* ro Last block xferred */ #define CSR_INT_BASE (CSR_SCSI_BUFF_INTR | CSR_5380_INTR) -#define DTC_BLK_CNT 0x101 /* rw +#define DTC_BLK_CNT 0x101 /* rw * # of 128-byte blocks to transfer */ -#define D_CR_ACCESS 0x80 /* ro set=can access 3280 registers */ +#define D_CR_ACCESS 0x80 /* ro set=can access 3280 registers */ #define DTC_SWITCH_REG 0x3982 /* ro - DIP switches */ #define DTC_RESUME_XFER 0x3982 /* wo - resume data xfer - * after disconnect/reconnect*/ + * after disconnect/reconnect*/ #define DTC_5380_OFFSET 0x3880 /* 8 registers here, see NCR5380.h */ /*!!!! for dtc, it's a 128 byte buffer at 3900 !!! */ -#define DTC_DATA_BUF 0x3900 /* rw 128 bytes long */ +#define DTC_DATA_BUF 0x3900 /* rw 128 bytes long */ static struct override { - unsigned int address; - int irq; + unsigned int address; + int irq; } overrides #ifdef OVERRIDE [] __initdata = OVERRIDE; #else -[4] __initdata = {{0, IRQ_AUTO}, {0, IRQ_AUTO}, {0, IRQ_AUTO}, {0, IRQ_AUTO}}; +[4] __initdata = { { +0, IRQ_AUTO}, { +0, IRQ_AUTO}, { +0, IRQ_AUTO}, { +0, IRQ_AUTO}}; #endif #define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override)) static struct base { - unsigned long address; - int noauto; -} bases[] __initdata = {{0xcc000, 0}, {0xc8000, 0}, {0xdc000, 0}, {0xd8000, 0}}; + unsigned long address; + int noauto; +} bases[] __initdata = { + { 0xcc000, 0 }, + { 0xc8000, 0 }, + { 0xdc000, 0 }, + { 0xd8000, 0 } +}; #define NO_BASES (sizeof (bases) / sizeof (struct base)) static const struct signature { - const char *string; - int offset; -} signatures[] = { {"DATA TECHNOLOGY CORPORATION BIOS", 0x25}, }; + const char *string; + int offset; +} signatures[] = { + {"DATA TECHNOLOGY CORPORATION BIOS", 0x25}, +}; #define NO_SIGNATURES (sizeof (signatures) / sizeof (struct signature)) +#ifndef MODULE /* * Function : dtc_setup(char *str, int *ints) * @@ -170,23 +183,24 @@ static const struct signature { * */ -void __init dtc_setup(char *str, int *ints){ - static int commandline_current = 0; - int i; - if (ints[0] != 2) - printk("dtc_setup: usage dtc=address,irq\n"); - else - if (commandline_current < NO_OVERRIDES) { - overrides[commandline_current].address = ints[1]; - overrides[commandline_current].irq = ints[2]; - for (i = 0; i < NO_BASES; ++i) - if (bases[i].address == ints[1]) { - bases[i].noauto = 1; - break; - } - ++commandline_current; - } +static void __init dtc_setup(char *str, int *ints) +{ + static int commandline_current = 0; + int i; + if (ints[0] != 2) + printk("dtc_setup: usage dtc=address,irq\n"); + else if (commandline_current < NO_OVERRIDES) { + overrides[commandline_current].address = ints[1]; + overrides[commandline_current].irq = ints[2]; + for (i = 0; i < NO_BASES; ++i) + if (bases[i].address == ints[1]) { + bases[i].noauto = 1; + break; + } + ++commandline_current; + } } +#endif /* * Function : int dtc_detect(Scsi_Host_Template * tpnt) @@ -201,97 +215,92 @@ void __init dtc_setup(char *str, int *ints){ * */ -int __init dtc_detect(Scsi_Host_Template * tpnt){ - static int current_override = 0, current_base = 0; - struct Scsi_Host *instance; - unsigned int base; - int sig, count; +static int __init dtc_detect(Scsi_Host_Template * tpnt) +{ + static int current_override = 0, current_base = 0; + struct Scsi_Host *instance; + unsigned int base; + int sig, count; - tpnt->proc_name = "dtc3x80"; - tpnt->proc_info = &dtc_proc_info; + tpnt->proc_name = "dtc3x80"; + tpnt->proc_info = &dtc_proc_info; - for (count = 0; current_override < NO_OVERRIDES; ++current_override) { - base = 0; + for (count = 0; current_override < NO_OVERRIDES; ++current_override) { + base = 0; - if (overrides[current_override].address) - base = overrides[current_override].address; - else - for (; !base && (current_base < NO_BASES); ++current_base) { + if (overrides[current_override].address) + base = overrides[current_override].address; + else + for (; !base && (current_base < NO_BASES); ++current_base) { #if (DTCDEBUG & DTCDEBUG_INIT) - printk("scsi-dtc : probing address %08x\n", bases[current_base].address); + printk("scsi-dtc : probing address %08x\n", bases[current_base].address); #endif - for (sig = 0; sig < NO_SIGNATURES; ++sig) - if (!bases[current_base].noauto && - isa_check_signature(bases[current_base].address + - signatures[sig].offset, - signatures[sig].string, strlen(signatures[sig].string))) { - base = bases[current_base].address; + for (sig = 0; sig < NO_SIGNATURES; ++sig) + if (!bases[current_base].noauto && isa_check_signature(bases[current_base].address + signatures[sig].offset, signatures[sig].string, strlen(signatures[sig].string))) { + base = bases[current_base].address; #if (DTCDEBUG & DTCDEBUG_INIT) - printk("scsi-dtc : detected board.\n"); + printk("scsi-dtc : detected board.\n"); #endif - break; - } - } + break; + } + } #if defined(DTCDEBUG) && (DTCDEBUG & DTCDEBUG_INIT) - printk("scsi-dtc : base = %08x\n", base); + printk("scsi-dtc : base = %08x\n", base); #endif - if (!base) - break; + if (!base) + break; - instance = scsi_register (tpnt, sizeof(struct NCR5380_hostdata)); - if(instance == NULL) - break; - - instance->base = base; + instance = scsi_register(tpnt, sizeof(struct NCR5380_hostdata)); + if (instance == NULL) + break; - NCR5380_init(instance, 0); + instance->base = base; - NCR5380_write(DTC_CONTROL_REG, CSR_5380_INTR); /* Enable int's */ - if (overrides[current_override].irq != IRQ_AUTO) - instance->irq = overrides[current_override].irq; - else - instance->irq = NCR5380_probe_irq(instance, DTC_IRQS); + NCR5380_init(instance, 0); + + NCR5380_write(DTC_CONTROL_REG, CSR_5380_INTR); /* Enable int's */ + if (overrides[current_override].irq != IRQ_AUTO) + instance->irq = overrides[current_override].irq; + else + instance->irq = NCR5380_probe_irq(instance, DTC_IRQS); #ifndef DONT_USE_INTR -/* With interrupts enabled, it will sometimes hang when doing heavy - * reads. So better not enable them until I finger it out. */ - if (instance->irq != IRQ_NONE) - if (request_irq(instance->irq, do_dtc_intr, SA_INTERRUPT, "dtc", instance)) { - printk("scsi%d : IRQ%d not free, interrupts disabled\n", - instance->host_no, instance->irq); - instance->irq = IRQ_NONE; - } - - if (instance->irq == IRQ_NONE) { - printk("scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no); - printk("scsi%d : please jumper the board for a free IRQ.\n", instance->host_no); - } + /* With interrupts enabled, it will sometimes hang when doing heavy + * reads. So better not enable them until I finger it out. */ + if (instance->irq != IRQ_NONE) + if (request_irq(instance->irq, dtc_intr, SA_INTERRUPT, "dtc", instance)) { + printk(KERN_ERR "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); + instance->irq = IRQ_NONE; + } + + if (instance->irq == IRQ_NONE) { + printk(KERN_WARNING "scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no); + printk(KERN_WARNING "scsi%d : please jumper the board for a free IRQ.\n", instance->host_no); + } #else - if (instance->irq != IRQ_NONE) - printk("scsi%d : interrupts not used. Might as well not jumper it.\n", - instance->host_no); - instance->irq = IRQ_NONE; + if (instance->irq != IRQ_NONE) + printk(KERN_WARNING "scsi%d : interrupts not used. Might as well not jumper it.\n", instance->host_no); + instance->irq = IRQ_NONE; #endif #if defined(DTCDEBUG) && (DTCDEBUG & DTCDEBUG_INIT) - printk("scsi%d : irq = %d\n", instance->host_no, instance->irq); + printk("scsi%d : irq = %d\n", instance->host_no, instance->irq); #endif - printk("scsi%d : at 0x%05X", instance->host_no, (int)instance->base); - if (instance->irq == IRQ_NONE) - printk (" interrupts disabled"); - else - printk (" irq %d", instance->irq); - printk(" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d", - CAN_QUEUE, CMD_PER_LUN, DTC_PUBLIC_RELEASE); - NCR5380_print_options(instance); - printk("\n"); - - ++current_override; - ++count; - } - return count; + printk(KERN_INFO "scsi%d : at 0x%05X", instance->host_no, (int) instance->base); + if (instance->irq == IRQ_NONE) + printk(" interrupts disabled"); + else + printk(" irq %d", instance->irq); + printk(" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d", CAN_QUEUE, CMD_PER_LUN, DTC_PUBLIC_RELEASE); + NCR5380_print_options(instance); + printk("\n"); + + ++current_override; + ++count; + } + return count; } /* @@ -314,14 +323,14 @@ int __init dtc_detect(Scsi_Host_Template * tpnt){ * and matching the H_C_S coordinates to what DOS uses. */ -int dtc_biosparam(Disk * disk, struct block_device *dev, int * ip) +static int dtc_biosparam(Disk * disk, struct block_device *dev, int *ip) { - int size = disk->capacity; + int size = disk->capacity; - ip[0] = 64; - ip[1] = 32; - ip[2] = size >> 11; - return 0; + ip[0] = 64; + ip[1] = 32; + ip[2] = size >> 11; + return 0; } @@ -341,43 +350,43 @@ int dtc_biosparam(Disk * disk, struct block_device *dev, int * ip) static int dtc_maxi = 0; static int dtc_wmaxi = 0; -static inline int NCR5380_pread (struct Scsi_Host *instance, - unsigned char *dst, int len) - { - unsigned char *d = dst; - int i; /* For counting time spent in the poll-loop */ - NCR5380_local_declare(); - NCR5380_setup(instance); - - i = 0; - NCR5380_read(RESET_PARITY_INTERRUPT_REG); - NCR5380_write(MODE_REG, MR_ENABLE_EOP_INTR | MR_DMA_MODE); - if (instance->irq == IRQ_NONE) - NCR5380_write(DTC_CONTROL_REG, CSR_DIR_READ); - else - NCR5380_write(DTC_CONTROL_REG, CSR_DIR_READ | CSR_INT_BASE); - NCR5380_write(DTC_BLK_CNT, len >> 7); /* Block count */ - rtrc(1); - while (len > 0) { - rtrc(2); - while (NCR5380_read(DTC_CONTROL_REG) & CSR_HOST_BUF_NOT_RDY) - ++i; - rtrc(3); - isa_memcpy_fromio(d, base + DTC_DATA_BUF, 128); - d += 128; - len -= 128; - rtrc(7); /*** with int's on, it sometimes hangs after here. +static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, int len) +{ + unsigned char *d = dst; + int i; /* For counting time spent in the poll-loop */ + NCR5380_local_declare(); + NCR5380_setup(instance); + + i = 0; + NCR5380_read(RESET_PARITY_INTERRUPT_REG); + NCR5380_write(MODE_REG, MR_ENABLE_EOP_INTR | MR_DMA_MODE); + if (instance->irq == IRQ_NONE) + NCR5380_write(DTC_CONTROL_REG, CSR_DIR_READ); + else + NCR5380_write(DTC_CONTROL_REG, CSR_DIR_READ | CSR_INT_BASE); + NCR5380_write(DTC_BLK_CNT, len >> 7); /* Block count */ + rtrc(1); + while (len > 0) { + rtrc(2); + while (NCR5380_read(DTC_CONTROL_REG) & CSR_HOST_BUF_NOT_RDY) + ++i; + rtrc(3); + isa_memcpy_fromio(d, base + DTC_DATA_BUF, 128); + d += 128; + len -= 128; + rtrc(7); + /*** with int's on, it sometimes hangs after here. * Looks like something makes HBNR go away. */ - } - rtrc(4); - while ( !(NCR5380_read(DTC_CONTROL_REG) & D_CR_ACCESS)) - ++i; - NCR5380_write(MODE_REG, 0); /* Clear the operating mode */ - rtrc(0); - NCR5380_read(RESET_PARITY_INTERRUPT_REG); - if (i > dtc_maxi) - dtc_maxi = i; - return(0); + } + rtrc(4); + while (!(NCR5380_read(DTC_CONTROL_REG) & D_CR_ACCESS)) + ++i; + NCR5380_write(MODE_REG, 0); /* Clear the operating mode */ + rtrc(0); + NCR5380_read(RESET_PARITY_INTERRUPT_REG); + if (i > dtc_maxi) + dtc_maxi = i; + return (0); } /**************************************************************** @@ -393,44 +402,44 @@ static inline int NCR5380_pread (struct Scsi_Host *instance, * timeout. */ -static inline int NCR5380_pwrite (struct Scsi_Host *instance, - unsigned char *src, int len) { - int i; - NCR5380_local_declare(); - NCR5380_setup(instance); - - NCR5380_read(RESET_PARITY_INTERRUPT_REG); - NCR5380_write(MODE_REG, MR_ENABLE_EOP_INTR | MR_DMA_MODE); - /* set direction (write) */ - if (instance->irq == IRQ_NONE) - NCR5380_write(DTC_CONTROL_REG, 0); - else - NCR5380_write(DTC_CONTROL_REG, CSR_5380_INTR); - NCR5380_write(DTC_BLK_CNT, len >> 7); /* Block count */ - for (i = 0; len > 0; ++i) { - rtrc(5); - /* Poll until the host buffer can accept data. */ - while (NCR5380_read(DTC_CONTROL_REG) & CSR_HOST_BUF_NOT_RDY) - ++i; - rtrc(3); - isa_memcpy_toio(base + DTC_DATA_BUF, src, 128); - src += 128; - len -= 128; - } - rtrc(4); - while ( !(NCR5380_read(DTC_CONTROL_REG) & D_CR_ACCESS)) - ++i; - rtrc(6); - /* Wait until the last byte has been sent to the disk */ - while (!(NCR5380_read(TARGET_COMMAND_REG) & TCR_LAST_BYTE_SENT)) - ++i; - rtrc(7); - /* Check for parity error here. fixme. */ - NCR5380_write(MODE_REG, 0); /* Clear the operating mode */ - rtrc(0); - if (i > dtc_wmaxi) - dtc_wmaxi = i; - return (0); +static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src, int len) +{ + int i; + NCR5380_local_declare(); + NCR5380_setup(instance); + + NCR5380_read(RESET_PARITY_INTERRUPT_REG); + NCR5380_write(MODE_REG, MR_ENABLE_EOP_INTR | MR_DMA_MODE); + /* set direction (write) */ + if (instance->irq == IRQ_NONE) + NCR5380_write(DTC_CONTROL_REG, 0); + else + NCR5380_write(DTC_CONTROL_REG, CSR_5380_INTR); + NCR5380_write(DTC_BLK_CNT, len >> 7); /* Block count */ + for (i = 0; len > 0; ++i) { + rtrc(5); + /* Poll until the host buffer can accept data. */ + while (NCR5380_read(DTC_CONTROL_REG) & CSR_HOST_BUF_NOT_RDY) + ++i; + rtrc(3); + isa_memcpy_toio(base + DTC_DATA_BUF, src, 128); + src += 128; + len -= 128; + } + rtrc(4); + while (!(NCR5380_read(DTC_CONTROL_REG) & D_CR_ACCESS)) + ++i; + rtrc(6); + /* Wait until the last byte has been sent to the disk */ + while (!(NCR5380_read(TARGET_COMMAND_REG) & TCR_LAST_BYTE_SENT)) + ++i; + rtrc(7); + /* Check for parity error here. fixme. */ + NCR5380_write(MODE_REG, 0); /* Clear the operating mode */ + rtrc(0); + if (i > dtc_wmaxi) + dtc_wmaxi = i; + return (0); } MODULE_LICENSE("GPL"); diff --git a/drivers/scsi/dtc.h b/drivers/scsi/dtc.h index f5ce0c95df3e..c080f4d55f51 100644 --- a/drivers/scsi/dtc.h +++ b/drivers/scsi/dtc.h @@ -28,19 +28,16 @@ #ifndef DTC3280_H #define DTC3280_H -#ifndef ASM -int dtc_abort(Scsi_Cmnd *); -int dtc_biosparam(Disk *, struct block_device *, int*); -int dtc_detect(Scsi_Host_Template *); -int dtc_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -int dtc_reset(Scsi_Cmnd *, unsigned int reset_flags); -int dtc_proc_info (char *buffer, char **start, off_t offset, +static int dtc_abort(Scsi_Cmnd *); +static int dtc_biosparam(Disk *, struct block_device *, int*); +static int dtc_detect(Scsi_Host_Template *); +static int dtc_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); +static int dtc_bus_reset(Scsi_Cmnd *); +static int dtc_device_reset(Scsi_Cmnd *); +static int dtc_host_reset(Scsi_Cmnd *); +static int dtc_proc_info (char *buffer, char **start, off_t offset, int length, int hostno, int inout); -#ifndef NULL -#define NULL 0 -#endif - #ifndef CMD_PER_LUN #define CMD_PER_LUN 2 #endif @@ -55,24 +52,26 @@ int dtc_proc_info (char *buffer, char **start, off_t offset, * macros when this is being used solely for the host stub. */ -#define DTC3x80 { \ - name: "DTC 3180/3280 ", \ - detect: dtc_detect, \ - queuecommand: dtc_queue_command, \ - abort: dtc_abort, \ - reset: dtc_reset, \ - bios_param: dtc_biosparam, \ - can_queue: CAN_QUEUE, \ - this_id: 7, \ - sg_tablesize: SG_ALL, \ - cmd_per_lun: CMD_PER_LUN , \ +#define DTC3x80 { \ + name: "DTC 3180/3280 ", \ + detect: dtc_detect, \ + queuecommand: dtc_queue_command, \ + eh_abort_handler: dtc_abort, \ + eh_bus_reset_handler: dtc_bus_reset, \ + eh_device_reset_handler: dtc_device_reset, \ + eh_host_reset_handler: dtc_host_reset, \ + bios_param: dtc_biosparam, \ + can_queue: CAN_QUEUE, \ + this_id: 7, \ + sg_tablesize: SG_ALL, \ + cmd_per_lun: CMD_PER_LUN , \ use_clustering: DISABLE_CLUSTERING} #define NCR5380_implementation_fields \ - volatile unsigned int base + unsigned int base #define NCR5380_local_declare() \ - volatile unsigned int base + unsigned int base #define NCR5380_setup(instance) \ base = (unsigned int)(instance)->base @@ -105,12 +104,13 @@ int dtc_proc_info (char *buffer, char **start, off_t offset, isa_writeb(value, DTC_address(reg));} while(0) #endif -#define NCR5380_intr dtc_intr -#define do_NCR5380_intr do_dtc_intr -#define NCR5380_queue_command dtc_queue_command -#define NCR5380_abort dtc_abort -#define NCR5380_reset dtc_reset -#define NCR5380_proc_info dtc_proc_info +#define NCR5380_intr dtc_intr +#define NCR5380_queue_command dtc_queue_command +#define NCR5380_abort dtc_abort +#define NCR5380_bus_reset dtc_bus_reset +#define NCR5380_device_reset dtc_device_reset +#define NCR5380_host_reset dtc_host_reset +#define NCR5380_proc_info dtc_proc_info /* 15 12 11 10 1001 1100 0000 0000 */ @@ -118,5 +118,4 @@ int dtc_proc_info (char *buffer, char **start, off_t offset, #define DTC_IRQS 0x9c00 -#endif /* ndef ASM */ #endif /* DTC3280_H */ diff --git a/drivers/scsi/eata.c b/drivers/scsi/eata.c index 41835b5571a2..c667b925dfd2 100644 --- a/drivers/scsi/eata.c +++ b/drivers/scsi/eata.c @@ -1,6 +1,31 @@ /* * eata.c - Low-level driver for EATA/DMA SCSI host adapters. * + * 10 Oct 2002 Rev. 7.70 for linux 2.5.42 + * + Foreport from revision 6.70. + * + * 25 Jun 2002 Rev. 6.70 for linux 2.4.19 + * + This release is the first one tested on a Big Endian platform: + * fixed endian-ness problem due to bitfields; + * fixed endian-ness problem in read_pio. + * + Added new options for selectively probing ISA, EISA and PCI bus: + * + * Boot option Parameter name Default according to + * + * ip:[y|n] isa_probe=[1|0] CONFIG_ISA defined + * ep:[y|n] eisa_probe=[1|0] CONFIG_EISA defined + * pp:[y|n] pci_probe=[1|0] CONFIG_PCI defined + * + * The default action is to perform probing if the corrisponding + * bus is configured and to skip probing otherwise. + * + * + If pci_probe is in effect and a list of I/O ports is specified + * as parameter or boot option, pci_enable_device() is performed + * on all pci devices matching PCI_CLASS_STORAGE_SCSI. + * + * 21 Feb 2002 Rev. 6.52 for linux 2.4.18 + * + Backport from rev. 7.22 (use io_request_lock). + * * 20 Feb 2002 Rev. 7.22 for linux 2.5.5 * + Remove any reference to virt_to_bus(). * + Fix pio hang while detecting multiple HBAs. @@ -428,6 +453,9 @@ MODULE_PARM(max_queue_depth, "i"); MODULE_PARM(tag_mode, "i"); MODULE_PARM(ext_tran, "i"); MODULE_PARM(rev_scan, "i"); +MODULE_PARM(isa_probe, "i"); +MODULE_PARM(eisa_probe, "i"); +MODULE_PARM(pci_probe, "i"); MODULE_AUTHOR("Dario Ballabio"); #endif @@ -455,6 +483,10 @@ MODULE_AUTHOR("Dario Ballabio"); #include <linux/ctype.h> #include <linux/spinlock.h> +#if !defined(__BIG_ENDIAN_BITFIELD) && !defined(__LITTLE_ENDIAN_BITFIELD) +#error "Adjust your <asm/byteorder.h> defines" +#endif + /* Subversion values */ #define ISA 0 #define ESA 1 @@ -512,7 +544,7 @@ MODULE_AUTHOR("Dario Ballabio"); #define REG_LM 3 #define REG_MID 4 #define REG_MSB 5 -#define REGION_SIZE 9 +#define REGION_SIZE 9UL #define MAX_ISA_ADDR 0x03ff #define MIN_EISA_ADDR 0x1c88 #define MAX_EISA_ADDR 0xfc88 @@ -536,7 +568,7 @@ MODULE_AUTHOR("Dario Ballabio"); #define TLDEV(type) ((type) == TYPE_DISK || (type) == TYPE_ROM) /* "EATA", in Big Endian format */ -#define EATA_SIGNATURE 0x41544145 +#define EATA_SIG_BE 0x45415441 /* Number of valid bytes in the board config structure for EATA 2.0x */ #define EATA_2_0A_SIZE 28 @@ -547,6 +579,12 @@ MODULE_AUTHOR("Dario Ballabio"); struct eata_info { u_int32_t data_len; /* Number of valid bytes after this field */ u_int32_t sign; /* ASCII "EATA" signature */ + +#if defined(__BIG_ENDIAN_BITFIELD) + unchar version:4, :4; + unchar haaval:1, ata:1, drqvld:1, dmasup:1, morsup:1, trnxfr:1, tarsup:1, + ocsena:1; +#else unchar :4, /* unused low nibble */ version:4; /* EATA version, should be 0x1 */ unchar ocsena:1, /* Overlap Command Support Enabled */ @@ -557,6 +595,8 @@ struct eata_info { drqvld:1, /* DRQ Index (DRQX) is valid */ ata:1, /* This is an ATA device */ haaval:1; /* Host Adapter Address Valid */ +#endif + ushort cp_pad_len; /* Number of pad bytes after cp_len */ unchar host_addr[4]; /* Host Adapter SCSI ID for channels 3, 2, 1, 0 */ u_int32_t cp_len; /* Number of valid bytes in cp */ @@ -564,6 +604,15 @@ struct eata_info { ushort queue_size; /* Max number of cp that can be queued */ ushort unused; ushort scatt_size; /* Max number of entries in scatter/gather table */ + +#if defined(__BIG_ENDIAN_BITFIELD) + unchar drqx:2, second:1, irq_tr:1, irq:4; + unchar sync; + unchar :4, res1:1, large_sg:1, forcaddr:1, isaena:1; + unchar max_chan:3, max_id:5; + unchar max_lun; + unchar eisa:1, pci:1, idquest:1, m1:1, :4; +#else unchar irq:4, /* Interrupt Request assigned to this controller */ irq_tr:1, /* 0 for edge triggered, 1 for level triggered */ second:1, /* 1 if this is a secondary (not primary) controller */ @@ -586,6 +635,8 @@ struct eata_info { idquest:1, /* RAIDNUM returned is questionable */ pci:1, /* This board is PCI */ eisa:1; /* This board is EISA */ +#endif + unchar raidnum; /* Uniquely identifies this HBA in a system */ unchar notused; @@ -595,18 +646,30 @@ struct eata_info { /* Board config structure */ struct eata_config { ushort len; /* Number of bytes following this field */ + +#if defined(__BIG_ENDIAN_BITFIELD) + unchar :4, tarena:1, mdpena:1, ocena:1, edis:1; +#else unchar edis:1, /* Disable EATA interface after config command */ ocena:1, /* Overlapped Commands Enabled */ mdpena:1, /* Transfer all Modified Data Pointer Messages */ tarena:1, /* Target Mode Enabled for this controller */ :4; +#endif + unchar cpad[511]; }; /* Returned status packet structure */ struct mssp { + +#if defined(__BIG_ENDIAN_BITFIELD) + unchar eoc:1, adapter_status:7; +#else unchar adapter_status:7, /* State related to current command */ eoc:1; /* End Of Command (1 = command completed) */ +#endif + unchar target_status; /* SCSI status received after data transfer */ unchar unused[2]; u_int32_t inv_res_len; /* Number of bytes not transferred */ @@ -621,6 +684,16 @@ struct sg_list { /* MailBox SCSI Command Packet */ struct mscp { + +#if defined(__BIG_ENDIAN_BITFIELD) + unchar din:1, dout:1, interp:1, :1, sg:1, reqsen:1, init:1, sreset:1; + unchar sense_len; + unchar unused[3]; + unchar :7, fwnest:1; + unchar :5, hbaci:1, iat:1, phsunit:1; + unchar channel:3, target:5; + unchar one:1, dispri:1, luntar:1, lun:5; +#else unchar sreset:1, /* SCSI Bus Reset Signal should be asserted */ init:1, /* Re-initialize controller and self test */ reqsen:1, /* Transfer Request Sense Data to addr using DMA */ @@ -643,6 +716,8 @@ struct mscp { luntar:1, /* This cp is for Target (not LUN) */ dispri:1, /* Disconnect Privilege granted */ one:1; /* 1 */ +#endif + unchar mess[3]; /* Massage to/from Target */ unchar cdb[12]; /* Command Descriptor Block */ u_int32_t data_len; /* If sg=0 Data Length, if sg=1 sglist length */ @@ -719,8 +794,13 @@ static unsigned long io_port[] = { #define BN(board) (HD(board)->board_name) /* Device is Big Endian */ -#define H2DEV(x) cpu_to_be32(x) -#define DEV2H(x) be32_to_cpu(x) +#define H2DEV(x) cpu_to_be32(x) +#define DEV2H(x) be32_to_cpu(x) +#define H2DEV16(x) cpu_to_be16(x) +#define DEV2H16(x) be16_to_cpu(x) + +/* But transfer orientation from the 16 bit data register is Little Endian */ +#define REG2H(x) le16_to_cpu(x) static void do_interrupt_handler(int, void *, struct pt_regs *); static void flush_dev(Scsi_Device *, unsigned long, unsigned int, unsigned int); @@ -750,6 +830,24 @@ static int max_queue_depth = CONFIG_SCSI_EATA_MAX_TAGS; static int max_queue_depth = MAX_CMD_PER_LUN; #endif +#if defined(CONFIG_ISA) +static int isa_probe = TRUE; +#else +static int isa_probe = FALSE; +#endif + +#if defined(CONFIG_EISA) +static int eisa_probe = TRUE; +#else +static int eisa_probe = FALSE; +#endif + +#if defined(CONFIG_PCI) +static int pci_probe = TRUE; +#else +static int pci_probe = FALSE; +#endif + static int eata2x_slave_attach(Scsi_Device *dev) { int j, tqd, utqd; char *link_suffix = ""; @@ -791,14 +889,18 @@ static inline int wait_on_busy(unsigned long iobase, unsigned int loop) { } static inline int do_dma(unsigned long iobase, unsigned long addr, unchar cmd) { + unsigned char *byaddr; + unsigned long devaddr; if (wait_on_busy(iobase, (addr ? MAXLOOP * 100 : MAXLOOP))) return TRUE; - if ((addr = H2DEV(addr))) { - outb((char) (addr >> 24), iobase + REG_LOW); - outb((char) (addr >> 16), iobase + REG_LM); - outb((char) (addr >> 8), iobase + REG_MID); - outb((char) addr, iobase + REG_MSB); + if (addr) { + devaddr = H2DEV(addr); + byaddr = (unsigned char *) &devaddr; + outb(byaddr[3], iobase + REG_LOW); + outb(byaddr[2], iobase + REG_LM); + outb(byaddr[1], iobase + REG_MID); + outb(byaddr[0], iobase + REG_MSB); } outb(cmd, iobase + REG_CMD); @@ -817,7 +919,7 @@ static inline int read_pio(unsigned long iobase, ushort *start, ushort *end) { } loop = MAXLOOP; - *p = inw(iobase); + *p = REG2H(inw(iobase)); } return FALSE; @@ -848,6 +950,29 @@ static inline struct pci_dev *get_pci_dev(unsigned long port_base) { return NULL; } +static void enable_pci_ports(void) { + +#if defined(CONFIG_PCI) + + struct pci_dev *dev = NULL; + + if (!pci_present()) return; + + while((dev = pci_find_class(PCI_CLASS_STORAGE_SCSI << 8, dev))) { + +#if defined(DEBUG_PCI_DETECT) + printk("%s: enable_pci_ports, bus %d, devfn 0x%x.\n", + driver_name, dev->bus->number, dev->devfn); +#endif + + if (pci_enable_device (dev)) + printk("%s: warning, pci_enable_device failed, bus %d devfn 0x%x.\n", + driver_name, dev->bus->number, dev->devfn); + } + +#endif /* end CONFIG_PCI */ +} + static inline int port_detect \ (unsigned long port_base, unsigned int j, Scsi_Host_Template *tpnt) { unsigned char irq, dma_channel, subversion, i, is_pci = FALSE; @@ -871,31 +996,48 @@ static inline int port_detect \ } if (do_dma(port_base, 0, READ_CONFIG_PIO)) { +#if defined(DEBUG_DETECT) + printk("%s: detect, do_dma failed at 0x%03lx.\n", name, port_base); +#endif release_region(port_base, REGION_SIZE); return FALSE; } /* Read the info structure */ if (read_pio(port_base, (ushort *)&info, (ushort *)&info.ipad[0])) { +#if defined(DEBUG_DETECT) + printk("%s: detect, read_pio failed at 0x%03lx.\n", name, port_base); +#endif release_region(port_base, REGION_SIZE); return FALSE; } + info.data_len = DEV2H(info.data_len); + info.sign = DEV2H(info.sign); + info.cp_pad_len = DEV2H16(info.cp_pad_len); + info.cp_len = DEV2H(info.cp_len); + info.sp_len = DEV2H(info.sp_len); + info.scatt_size = DEV2H16(info.scatt_size); + info.queue_size = DEV2H16(info.queue_size); + /* Check the controller "EATA" signature */ - if (info.sign != EATA_SIGNATURE) { + if (info.sign != EATA_SIG_BE) { +#if defined(DEBUG_DETECT) + printk("%s: signature 0x%04x discarded.\n", name, info.sign); +#endif release_region(port_base, REGION_SIZE); return FALSE; } - if (DEV2H(info.data_len) < EATA_2_0A_SIZE) { + if (info.data_len < EATA_2_0A_SIZE) { printk("%s: config structure size (%d bytes) too short, detaching.\n", - name, DEV2H(info.data_len)); + name, info.data_len); release_region(port_base, REGION_SIZE); return FALSE; } - else if (DEV2H(info.data_len) == EATA_2_0A_SIZE) + else if (info.data_len == EATA_2_0A_SIZE) protocol_rev = 'A'; - else if (DEV2H(info.data_len) == EATA_2_0B_SIZE) + else if (info.data_len == EATA_2_0B_SIZE) protocol_rev = 'B'; else protocol_rev = 'C'; @@ -1007,7 +1149,7 @@ static inline int port_detect \ /* Set board configuration */ memset((char *)cf, 0, sizeof(struct eata_config)); - cf->len = (ushort) cpu_to_be16((ushort)510); + cf->len = (ushort) H2DEV16((ushort)510); cf->ocena = TRUE; if (do_dma(port_base, cf_dma_addr, SET_CONFIG_DMA)) { @@ -1038,9 +1180,9 @@ static inline int port_detect \ sh[j]->n_io_port = REGION_SIZE; sh[j]->dma_channel = dma_channel; sh[j]->irq = irq; - sh[j]->sg_tablesize = (ushort) be16_to_cpu(info.scatt_size); + sh[j]->sg_tablesize = (ushort) info.scatt_size; sh[j]->this_id = (ushort) info.host_addr[3]; - sh[j]->can_queue = (ushort) be16_to_cpu(info.queue_size); + sh[j]->can_queue = (ushort) info.queue_size; sh[j]->cmd_per_lun = MAX_CMD_PER_LUN; memset(HD(j), 0, sizeof(struct hostdata)); HD(j)->subversion = subversion; @@ -1137,9 +1279,11 @@ static inline int port_detect \ if (j == 0) { printk("EATA/DMA 2.0x: Copyright (C) 1994-2002 Dario Ballabio.\n"); - printk("%s config options -> tc:%c, lc:%c, mq:%d, rs:%c, et:%c.\n", - driver_name, tag_type, YESNO(linked_comm), max_queue_depth, - YESNO(rev_scan), YESNO(ext_tran)); + printk("%s config options -> tc:%c, lc:%c, mq:%d, rs:%c, et:%c, "\ + "ip:%c, ep:%c, pp:%c.\n", driver_name, tag_type, + YESNO(linked_comm), max_queue_depth, YESNO(rev_scan), + YESNO(ext_tran), YESNO(isa_probe), YESNO(eisa_probe), + YESNO(pci_probe)); } printk("%s: 2.0%c, %s 0x%03lx, IRQ %u, %s, SG %d, MB %d.\n", @@ -1158,8 +1302,8 @@ static inline int port_detect \ printk("%s: Vers. 0x%x, ocs %u, tar %u, trnxfr %u, more %u, SYNC 0x%x, "\ "sec. %u, infol %d, cpl %d spl %d.\n", name, info.version, info.ocsena, info.tarsup, info.trnxfr, info.morsup, info.sync, - info.second, DEV2H(info.data_len), DEV2H(info.cp_len), - DEV2H(info.sp_len)); + info.second, info.data_len, info.cp_len, + info.sp_len); if (protocol_rev == 'B' || protocol_rev == 'C') printk("%s: isaena %u, forcaddr %u, max_id %u, max_chan %u, "\ @@ -1209,6 +1353,9 @@ static void internal_setup(char *str, int *ints) { else if (!strncmp(cur, "ls:", 3)) link_statistics = val; else if (!strncmp(cur, "et:", 3)) ext_tran = val; else if (!strncmp(cur, "rs:", 3)) rev_scan = val; + else if (!strncmp(cur, "ip:", 3)) isa_probe = val; + else if (!strncmp(cur, "ep:", 3)) eisa_probe = val; + else if (!strncmp(cur, "pp:", 3)) pci_probe = val; if ((cur = strchr(cur, ','))) ++cur; } @@ -1293,7 +1440,19 @@ int eata2x_detect(Scsi_Host_Template *tpnt) { for (k = 0; k < MAX_BOARDS + 1; k++) sh[k] = NULL; - if (!setup_done) add_pci_ports(); + for (k = MAX_INT_PARAM; io_port[k]; k++) + if (io_port[k] == SKIP) continue; + else if (io_port[k] <= MAX_ISA_ADDR) { + if (!isa_probe) io_port[k] = SKIP; + } + else if (io_port[k] >= MIN_EISA_ADDR && io_port[k] <= MAX_EISA_ADDR) { + if (!eisa_probe) io_port[k] = SKIP; + } + + if (pci_probe) { + if (!setup_done) add_pci_ports(); + else enable_pci_ports(); + } for (k = 0; io_port[k]; k++) { @@ -1985,6 +2144,19 @@ static inline void ihdlr(int irq, unsigned int j) { /* Read the status register to clear the interrupt indication */ reg = inb(sh[j]->io_port + REG_STATUS); +#if defined (DEBUG_INTERRUPT) + { + unsigned char *bytesp; + int cnt; + bytesp= (unsigned char *) spp; + if (HD(j)->iocount < 200) { + printk("sp[] ="); + for (cnt=0; cnt < 15; cnt++) printk(" 0x%x", bytesp[cnt]); + printk("\n"); + } + } +#endif + /* Reject any sp with supspect data */ if (spp->eoc == FALSE && HD(j)->iocount > 1) printk("%s: ihdlr, spp->eoc == FALSE, irq %d, reg 0x%x, count %d.\n", diff --git a/drivers/scsi/eata.h b/drivers/scsi/eata.h index 471e51ebfb55..207dafbd8314 100644 --- a/drivers/scsi/eata.h +++ b/drivers/scsi/eata.h @@ -14,7 +14,7 @@ int eata2x_reset(Scsi_Cmnd *); int eata2x_biosparam(Disk *, struct block_device *, int *); static int eata2x_slave_attach(Scsi_Device *); -#define EATA_VERSION "7.22.00" +#define EATA_VERSION "7.70.00" #define EATA { \ name: "EATA/DMA 2.0x rev. " EATA_VERSION " ", \ diff --git a/drivers/scsi/eata_generic.h b/drivers/scsi/eata_generic.h index b25cfbf9e7b3..b4e7ba99e774 100644 --- a/drivers/scsi/eata_generic.h +++ b/drivers/scsi/eata_generic.h @@ -94,12 +94,6 @@ #define CD(cmd) ((struct eata_ccb *)(cmd->host_scribble)) #define SD(host) ((hostdata *)&(host->hostdata)) -#define DELAY(x) { ulong flags, i; \ - save_flags(flags); sti(); \ - i = jiffies + (x * HZ); \ - while (jiffies < i); \ - restore_flags(flags); } - /*********************************************** * EATA Command & Register definitions * ***********************************************/ diff --git a/drivers/scsi/eata_pio.c b/drivers/scsi/eata_pio.c index 2860ec0e2edd..527cc222666b 100644 --- a/drivers/scsi/eata_pio.c +++ b/drivers/scsi/eata_pio.c @@ -99,7 +99,7 @@ void IncStat(Scsi_Pointer *SCp, uint Increment) else { SCp->buffer++; - SCp->ptr=SCp->buffer->address; + SCp->ptr=page_address(SCp->buffer->page) + SCp->buffer->offset; SCp->this_residual=SCp->buffer->length; } } @@ -124,15 +124,11 @@ void eata_pio_int_handler(int irq, void *dev_id, struct pt_regs * regs) hostdata *hd; struct eata_ccb *cp; uint base; - ulong flags; uint x,z; struct Scsi_Host *sh; ushort zwickel=0; unchar stat,odd; - save_flags(flags); - cli(); - for (x = 1, sh = first_HBA; x <= registered_HBAs; x++, sh = SD(sh)->prev) { if (sh->irq != irq) continue; @@ -234,10 +230,8 @@ void eata_pio_int_handler(int irq, void *dev_id, struct pt_regs * regs) if (cp->status == LOCKED) { cp->status = FREE; eata_stat = inb(base + HA_RSTATUS); - printk(KERN_NOTICE "eata_pio: int_handler, freeing locked " + printk(KERN_CRIT "eata_pio: int_handler, freeing locked " "queueslot\n"); - DBG(DBG_INTR&&DBG_DELAY,DELAY(1)); - restore_flags(flags); return; } @@ -245,17 +239,12 @@ void eata_pio_int_handler(int irq, void *dev_id, struct pt_regs * regs) if (stat != 0x50) printk(KERN_DEBUG "stat: %#.2x, result: %#.8x\n", stat, cmd->result); - DBG(DBG_INTR&&DBG_DELAY,DELAY(1)); #endif cp->status = FREE; /* now we can release the slot */ - restore_flags(flags); cmd->scsi_done(cmd); - save_flags(flags); - cli(); } - restore_flags(flags); return; } @@ -281,16 +270,12 @@ inline uint eata_pio_send_command(uint base, unchar command) int eata_pio_queue(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) { uint x, y; - long flags; uint base; hostdata *hd; struct Scsi_Host *sh; struct eata_ccb *cp; - save_flags(flags); - cli(); - queue_counter++; hd = HD(cmd); @@ -322,10 +307,10 @@ int eata_pio_queue(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) DBG(DBG_QUEUE, printk(KERN_DEBUG "eata_pio_queue pid %ld, target: %x, lun:" " %x, y %d\n", cmd->pid, cmd->target, cmd->lun, y)); - DBG(DBG_QUEUE && DBG_DELAY, DELAY(1)); cmd->scsi_done = (void *)done; + /* FIXME: use passed direction flag !! */ switch (cmd->cmnd[0]) { case CHANGE_DEFINITION: case COMPARE: case COPY: case COPY_VERIFY: case LOG_SELECT: case MODE_SELECT: @@ -372,7 +357,7 @@ int eata_pio_queue(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) } else { cmd->SCp.buffer = cmd->request_buffer; cmd->SCp.buffers_residual = cmd->use_sg; - cmd->SCp.ptr = cmd->SCp.buffer->address; + cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + cmd->SCp.buffer->offset; cmd->SCp.this_residual = cmd->SCp.buffer->length; } cmd->SCp.Status = (cmd->SCp.this_residual != 0); /* TRUE as long as bytes @@ -385,10 +370,10 @@ int eata_pio_queue(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) "returning DID_BUS_BUSY, done.\n", cmd->target, cmd->pid); done(cmd); cp->status = FREE; - restore_flags(flags); return (0); } - while (!(inb(base + HA_RSTATUS) & HA_SDRQ)); + while (!(inb(base + HA_RSTATUS) & HA_SDRQ)) + cpu_relax(); outsw(base + HA_RDATA, cp, hd->cplen); outb(EATA_CMD_PIO_TRUNC, base + HA_WCOMMAND); for (x = 0; x < hd->cppadlen; x++) outw(0, base + HA_RDATA); @@ -396,9 +381,7 @@ int eata_pio_queue(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) DBG(DBG_QUEUE,printk(KERN_DEBUG "Queued base %#.4lx pid: %ld target: %x " "lun: %x slot %d irq %d\n", (long)sh->base, cmd->pid, cmd->target, cmd->lun, y, sh->irq)); - DBG(DBG_QUEUE && DBG_DELAY, DELAY(1)); - restore_flags(flags); return (0); } @@ -407,66 +390,58 @@ int eata_pio_abort(Scsi_Cmnd * cmd) ulong flags; uint loop = HZ; - save_flags(flags); - cli(); - + spin_lock_irqsave(cmd->host->host_lock, flags); DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_abort called pid: %ld " "target: %x lun: %x reason %x\n", cmd->pid, cmd->target, cmd->lun, cmd->abort_reason)); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); while (inb((uint)(cmd->host->base) + HA_RAUXSTAT) & HA_ABUSY) if (--loop == 0) { printk(KERN_WARNING "eata_pio: abort, timeout error.\n"); - restore_flags(flags); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); + spin_unlock_irqrestore(cmd->host->host_lock, flags); return (SCSI_ABORT_ERROR); } if (CD(cmd)->status == FREE) { DBG(DBG_ABNORM, printk(KERN_WARNING "Returning: SCSI_ABORT_NOT_RUNNING\n")); - restore_flags(flags); + spin_unlock_irqrestore(cmd->host->host_lock, flags); return (SCSI_ABORT_NOT_RUNNING); } if (CD(cmd)->status == USED) { DBG(DBG_ABNORM, printk(KERN_WARNING "Returning: SCSI_ABORT_BUSY\n")); - restore_flags(flags); + spin_unlock_irqrestore(cmd->host->host_lock, flags); return (SCSI_ABORT_BUSY); /* SNOOZE */ } if (CD(cmd)->status == RESET) { - restore_flags(flags); + spin_unlock_irqrestore(cmd->host->host_lock, flags); printk(KERN_WARNING "eata_pio: abort, command reset error.\n"); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); return (SCSI_ABORT_ERROR); } if (CD(cmd)->status == LOCKED) { - restore_flags(flags); + spin_unlock_irqrestore(cmd->host->host_lock, flags); DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio: abort, queue slot " "locked.\n")); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); return (SCSI_ABORT_NOT_RUNNING); } - restore_flags(flags); + spin_unlock_irqrestore(cmd->host->host_lock, flags); panic("eata_pio: abort: invalid slot status\n"); } int eata_pio_reset(Scsi_Cmnd * cmd, unsigned int dummy) { - uint x, time, limit = 0; + uint x, limit = 0; ulong flags; unchar success = FALSE; Scsi_Cmnd *sp; - save_flags(flags); - cli(); DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset called pid:%ld target:" " %x lun: %x reason %x\n", cmd->pid, cmd->target, cmd->lun, cmd->abort_reason)); + spin_lock_irqsave(cmd->host->host_lock, flags); if (HD(cmd)->state == RESET) { printk(KERN_WARNING "eata_pio_reset: exit, already in reset.\n"); - restore_flags(flags); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); + spin_unlock_irqrestore(cmd->host->host_lock, flags); return (SCSI_RESET_ERROR); } @@ -481,11 +456,9 @@ int eata_pio_reset(Scsi_Cmnd * cmd, unsigned int dummy) HD(cmd)->ccb[x].status = RESET; printk(KERN_WARNING "eata_pio_reset: slot %d in reset, pid %ld.\n", x, sp->pid); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); if (sp == NULL) panic("eata_pio_reset: slot %d, sp==NULL.\n", x); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); } /* hard reset the HBA */ @@ -494,12 +467,11 @@ int eata_pio_reset(Scsi_Cmnd * cmd, unsigned int dummy) DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset: board reset done.\n")); HD(cmd)->state = RESET; - time = jiffies; - while (time_before(jiffies, time + 3 * HZ) && limit++ < 10000000); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(3*HZ); DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset: interrupts disabled, " "loops %d.\n", limit)); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); for (x = 0; x < cmd->host->can_queue; x++) { @@ -514,21 +486,17 @@ int eata_pio_reset(Scsi_Cmnd * cmd, unsigned int dummy) printk(KERN_WARNING "eata_pio_reset: reset ccb %d.\n",x); HD(cmd)->ccb[x].status = FREE; - restore_flags(flags); sp->scsi_done(sp); - cli(); } HD(cmd)->state = FALSE; - restore_flags(flags); + spin_unlock_irqrestore(cmd->host->host_lock, flags); if (success) { /* hmmm... */ DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset: exit, success.\n")); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); return (SCSI_RESET_SUCCESS); } else { DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset: exit, wakeup.\n")); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); return (SCSI_RESET_PUNT); } } @@ -643,7 +611,6 @@ void print_pio_config(struct get_conf *gc) printk("IRQ:%d IRQT:%d FORCADR:%d MCH:%d RIDQ:%d\n", gc->IRQ, gc->IRQ_TR, gc->FORCADR, gc->MAX_CHAN, gc->ID_qest); - DBG(DPT_DEBUG, DELAY(14)); } static uint print_selftest(uint base) @@ -949,9 +916,6 @@ int eata_pio_detect(Scsi_Host_Template * tpnt) struct get_conf gc; int i; - DBG((DBG_PROBE && DBG_DELAY) || DPT_DEBUG, - printk("Using lots of delays to let you read the debugging output\n")); - tpnt->proc_name = "eata_pio"; find_pio_PCI(&gc, tpnt); @@ -989,8 +953,6 @@ int eata_pio_detect(Scsi_Host_Template * tpnt) HBA_ptr = SD(HBA_ptr)->next; } } - DBG(DPT_DEBUG,DELAY(12)); - return (registered_HBAs); } diff --git a/drivers/scsi/fd_mcs.c b/drivers/scsi/fd_mcs.c index 271ce78aa14f..71909634c9f0 100644 --- a/drivers/scsi/fd_mcs.c +++ b/drivers/scsi/fd_mcs.c @@ -96,7 +96,7 @@ #include "fd_mcs.h" #define DRIVER_VERSION "v0.2 by ZP Gu<zpg@castle.net>" - + /* START OF USER DEFINABLE OPTIONS */ #define DEBUG 0 /* Enable debugging output */ @@ -112,7 +112,7 @@ #define DEBUG_MESSAGES 1 /* Debug MESSAGE IN phase */ #define DEBUG_ABORT 1 /* Debug abort() routine */ #define DEBUG_RESET 1 /* Debug reset() routine */ -#define DEBUG_RACE 1 /* Debug interrupt-driven race condition */ +#define DEBUG_RACE 1 /* Debug interrupt-driven race condition */ #else #define EVERY_ACCESS 0 /* LEAVE THESE ALONE--CHANGE THE ONES ABOVE */ #define ERRORS_ONLY 0 @@ -136,86 +136,86 @@ #endif enum chip_type { - unknown = 0x00, - tmc1800 = 0x01, - tmc18c50 = 0x02, - tmc18c30 = 0x03, + unknown = 0x00, + tmc1800 = 0x01, + tmc18c50 = 0x02, + tmc18c30 = 0x03, }; enum { - in_arbitration = 0x02, - in_selection = 0x04, - in_other = 0x08, - disconnect = 0x10, - aborted = 0x20, - sent_ident = 0x40, + in_arbitration = 0x02, + in_selection = 0x04, + in_other = 0x08, + disconnect = 0x10, + aborted = 0x20, + sent_ident = 0x40, }; enum in_port_type { - Read_SCSI_Data = 0, - SCSI_Status = 1, - TMC_Status = 2, - FIFO_Status = 3, /* tmc18c50/tmc18c30 only */ - Interrupt_Cond = 4, /* tmc18c50/tmc18c30 only */ - LSB_ID_Code = 5, - MSB_ID_Code = 6, - Read_Loopback = 7, - SCSI_Data_NoACK = 8, - Interrupt_Status = 9, - Configuration1 = 10, - Configuration2 = 11, /* tmc18c50/tmc18c30 only */ - Read_FIFO = 12, - FIFO_Data_Count = 14 + Read_SCSI_Data = 0, + SCSI_Status = 1, + TMC_Status = 2, + FIFO_Status = 3, /* tmc18c50/tmc18c30 only */ + Interrupt_Cond = 4, /* tmc18c50/tmc18c30 only */ + LSB_ID_Code = 5, + MSB_ID_Code = 6, + Read_Loopback = 7, + SCSI_Data_NoACK = 8, + Interrupt_Status = 9, + Configuration1 = 10, + Configuration2 = 11, /* tmc18c50/tmc18c30 only */ + Read_FIFO = 12, + FIFO_Data_Count = 14 }; enum out_port_type { - Write_SCSI_Data = 0, - SCSI_Cntl = 1, - Interrupt_Cntl = 2, - SCSI_Mode_Cntl = 3, - TMC_Cntl = 4, - Memory_Cntl = 5, /* tmc18c50/tmc18c30 only */ - Write_Loopback = 7, - IO_Control = 11, /* tmc18c30 only */ - Write_FIFO = 12 + Write_SCSI_Data = 0, + SCSI_Cntl = 1, + Interrupt_Cntl = 2, + SCSI_Mode_Cntl = 3, + TMC_Cntl = 4, + Memory_Cntl = 5, /* tmc18c50/tmc18c30 only */ + Write_Loopback = 7, + IO_Control = 11, /* tmc18c30 only */ + Write_FIFO = 12 }; struct fd_hostdata { - unsigned long _bios_base; - int _bios_major; - int _bios_minor; - volatile int _in_command; - Scsi_Cmnd *_current_SC; - enum chip_type _chip; - int _adapter_mask; - int _fifo_count; /* Number of 512 byte blocks before INTR */ - - char _adapter_name[64]; + unsigned long _bios_base; + int _bios_major; + int _bios_minor; + volatile int _in_command; + Scsi_Cmnd *_current_SC; + enum chip_type _chip; + int _adapter_mask; + int _fifo_count; /* Number of 512 byte blocks before INTR */ + + char _adapter_name[64]; #if DEBUG_RACE - volatile int _in_interrupt_flag; + volatile int _in_interrupt_flag; #endif - int _SCSI_Mode_Cntl_port; - int _FIFO_Data_Count_port; - int _Interrupt_Cntl_port; - int _Interrupt_Status_port; - int _Interrupt_Cond_port; - int _Read_FIFO_port; - int _Read_SCSI_Data_port; - int _SCSI_Cntl_port; - int _SCSI_Data_NoACK_port; - int _SCSI_Status_port; - int _TMC_Cntl_port; - int _TMC_Status_port; - int _Write_FIFO_port; - int _Write_SCSI_Data_port; - - int _FIFO_Size; /* = 0x2000; 8k FIFO for + int _SCSI_Mode_Cntl_port; + int _FIFO_Data_Count_port; + int _Interrupt_Cntl_port; + int _Interrupt_Status_port; + int _Interrupt_Cond_port; + int _Read_FIFO_port; + int _Read_SCSI_Data_port; + int _SCSI_Cntl_port; + int _SCSI_Data_NoACK_port; + int _SCSI_Status_port; + int _TMC_Cntl_port; + int _TMC_Status_port; + int _Write_FIFO_port; + int _Write_SCSI_Data_port; + + int _FIFO_Size; /* = 0x2000; 8k FIFO for pre-tmc18c30 chips */ - /* simple stats */ - int _Bytes_Read; - int _Bytes_Written; - int _INTR_Processed; + /* simple stats */ + int _Bytes_Read; + int _Bytes_Written; + int _INTR_Processed; }; #define FD_MAX_HOSTS 3 /* enough? */ @@ -232,7 +232,7 @@ struct fd_hostdata { #define adapter_name (HOSTDATA(shpnt)->_adapter_name) #if DEBUG_RACE #define in_interrupt_flag (HOSTDATA(shpnt)->_in_interrupt_flag) -#endif +#endif #define SCSI_Mode_Cntl_port (HOSTDATA(shpnt)->_SCSI_Mode_Cntl_port) #define FIFO_Data_Count_port (HOSTDATA(shpnt)->_FIFO_Data_Count_port) #define Interrupt_Cntl_port (HOSTDATA(shpnt)->_Interrupt_Cntl_port) @@ -253,337 +253,324 @@ struct fd_hostdata { #define INTR_Processed (HOSTDATA(shpnt)->_INTR_Processed) struct fd_mcs_adapters_struct { - char* name; - int id; - enum chip_type fd_chip; - int fifo_size; - int fifo_count; + char *name; + int id; + enum chip_type fd_chip; + int fifo_size; + int fifo_count; }; #define REPLY_ID 0x5137 static struct fd_mcs_adapters_struct fd_mcs_adapters[] = { - { "Future Domain SCSI Adapter MCS-700(18C50)", - 0x60e9, - tmc18c50, - 0x2000, - 4 }, - { "Future Domain SCSI Adapter MCS-600/700(TMC-1800)", - 0x6127, - tmc1800, - 0x2000, - 4 }, - { "Reply Sound Blaster/SCSI Adapter", - REPLY_ID, - tmc18c30, - 0x800, - 2 }, + {"Future Domain SCSI Adapter MCS-700(18C50)", + 0x60e9, + tmc18c50, + 0x2000, + 4}, + {"Future Domain SCSI Adapter MCS-600/700(TMC-1800)", + 0x6127, + tmc1800, + 0x2000, + 4}, + {"Reply Sound Blaster/SCSI Adapter", + REPLY_ID, + tmc18c30, + 0x800, + 2}, }; #define FD_BRDS sizeof(fd_mcs_adapters)/sizeof(struct fd_mcs_adapters_struct) -static void fd_mcs_intr( int irq, void *dev_id, struct pt_regs * regs ); +static void fd_mcs_intr(int irq, void *dev_id, struct pt_regs *regs); -static unsigned long addresses[] = {0xc8000, 0xca000, 0xce000, 0xde000}; +static unsigned long addresses[] = { 0xc8000, 0xca000, 0xce000, 0xde000 }; static unsigned short ports[] = { 0x140, 0x150, 0x160, 0x170 }; static unsigned short ints[] = { 3, 5, 10, 11, 12, 14, 15, 0 }; /* host information */ static int found = 0; -static struct Scsi_Host *hosts[FD_MAX_HOSTS+1] = { NULL }; +static struct Scsi_Host *hosts[FD_MAX_HOSTS + 1] = { NULL }; static int user_fifo_count = 0; static int user_fifo_size = 0; -void fd_mcs_setup( char *str, int *ints ) +static void fd_mcs_setup(char *str, int *ints) { - static int done_setup = 0; + static int done_setup = 0; - if (done_setup++ || ints[0] < 1 || ints[0] > 2 || - ints[1] < 1 || ints[1] > 16) { - printk( "fd_mcs: usage: fd_mcs=FIFO_COUNT, FIFO_SIZE\n" ); - } + if (done_setup++ || ints[0] < 1 || ints[0] > 2 || ints[1] < 1 || ints[1] > 16) { + printk("fd_mcs: usage: fd_mcs=FIFO_COUNT, FIFO_SIZE\n"); + } - user_fifo_count = ints[0] >= 1 ? ints[1] : 0; - user_fifo_size = ints[0] >= 2 ? ints[2] : 0; + user_fifo_count = ints[0] >= 1 ? ints[1] : 0; + user_fifo_size = ints[0] >= 2 ? ints[2] : 0; } -static void print_banner( struct Scsi_Host *shpnt ) +__setup("fd_mcs=", fd_mcs_setup); + +static void print_banner(struct Scsi_Host *shpnt) { - printk( "scsi%d <fd_mcs>: ", shpnt->host_no); - - if (bios_base) { - printk( "BIOS at 0x%lX", bios_base); - } else { - printk( "No BIOS"); - } - - printk( ", HostID %d, %s Chip, IRQ %d, IO 0x%lX\n", - shpnt->this_id, - chip == tmc18c50 ? "TMC-18C50" - : (chip == tmc18c30 ? "TMC-18C30" : - (chip == tmc1800 ? "TMC-1800" : "Unknown")), - shpnt->irq, - shpnt->io_port ); -} + printk("scsi%d <fd_mcs>: ", shpnt->host_no); + if (bios_base) { + printk("BIOS at 0x%lX", bios_base); + } else { + printk("No BIOS"); + } -static void do_pause( unsigned amount ) /* Pause for amount*10 milliseconds */ -{ - do { - udelay(10*1000); - } while (--amount); + printk(", HostID %d, %s Chip, IRQ %d, IO 0x%lX\n", shpnt->this_id, chip == tmc18c50 ? "TMC-18C50" : (chip == tmc18c30 ? "TMC-18C30" : (chip == tmc1800 ? "TMC-1800" : "Unknown")), shpnt->irq, shpnt->io_port); } -inline static void fd_mcs_make_bus_idle( struct Scsi_Host *shpnt ) -{ - outb( 0, SCSI_Cntl_port ); - outb( 0, SCSI_Mode_Cntl_port ); - if (chip == tmc18c50 || chip == tmc18c30) - outb( 0x21 | PARITY_MASK, TMC_Cntl_port ); /* Clear forced intr. */ - else - outb( 0x01 | PARITY_MASK, TMC_Cntl_port ); + +static void do_pause(unsigned amount) +{ /* Pause for amount*10 milliseconds */ + do { + mdelay(10); + } while (--amount); } -int fd_mcs_detect( Scsi_Host_Template *tpnt ) +static void fd_mcs_make_bus_idle(struct Scsi_Host *shpnt) { - int loop; - struct Scsi_Host *shpnt; - - /* get id, port, bios, irq */ - int slot; - u_char pos2, pos3, pos4; - int id, port, irq; - unsigned long bios; - - /* if not MCA machine, return */ - if (!MCA_bus) - return 0; - - /* changeable? */ - id = 7; - - for( loop = 0; loop < FD_BRDS; loop++ ) { - slot = 0; - while ( MCA_NOTFOUND != - (slot = mca_find_adapter(fd_mcs_adapters[loop].id, - slot)) ) { - - /* if we get this far, an adapter has been detected and is - enabled */ - - printk("scsi <fd_mcs>: %s at slot %d\n", - fd_mcs_adapters[loop].name, slot + 1 ); - - pos2 = mca_read_stored_pos( slot, 2 ); - pos3 = mca_read_stored_pos( slot, 3 ); - pos4 = mca_read_stored_pos( slot, 4); - - /* ready for next probe */ - slot++; - - if (fd_mcs_adapters[loop].id == REPLY_ID) { /* reply card */ - static int reply_irq[] = {10, 11, 14, 15}; - - bios = 0; /* no bios */ - - if (pos2 & 0x2) - port = ports[pos4 & 0x3]; + outb(0, SCSI_Cntl_port); + outb(0, SCSI_Mode_Cntl_port); + if (chip == tmc18c50 || chip == tmc18c30) + outb(0x21 | PARITY_MASK, TMC_Cntl_port); /* Clear forced intr. */ else - continue; - - /* can't really disable it, same as irq=10 */ - irq = reply_irq[((pos4 >> 2) & 0x1) + 2*((pos4 >> 4) & 0x1)]; - } else { - bios = addresses[pos2 >> 6]; - port = ports[(pos2 >> 4) & 0x03]; - irq = ints[(pos2 >> 1) & 0x07]; - } - - if (irq) { - /* claim the slot */ - mca_set_adapter_name( slot-1, fd_mcs_adapters[loop].name ); - - /* check irq/region */ - if (check_region(port, 0x10) || - request_irq(irq, fd_mcs_intr, - SA_SHIRQ, "fd_mcs", hosts)) { - printk( "fd_mcs: check_region() || request_irq() failed, Skip it\n"); - - continue; - } - - /* register */ - if (!(shpnt = scsi_register(tpnt, sizeof(struct fd_hostdata)))) { - printk( "fd_mcs: scsi_register() failed\n"); - continue; - } - - /* request I/O region */ - request_region( port, 0x10, "fd_mcs" ); - - /* save name */ - strcpy(adapter_name, fd_mcs_adapters[loop].name); + outb(0x01 | PARITY_MASK, TMC_Cntl_port); +} - /* chip/fifo */ - chip = fd_mcs_adapters[loop].fd_chip; - /* use boot time value if available */ - FIFO_COUNT = - user_fifo_count?user_fifo_count:fd_mcs_adapters[loop].fifo_count; - FIFO_Size = - user_fifo_size?user_fifo_size:fd_mcs_adapters[loop].fifo_size; +static int fd_mcs_detect(Scsi_Host_Template * tpnt) +{ + int loop; + struct Scsi_Host *shpnt; + + /* get id, port, bios, irq */ + int slot; + u_char pos2, pos3, pos4; + int id, port, irq; + unsigned long bios; + + /* if not MCA machine, return */ + if (!MCA_bus) + return 0; + + /* changeable? */ + id = 7; + + for (loop = 0; loop < FD_BRDS; loop++) { + slot = 0; + while (MCA_NOTFOUND != (slot = mca_find_adapter(fd_mcs_adapters[loop].id, slot))) { + + /* if we get this far, an adapter has been detected and is + enabled */ + + printk(KERN_INFO "scsi <fd_mcs>: %s at slot %d\n", fd_mcs_adapters[loop].name, slot + 1); + + pos2 = mca_read_stored_pos(slot, 2); + pos3 = mca_read_stored_pos(slot, 3); + pos4 = mca_read_stored_pos(slot, 4); + + /* ready for next probe */ + slot++; + + if (fd_mcs_adapters[loop].id == REPLY_ID) { /* reply card */ + static int reply_irq[] = { 10, 11, 14, 15 }; + + bios = 0; /* no bios */ + + if (pos2 & 0x2) + port = ports[pos4 & 0x3]; + else + continue; + + /* can't really disable it, same as irq=10 */ + irq = reply_irq[((pos4 >> 2) & 0x1) + 2 * ((pos4 >> 4) & 0x1)]; + } else { + bios = addresses[pos2 >> 6]; + port = ports[(pos2 >> 4) & 0x03]; + irq = ints[(pos2 >> 1) & 0x07]; + } + + if (irq) { + /* claim the slot */ + mca_set_adapter_name(slot - 1, fd_mcs_adapters[loop].name); + + /* check irq/region */ + if (request_irq(irq, fd_mcs_intr, SA_SHIRQ, "fd_mcs", hosts)) { + printk(KERN_ERR "fd_mcs: interrupt is not available, skipping...\n"); + continue; + } + + /* request I/O region */ + if (request_region(port, 0x10, "fd_mcs")) { + printk(KERN_ERR "fd_mcs: I/O region is already in use, skipping...\n"); + continue; + } + /* register */ + if (!(shpnt = scsi_register(tpnt, sizeof(struct fd_hostdata)))) { + printk(KERN_ERR "fd_mcs: scsi_register() failed\n"); + release_region(port, 0x10); + free_irq(irq, hosts); + continue; + } + + + /* save name */ + strcpy(adapter_name, fd_mcs_adapters[loop].name); + + /* chip/fifo */ + chip = fd_mcs_adapters[loop].fd_chip; + /* use boot time value if available */ + FIFO_COUNT = user_fifo_count ? user_fifo_count : fd_mcs_adapters[loop].fifo_count; + FIFO_Size = user_fifo_size ? user_fifo_size : fd_mcs_adapters[loop].fifo_size; #ifdef NOT_USED - /* *************************************************** */ - /* Try to toggle 32-bit mode. This only - works on an 18c30 chip. (User reports - say this works, so we should switch to - it in the near future.) */ - outb( 0x80, port + IO_Control ); - if ((inb( port + Configuration2 ) & 0x80) == 0x80) { - outb( 0x00, port + IO_Control ); - if ((inb( port + Configuration2 ) & 0x80) == 0x00) { - chip = tmc18c30; - FIFO_Size = 0x800; /* 2k FIFO */ - - printk("FIRST: chip=%s, fifo_size=0x%x\n", - (chip == tmc18c30)?"tmc18c30":"tmc18c50", FIFO_Size); - } - } - - /* That should have worked, but appears to - have problems. Let's assume it is an - 18c30 if the RAM is disabled. */ - - if (inb( port + Configuration2 ) & 0x02) { - chip = tmc18c30; - FIFO_Size = 0x800; /* 2k FIFO */ - - printk("SECOND: chip=%s, fifo_size=0x%x\n", - (chip == tmc18c30)?"tmc18c30":"tmc18c50", FIFO_Size); - } - /* *************************************************** */ + /* *************************************************** */ + /* Try to toggle 32-bit mode. This only + works on an 18c30 chip. (User reports + say this works, so we should switch to + it in the near future.) */ + outb(0x80, port + IO_Control); + if ((inb(port + Configuration2) & 0x80) == 0x80) { + outb(0x00, port + IO_Control); + if ((inb(port + Configuration2) & 0x80) == 0x00) { + chip = tmc18c30; + FIFO_Size = 0x800; /* 2k FIFO */ + + printk("FIRST: chip=%s, fifo_size=0x%x\n", (chip == tmc18c30) ? "tmc18c30" : "tmc18c50", FIFO_Size); + } + } + + /* That should have worked, but appears to + have problems. Let's assume it is an + 18c30 if the RAM is disabled. */ + + if (inb(port + Configuration2) & 0x02) { + chip = tmc18c30; + FIFO_Size = 0x800; /* 2k FIFO */ + + printk("SECOND: chip=%s, fifo_size=0x%x\n", (chip == tmc18c30) ? "tmc18c30" : "tmc18c50", FIFO_Size); + } + /* *************************************************** */ #endif - /* IBM/ANSI scsi scan ordering */ - /* Stick this back in when the scsi.c changes are there */ - shpnt->reverse_ordering = 1; - - - /* saving info */ - hosts[found++] = shpnt; - - shpnt->this_id = id; - shpnt->irq = irq; - shpnt->io_port = port; - shpnt->n_io_port = 0x10; - - /* save */ - bios_base = bios; - adapter_mask = (1 << id); - - /* save more */ - SCSI_Mode_Cntl_port = port + SCSI_Mode_Cntl; - FIFO_Data_Count_port = port + FIFO_Data_Count; - Interrupt_Cntl_port = port + Interrupt_Cntl; - Interrupt_Status_port = port + Interrupt_Status; - Interrupt_Cond_port = port + Interrupt_Cond; - Read_FIFO_port = port + Read_FIFO; - Read_SCSI_Data_port = port + Read_SCSI_Data; - SCSI_Cntl_port = port + SCSI_Cntl; - SCSI_Data_NoACK_port = port + SCSI_Data_NoACK; - SCSI_Status_port = port + SCSI_Status; - TMC_Cntl_port = port + TMC_Cntl; - TMC_Status_port = port + TMC_Status; - Write_FIFO_port = port + Write_FIFO; - Write_SCSI_Data_port = port + Write_SCSI_Data; - - Bytes_Read = 0; - Bytes_Written = 0; - INTR_Processed = 0; - - /* say something */ - print_banner( shpnt ); - - /* reset */ - outb( 1, SCSI_Cntl_port ); - do_pause( 2 ); - outb( 0, SCSI_Cntl_port ); - do_pause( 115 ); - outb( 0, SCSI_Mode_Cntl_port ); - outb( PARITY_MASK, TMC_Cntl_port ); - /* done reset */ + /* IBM/ANSI scsi scan ordering */ + /* Stick this back in when the scsi.c changes are there */ + shpnt->reverse_ordering = 1; + + + /* saving info */ + hosts[found++] = shpnt; + + shpnt->this_id = id; + shpnt->irq = irq; + shpnt->io_port = port; + shpnt->n_io_port = 0x10; + + /* save */ + bios_base = bios; + adapter_mask = (1 << id); + + /* save more */ + SCSI_Mode_Cntl_port = port + SCSI_Mode_Cntl; + FIFO_Data_Count_port = port + FIFO_Data_Count; + Interrupt_Cntl_port = port + Interrupt_Cntl; + Interrupt_Status_port = port + Interrupt_Status; + Interrupt_Cond_port = port + Interrupt_Cond; + Read_FIFO_port = port + Read_FIFO; + Read_SCSI_Data_port = port + Read_SCSI_Data; + SCSI_Cntl_port = port + SCSI_Cntl; + SCSI_Data_NoACK_port = port + SCSI_Data_NoACK; + SCSI_Status_port = port + SCSI_Status; + TMC_Cntl_port = port + TMC_Cntl; + TMC_Status_port = port + TMC_Status; + Write_FIFO_port = port + Write_FIFO; + Write_SCSI_Data_port = port + Write_SCSI_Data; + + Bytes_Read = 0; + Bytes_Written = 0; + INTR_Processed = 0; + + /* say something */ + print_banner(shpnt); + + /* reset */ + outb(1, SCSI_Cntl_port); + do_pause(2); + outb(0, SCSI_Cntl_port); + do_pause(115); + outb(0, SCSI_Mode_Cntl_port); + outb(PARITY_MASK, TMC_Cntl_port); + /* done reset */ #if DO_DETECT - /* scan devices attached */ - { - const int buflen = 255; - int i, j, retcode; - Scsi_Cmnd SCinit; - unsigned char do_inquiry[] = { INQUIRY, 0, 0, 0, buflen, 0 }; - unsigned char do_request_sense[] = { REQUEST_SENSE, - 0, 0, 0, buflen, 0 }; - unsigned char do_read_capacity[] = { READ_CAPACITY, - 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - unsigned char buf[buflen]; - - SCinit.request_buffer = SCinit.buffer = buf; - SCinit.request_bufflen = SCinit.bufflen = sizeof(buf)-1; - SCinit.use_sg = 0; - SCinit.lun = 0; - SCinit.host = shpnt; - - printk( "fd_mcs: detection routine scanning for devices:\n" ); - for (i = 0; i < 8; i++) { - if (i == shpnt->this_id) /* Skip host adapter */ - continue; - SCinit.target = i; - memcpy(SCinit.cmnd, do_request_sense, - sizeof(do_request_sense)); - retcode = fd_mcs_command(&SCinit); - if (!retcode) { - memcpy(SCinit.cmnd, do_inquiry, sizeof(do_inquiry)); - retcode = fd_mcs_command(&SCinit); - if (!retcode) { - printk( " SCSI ID %d: ", i ); - for (j = 8; j < (buf[4] < 32 ? buf[4] : 32); j++) - printk( "%c", buf[j] >= 20 ? buf[j] : ' ' ); - memcpy(SCinit.cmnd, do_read_capacity, - sizeof(do_read_capacity)); - retcode = fd_mcs_command(&SCinit); - if (!retcode) { - unsigned long blocks, size, capacity; - - blocks = (buf[0] << 24) | (buf[1] << 16) - | (buf[2] << 8) | buf[3]; - size = (buf[4] << 24) | (buf[5] << 16) | - (buf[6] << 8) | buf[7]; - capacity = +( +(blocks / 1024L) * +(size * 10L)) / 1024L; - - printk( "%lu MB (%lu byte blocks)\n", - ((capacity + 5L) / 10L), size ); - } - } - } - } - } + /* scan devices attached */ + { + const int buflen = 255; + int i, j, retcode; + Scsi_Cmnd SCinit; + unsigned char do_inquiry[] = { INQUIRY, 0, 0, 0, buflen, 0 }; + unsigned char do_request_sense[] = { REQUEST_SENSE, + 0, 0, 0, buflen, 0 + }; + unsigned char do_read_capacity[] = { READ_CAPACITY, + 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + unsigned char buf[buflen]; + + SCinit.request_buffer = SCinit.buffer = buf; + SCinit.request_bufflen = SCinit.bufflen = sizeof(buf) - 1; + SCinit.use_sg = 0; + SCinit.lun = 0; + SCinit.host = shpnt; + + printk("fd_mcs: detection routine scanning for devices:\n"); + for (i = 0; i < 8; i++) { + if (i == shpnt->this_id) /* Skip host adapter */ + continue; + SCinit.target = i; + memcpy(SCinit.cmnd, do_request_sense, sizeof(do_request_sense)); + retcode = fd_mcs_command(&SCinit); + if (!retcode) { + memcpy(SCinit.cmnd, do_inquiry, sizeof(do_inquiry)); + retcode = fd_mcs_command(&SCinit); + if (!retcode) { + printk(" SCSI ID %d: ", i); + for (j = 8; j < (buf[4] < 32 ? buf[4] : 32); j++) + printk("%c", buf[j] >= 20 ? buf[j] : ' '); + memcpy(SCinit.cmnd, do_read_capacity, sizeof(do_read_capacity)); + retcode = fd_mcs_command(&SCinit); + if (!retcode) { + unsigned long blocks, size, capacity; + + blocks = (buf[0] << 24) | (buf[1] << 16) + | (buf[2] << 8) | buf[3]; + size = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7]; + capacity = +(+(blocks / 1024L) * +(size * 10L)) / 1024L; + + printk("%lu MB (%lu byte blocks)\n", ((capacity + 5L) / 10L), size); + } + } + } + } + } #endif - } - } + } + } - if (found == FD_MAX_HOSTS) { - printk( "fd_mcs: detecting reached max=%d host adapters.\n", - FD_MAX_HOSTS); - break; - } - } + if (found == FD_MAX_HOSTS) { + printk("fd_mcs: detecting reached max=%d host adapters.\n", FD_MAX_HOSTS); + break; + } + } - return found; + return found; } -const char *fd_mcs_info(struct Scsi_Host *shpnt) +static const char *fd_mcs_info(struct Scsi_Host *shpnt) { - return adapter_name; + return adapter_name; } static int TOTAL_INTR = 0; @@ -598,869 +585,864 @@ static int TOTAL_INTR = 0; * length: If inout==FALSE max number of bytes to be written into the buffer * else number of bytes in the buffer */ -int fd_mcs_proc_info( char *buffer, char **start, off_t offset, - int length, int hostno, int inout ) +static int fd_mcs_proc_info(char *buffer, char **start, off_t offset, int length, int hostno, int inout) { - struct Scsi_Host *shpnt; - int len = 0; - int i; + struct Scsi_Host *shpnt; + int len = 0; + int i; - if (inout) - return(-ENOSYS); + if (inout) + return (-ENOSYS); - *start = buffer + offset; + *start = buffer + offset; - for (i = 0; hosts[i] && hosts[i]->host_no != hostno; i++); - shpnt = hosts[i]; + for (i = 0; hosts[i] && hosts[i]->host_no != hostno; i++); + shpnt = hosts[i]; - if (!shpnt) { - return(-ENOENT); - } else { - len += sprintf(buffer+len, "Future Domain MCS-600/700 Driver %s\n", - DRIVER_VERSION); + if (!shpnt) { + return (-ENOENT); + } else { + len += sprintf(buffer + len, "Future Domain MCS-600/700 Driver %s\n", DRIVER_VERSION); - len += sprintf(buffer+len, "HOST #%d: %s\n", - hostno, adapter_name); + len += sprintf(buffer + len, "HOST #%d: %s\n", hostno, adapter_name); - len += sprintf(buffer+len, "FIFO Size=0x%x, FIFO Count=%d\n", - FIFO_Size, FIFO_COUNT); + len += sprintf(buffer + len, "FIFO Size=0x%x, FIFO Count=%d\n", FIFO_Size, FIFO_COUNT); - len += sprintf(buffer+len, "DriverCalls=%d, Interrupts=%d, BytesRead=%d, BytesWrite=%d\n\n", - TOTAL_INTR, INTR_Processed, Bytes_Read, Bytes_Written); - } + len += sprintf(buffer + len, "DriverCalls=%d, Interrupts=%d, BytesRead=%d, BytesWrite=%d\n\n", TOTAL_INTR, INTR_Processed, Bytes_Read, Bytes_Written); + } - if ((len -= offset) <= 0) - return 0; - if (len > length) - len = length; - return len; + if ((len -= offset) <= 0) + return 0; + if (len > length) + len = length; + return len; } - -static int fd_mcs_select(struct Scsi_Host *shpnt, int target ) + +static int fd_mcs_select(struct Scsi_Host *shpnt, int target) { - int status; - unsigned long timeout; + int status; + unsigned long timeout; - outb( 0x82, SCSI_Cntl_port ); /* Bus Enable + Select */ - outb( adapter_mask | (1 << target), SCSI_Data_NoACK_port ); + outb(0x82, SCSI_Cntl_port); /* Bus Enable + Select */ + outb(adapter_mask | (1 << target), SCSI_Data_NoACK_port); - /* Stop arbitration and enable parity */ - outb( PARITY_MASK, TMC_Cntl_port ); + /* Stop arbitration and enable parity */ + outb(PARITY_MASK, TMC_Cntl_port); - timeout = 350; /* 350mS -- because of timeouts + timeout = 350; /* 350mS -- because of timeouts (was 250mS) */ - do { - status = inb( SCSI_Status_port ); /* Read adapter status */ - if (status & 1) { /* Busy asserted */ - /* Enable SCSI Bus (on error, should make bus idle with 0) */ - outb( 0x80, SCSI_Cntl_port ); - return 0; - } - udelay(1000); /* wait one msec */ - } while (--timeout); - - /* Make bus idle */ - fd_mcs_make_bus_idle(shpnt); + do { + status = inb(SCSI_Status_port); /* Read adapter status */ + if (status & 1) { /* Busy asserted */ + /* Enable SCSI Bus (on error, should make bus idle with 0) */ + outb(0x80, SCSI_Cntl_port); + return 0; + } + udelay(1000); /* wait one msec */ + } while (--timeout); + + /* Make bus idle */ + fd_mcs_make_bus_idle(shpnt); #if EVERY_ACCESS - if (!target) printk( "Selection failed\n" ); + if (!target) + printk("Selection failed\n"); #endif #if ERRORS_ONLY - if (!target) { - static int flag = 0; - - if (!flag) /* Skip first failure for all chips. */ - ++flag; - else - printk( "fd_mcs: Selection failed\n" ); - } + if (!target) { + static int flag = 0; + + if (!flag) /* Skip first failure for all chips. */ + ++flag; + else + printk("fd_mcs: Selection failed\n"); + } #endif - return 1; + return 1; } -static void my_done( struct Scsi_Host *shpnt, int error ) +static void my_done(struct Scsi_Host *shpnt, int error) { - if (in_command) { - in_command = 0; - outb( 0x00, Interrupt_Cntl_port ); - fd_mcs_make_bus_idle(shpnt); - current_SC->result = error; - current_SC->scsi_done( current_SC ); - } else { - panic( "fd_mcs: my_done() called outside of command\n" ); - } + if (in_command) { + in_command = 0; + outb(0x00, Interrupt_Cntl_port); + fd_mcs_make_bus_idle(shpnt); + current_SC->result = error; + current_SC->scsi_done(current_SC); + } else { + panic("fd_mcs: my_done() called outside of command\n"); + } #if DEBUG_RACE - in_interrupt_flag = 0; + in_interrupt_flag = 0; #endif } /* only my_done needs to be protected */ -static void fd_mcs_intr( int irq, void *dev_id, struct pt_regs * regs ) +static void fd_mcs_intr(int irq, void *dev_id, struct pt_regs *regs) { - unsigned long flags; - int status; - int done = 0; - unsigned data_count, tmp_count; + unsigned long flags; + int status; + int done = 0; + unsigned data_count, tmp_count; - int i = 0; - struct Scsi_Host *shpnt; + int i = 0; + struct Scsi_Host *shpnt; - TOTAL_INTR++; + TOTAL_INTR++; - /* search for one adapter-response on shared interrupt */ - while ((shpnt = hosts[i++])) { - if ((inb(TMC_Status_port)) & 1) - break; - } - - /* return if some other device on this IRQ caused the interrupt */ - if (!shpnt) { - return; - } + /* search for one adapter-response on shared interrupt */ + while ((shpnt = hosts[i++])) { + if ((inb(TMC_Status_port)) & 1) + break; + } + + /* return if some other device on this IRQ caused the interrupt */ + if (!shpnt) { + return; + } - INTR_Processed++; + INTR_Processed++; - outb( 0x00, Interrupt_Cntl_port ); + outb(0x00, Interrupt_Cntl_port); - /* Abort calls my_done, so we do nothing here. */ - if (current_SC->SCp.phase & aborted) { + /* Abort calls my_done, so we do nothing here. */ + if (current_SC->SCp.phase & aborted) { #if DEBUG_ABORT - printk( "Interrupt after abort, ignoring\n" ); + printk("Interrupt after abort, ignoring\n"); #endif - /* return; */ - } - + /* return; */ + } #if DEBUG_RACE - ++in_interrupt_flag; + ++in_interrupt_flag; #endif - if (current_SC->SCp.phase & in_arbitration) { - status = inb( TMC_Status_port ); /* Read adapter status */ - if (!(status & 0x02)) { + if (current_SC->SCp.phase & in_arbitration) { + status = inb(TMC_Status_port); /* Read adapter status */ + if (!(status & 0x02)) { #if EVERY_ACCESS - printk( " AFAIL " ); + printk(" AFAIL "); #endif - spin_lock_irqsave(shpnt->host_lock, flags); - my_done( shpnt, DID_BUS_BUSY << 16 ); - spin_unlock_irqrestore(shpnt->host_lock, flags); - return; - } - current_SC->SCp.phase = in_selection; - - outb( 0x40 | FIFO_COUNT, Interrupt_Cntl_port ); - - outb( 0x82, SCSI_Cntl_port ); /* Bus Enable + Select */ - outb( adapter_mask | (1 << current_SC->target), SCSI_Data_NoACK_port ); - - /* Stop arbitration and enable parity */ - outb( 0x10 | PARITY_MASK, TMC_Cntl_port ); + spin_lock_irqsave(shpnt->host_lock, flags); + my_done(shpnt, DID_BUS_BUSY << 16); + spin_unlock_irqrestore(shpnt->host_lock, flags); + return; + } + current_SC->SCp.phase = in_selection; + + outb(0x40 | FIFO_COUNT, Interrupt_Cntl_port); + + outb(0x82, SCSI_Cntl_port); /* Bus Enable + Select */ + outb(adapter_mask | (1 << current_SC->target), SCSI_Data_NoACK_port); + + /* Stop arbitration and enable parity */ + outb(0x10 | PARITY_MASK, TMC_Cntl_port); #if DEBUG_RACE - in_interrupt_flag = 0; + in_interrupt_flag = 0; #endif - return; - } else if (current_SC->SCp.phase & in_selection) { - status = inb( SCSI_Status_port ); - if (!(status & 0x01)) { - /* Try again, for slow devices */ - if (fd_mcs_select(shpnt, current_SC->target )) { + return; + } else if (current_SC->SCp.phase & in_selection) { + status = inb(SCSI_Status_port); + if (!(status & 0x01)) { + /* Try again, for slow devices */ + if (fd_mcs_select(shpnt, current_SC->target)) { #if EVERY_ACCESS - printk( " SFAIL " ); + printk(" SFAIL "); #endif - spin_lock_irqsave(shpnt->host_lock, flags); - my_done( shpnt, DID_NO_CONNECT << 16 ); - spin_unlock_irqrestore(shpnt->host_lock, flags); - return; - } else { + spin_lock_irqsave(shpnt->host_lock, flags); + my_done(shpnt, DID_NO_CONNECT << 16); + spin_unlock_irqrestore(shpnt->host_lock, flags); + return; + } else { #if EVERY_ACCESS - printk( " AltSel " ); + printk(" AltSel "); #endif - /* Stop arbitration and enable parity */ - outb( 0x10 | PARITY_MASK, TMC_Cntl_port ); - } - } - current_SC->SCp.phase = in_other; - outb( 0x90 | FIFO_COUNT, Interrupt_Cntl_port ); - outb( 0x80, SCSI_Cntl_port ); + /* Stop arbitration and enable parity */ + outb(0x10 | PARITY_MASK, TMC_Cntl_port); + } + } + current_SC->SCp.phase = in_other; + outb(0x90 | FIFO_COUNT, Interrupt_Cntl_port); + outb(0x80, SCSI_Cntl_port); #if DEBUG_RACE - in_interrupt_flag = 0; + in_interrupt_flag = 0; #endif - return; - } - - /* current_SC->SCp.phase == in_other: this is the body of the routine */ - - status = inb( SCSI_Status_port ); - - if (status & 0x10) { /* REQ */ - - switch (status & 0x0e) { - - case 0x08: /* COMMAND OUT */ - outb( current_SC->cmnd[current_SC->SCp.sent_command++], - Write_SCSI_Data_port ); + return; + } + + /* current_SC->SCp.phase == in_other: this is the body of the routine */ + + status = inb(SCSI_Status_port); + + if (status & 0x10) { /* REQ */ + + switch (status & 0x0e) { + + case 0x08: /* COMMAND OUT */ + outb(current_SC->cmnd[current_SC->SCp.sent_command++], Write_SCSI_Data_port); #if EVERY_ACCESS - printk( "CMD = %x,", - current_SC->cmnd[ current_SC->SCp.sent_command - 1] ); + printk("CMD = %x,", current_SC->cmnd[current_SC->SCp.sent_command - 1]); #endif - break; - case 0x00: /* DATA OUT -- tmc18c50/tmc18c30 only */ - if (chip != tmc1800 && !current_SC->SCp.have_data_in) { - current_SC->SCp.have_data_in = -1; - outb( 0xd0 | PARITY_MASK, TMC_Cntl_port ); - } - break; - case 0x04: /* DATA IN -- tmc18c50/tmc18c30 only */ - if (chip != tmc1800 && !current_SC->SCp.have_data_in) { - current_SC->SCp.have_data_in = 1; - outb( 0x90 | PARITY_MASK, TMC_Cntl_port ); - } - break; - case 0x0c: /* STATUS IN */ - current_SC->SCp.Status = inb( Read_SCSI_Data_port ); + break; + case 0x00: /* DATA OUT -- tmc18c50/tmc18c30 only */ + if (chip != tmc1800 && !current_SC->SCp.have_data_in) { + current_SC->SCp.have_data_in = -1; + outb(0xd0 | PARITY_MASK, TMC_Cntl_port); + } + break; + case 0x04: /* DATA IN -- tmc18c50/tmc18c30 only */ + if (chip != tmc1800 && !current_SC->SCp.have_data_in) { + current_SC->SCp.have_data_in = 1; + outb(0x90 | PARITY_MASK, TMC_Cntl_port); + } + break; + case 0x0c: /* STATUS IN */ + current_SC->SCp.Status = inb(Read_SCSI_Data_port); #if EVERY_ACCESS - printk( "Status = %x, ", current_SC->SCp.Status ); + printk("Status = %x, ", current_SC->SCp.Status); #endif #if ERRORS_ONLY - if (current_SC->SCp.Status - && current_SC->SCp.Status != 2 - && current_SC->SCp.Status != 8) { - printk( "ERROR fd_mcs: target = %d, command = %x, status = %x\n", - current_SC->target, - current_SC->cmnd[0], - current_SC->SCp.Status ); - } + if (current_SC->SCp.Status && current_SC->SCp.Status != 2 && current_SC->SCp.Status != 8) { + printk("ERROR fd_mcs: target = %d, command = %x, status = %x\n", current_SC->target, current_SC->cmnd[0], current_SC->SCp.Status); + } #endif - break; - case 0x0a: /* MESSAGE OUT */ - outb( MESSAGE_REJECT, Write_SCSI_Data_port ); /* Reject */ - break; - case 0x0e: /* MESSAGE IN */ - current_SC->SCp.Message = inb( Read_SCSI_Data_port ); + break; + case 0x0a: /* MESSAGE OUT */ + outb(MESSAGE_REJECT, Write_SCSI_Data_port); /* Reject */ + break; + case 0x0e: /* MESSAGE IN */ + current_SC->SCp.Message = inb(Read_SCSI_Data_port); #if EVERY_ACCESS - printk( "Message = %x, ", current_SC->SCp.Message ); + printk("Message = %x, ", current_SC->SCp.Message); #endif - if (!current_SC->SCp.Message) ++done; + if (!current_SC->SCp.Message) + ++done; #if DEBUG_MESSAGES || EVERY_ACCESS - if (current_SC->SCp.Message) { - printk( "fd_mcs: message = %x\n", current_SC->SCp.Message ); - } + if (current_SC->SCp.Message) { + printk("fd_mcs: message = %x\n", current_SC->SCp.Message); + } #endif - break; - } - } - - if (chip == tmc1800 - && !current_SC->SCp.have_data_in - && (current_SC->SCp.sent_command - >= current_SC->cmd_len)) { - /* We have to get the FIFO direction - correct, so I've made a table based - on the SCSI Standard of which commands - appear to require a DATA OUT phase. - */ - /* - p. 94: Command for all device types - CHANGE DEFINITION 40 DATA OUT - COMPARE 39 DATA OUT - COPY 18 DATA OUT - COPY AND VERIFY 3a DATA OUT - INQUIRY 12 - LOG SELECT 4c DATA OUT - LOG SENSE 4d - MODE SELECT (6) 15 DATA OUT - MODE SELECT (10) 55 DATA OUT - MODE SENSE (6) 1a - MODE SENSE (10) 5a - READ BUFFER 3c - RECEIVE DIAGNOSTIC RESULTS 1c - REQUEST SENSE 03 - SEND DIAGNOSTIC 1d DATA OUT - TEST UNIT READY 00 - WRITE BUFFER 3b DATA OUT - - p.178: Commands for direct-access devices (not listed on p. 94) - FORMAT UNIT 04 DATA OUT - LOCK-UNLOCK CACHE 36 - PRE-FETCH 34 - PREVENT-ALLOW MEDIUM REMOVAL 1e - READ (6)/RECEIVE 08 - READ (10) 3c - READ CAPACITY 25 - READ DEFECT DATA (10) 37 - READ LONG 3e - REASSIGN BLOCKS 07 DATA OUT - RELEASE 17 - RESERVE 16 DATA OUT - REZERO UNIT/REWIND 01 - SEARCH DATA EQUAL (10) 31 DATA OUT - SEARCH DATA HIGH (10) 30 DATA OUT - SEARCH DATA LOW (10) 32 DATA OUT - SEEK (6) 0b - SEEK (10) 2b - SET LIMITS (10) 33 - START STOP UNIT 1b - SYNCHRONIZE CACHE 35 - VERIFY (10) 2f - WRITE (6)/PRINT/SEND 0a DATA OUT - WRITE (10)/SEND 2a DATA OUT - WRITE AND VERIFY (10) 2e DATA OUT - WRITE LONG 3f DATA OUT - WRITE SAME 41 DATA OUT ? - - p. 261: Commands for sequential-access devices (not previously listed) - ERASE 19 - LOAD UNLOAD 1b - LOCATE 2b - READ BLOCK LIMITS 05 - READ POSITION 34 - READ REVERSE 0f - RECOVER BUFFERED DATA 14 - SPACE 11 - WRITE FILEMARKS 10 ? - - p. 298: Commands for printer devices (not previously listed) - ****** NOT SUPPORTED BY THIS DRIVER, since 0b is SEEK (6) ***** - SLEW AND PRINT 0b DATA OUT -- same as seek - STOP PRINT 1b - SYNCHRONIZE BUFFER 10 - - p. 315: Commands for processor devices (not previously listed) - - p. 321: Commands for write-once devices (not previously listed) - MEDIUM SCAN 38 - READ (12) a8 - SEARCH DATA EQUAL (12) b1 DATA OUT - SEARCH DATA HIGH (12) b0 DATA OUT - SEARCH DATA LOW (12) b2 DATA OUT - SET LIMITS (12) b3 - VERIFY (12) af - WRITE (12) aa DATA OUT - WRITE AND VERIFY (12) ae DATA OUT - - p. 332: Commands for CD-ROM devices (not previously listed) - PAUSE/RESUME 4b - PLAY AUDIO (10) 45 - PLAY AUDIO (12) a5 - PLAY AUDIO MSF 47 - PLAY TRACK RELATIVE (10) 49 - PLAY TRACK RELATIVE (12) a9 - READ HEADER 44 - READ SUB-CHANNEL 42 - READ TOC 43 - - p. 370: Commands for scanner devices (not previously listed) - GET DATA BUFFER STATUS 34 - GET WINDOW 25 - OBJECT POSITION 31 - SCAN 1b - SET WINDOW 24 DATA OUT - - p. 391: Commands for optical memory devices (not listed) - ERASE (10) 2c - ERASE (12) ac - MEDIUM SCAN 38 DATA OUT - READ DEFECT DATA (12) b7 - READ GENERATION 29 - READ UPDATED BLOCK 2d - UPDATE BLOCK 3d DATA OUT - - p. 419: Commands for medium changer devices (not listed) - EXCHANGE MEDIUM 46 - INITIALIZE ELEMENT STATUS 07 - MOVE MEDIUM a5 - POSITION TO ELEMENT 2b - READ ELEMENT STATUS b8 - REQUEST VOL. ELEMENT ADDRESS b5 - SEND VOLUME TAG b6 DATA OUT - - p. 454: Commands for communications devices (not listed previously) - GET MESSAGE (6) 08 - GET MESSAGE (10) 28 - GET MESSAGE (12) a8 - */ - - switch (current_SC->cmnd[0]) { - case CHANGE_DEFINITION: case COMPARE: case COPY: - case COPY_VERIFY: case LOG_SELECT: case MODE_SELECT: - case MODE_SELECT_10: case SEND_DIAGNOSTIC: case WRITE_BUFFER: - - case FORMAT_UNIT: case REASSIGN_BLOCKS: case RESERVE: - case SEARCH_EQUAL: case SEARCH_HIGH: case SEARCH_LOW: - case WRITE_6: case WRITE_10: case WRITE_VERIFY: - case 0x3f: case 0x41: - - case 0xb1: case 0xb0: case 0xb2: - case 0xaa: case 0xae: - - case 0x24: - - case 0x38: case 0x3d: - - case 0xb6: - - case 0xea: /* alternate number for WRITE LONG */ - - current_SC->SCp.have_data_in = -1; - outb( 0xd0 | PARITY_MASK, TMC_Cntl_port ); - break; - - case 0x00: - default: - - current_SC->SCp.have_data_in = 1; - outb( 0x90 | PARITY_MASK, TMC_Cntl_port ); - break; - } - } - - if (current_SC->SCp.have_data_in == -1) { /* DATA OUT */ - while ( (data_count = FIFO_Size - inw( FIFO_Data_Count_port )) > 512 ) { + break; + } + } + + if (chip == tmc1800 && !current_SC->SCp.have_data_in && (current_SC->SCp.sent_command >= current_SC->cmd_len)) { + /* We have to get the FIFO direction + correct, so I've made a table based + on the SCSI Standard of which commands + appear to require a DATA OUT phase. + */ + /* + p. 94: Command for all device types + CHANGE DEFINITION 40 DATA OUT + COMPARE 39 DATA OUT + COPY 18 DATA OUT + COPY AND VERIFY 3a DATA OUT + INQUIRY 12 + LOG SELECT 4c DATA OUT + LOG SENSE 4d + MODE SELECT (6) 15 DATA OUT + MODE SELECT (10) 55 DATA OUT + MODE SENSE (6) 1a + MODE SENSE (10) 5a + READ BUFFER 3c + RECEIVE DIAGNOSTIC RESULTS 1c + REQUEST SENSE 03 + SEND DIAGNOSTIC 1d DATA OUT + TEST UNIT READY 00 + WRITE BUFFER 3b DATA OUT + + p.178: Commands for direct-access devices (not listed on p. 94) + FORMAT UNIT 04 DATA OUT + LOCK-UNLOCK CACHE 36 + PRE-FETCH 34 + PREVENT-ALLOW MEDIUM REMOVAL 1e + READ (6)/RECEIVE 08 + READ (10) 3c + READ CAPACITY 25 + READ DEFECT DATA (10) 37 + READ LONG 3e + REASSIGN BLOCKS 07 DATA OUT + RELEASE 17 + RESERVE 16 DATA OUT + REZERO UNIT/REWIND 01 + SEARCH DATA EQUAL (10) 31 DATA OUT + SEARCH DATA HIGH (10) 30 DATA OUT + SEARCH DATA LOW (10) 32 DATA OUT + SEEK (6) 0b + SEEK (10) 2b + SET LIMITS (10) 33 + START STOP UNIT 1b + SYNCHRONIZE CACHE 35 + VERIFY (10) 2f + WRITE (6)/PRINT/SEND 0a DATA OUT + WRITE (10)/SEND 2a DATA OUT + WRITE AND VERIFY (10) 2e DATA OUT + WRITE LONG 3f DATA OUT + WRITE SAME 41 DATA OUT ? + + p. 261: Commands for sequential-access devices (not previously listed) + ERASE 19 + LOAD UNLOAD 1b + LOCATE 2b + READ BLOCK LIMITS 05 + READ POSITION 34 + READ REVERSE 0f + RECOVER BUFFERED DATA 14 + SPACE 11 + WRITE FILEMARKS 10 ? + + p. 298: Commands for printer devices (not previously listed) + ****** NOT SUPPORTED BY THIS DRIVER, since 0b is SEEK (6) ***** + SLEW AND PRINT 0b DATA OUT -- same as seek + STOP PRINT 1b + SYNCHRONIZE BUFFER 10 + + p. 315: Commands for processor devices (not previously listed) + + p. 321: Commands for write-once devices (not previously listed) + MEDIUM SCAN 38 + READ (12) a8 + SEARCH DATA EQUAL (12) b1 DATA OUT + SEARCH DATA HIGH (12) b0 DATA OUT + SEARCH DATA LOW (12) b2 DATA OUT + SET LIMITS (12) b3 + VERIFY (12) af + WRITE (12) aa DATA OUT + WRITE AND VERIFY (12) ae DATA OUT + + p. 332: Commands for CD-ROM devices (not previously listed) + PAUSE/RESUME 4b + PLAY AUDIO (10) 45 + PLAY AUDIO (12) a5 + PLAY AUDIO MSF 47 + PLAY TRACK RELATIVE (10) 49 + PLAY TRACK RELATIVE (12) a9 + READ HEADER 44 + READ SUB-CHANNEL 42 + READ TOC 43 + + p. 370: Commands for scanner devices (not previously listed) + GET DATA BUFFER STATUS 34 + GET WINDOW 25 + OBJECT POSITION 31 + SCAN 1b + SET WINDOW 24 DATA OUT + + p. 391: Commands for optical memory devices (not listed) + ERASE (10) 2c + ERASE (12) ac + MEDIUM SCAN 38 DATA OUT + READ DEFECT DATA (12) b7 + READ GENERATION 29 + READ UPDATED BLOCK 2d + UPDATE BLOCK 3d DATA OUT + + p. 419: Commands for medium changer devices (not listed) + EXCHANGE MEDIUM 46 + INITIALIZE ELEMENT STATUS 07 + MOVE MEDIUM a5 + POSITION TO ELEMENT 2b + READ ELEMENT STATUS b8 + REQUEST VOL. ELEMENT ADDRESS b5 + SEND VOLUME TAG b6 DATA OUT + + p. 454: Commands for communications devices (not listed previously) + GET MESSAGE (6) 08 + GET MESSAGE (10) 28 + GET MESSAGE (12) a8 + */ + + switch (current_SC->cmnd[0]) { + case CHANGE_DEFINITION: + case COMPARE: + case COPY: + case COPY_VERIFY: + case LOG_SELECT: + case MODE_SELECT: + case MODE_SELECT_10: + case SEND_DIAGNOSTIC: + case WRITE_BUFFER: + + case FORMAT_UNIT: + case REASSIGN_BLOCKS: + case RESERVE: + case SEARCH_EQUAL: + case SEARCH_HIGH: + case SEARCH_LOW: + case WRITE_6: + case WRITE_10: + case WRITE_VERIFY: + case 0x3f: + case 0x41: + + case 0xb1: + case 0xb0: + case 0xb2: + case 0xaa: + case 0xae: + + case 0x24: + + case 0x38: + case 0x3d: + + case 0xb6: + + case 0xea: /* alternate number for WRITE LONG */ + + current_SC->SCp.have_data_in = -1; + outb(0xd0 | PARITY_MASK, TMC_Cntl_port); + break; + + case 0x00: + default: + + current_SC->SCp.have_data_in = 1; + outb(0x90 | PARITY_MASK, TMC_Cntl_port); + break; + } + } + + if (current_SC->SCp.have_data_in == -1) { /* DATA OUT */ + while ((data_count = FIFO_Size - inw(FIFO_Data_Count_port)) > 512) { #if EVERY_ACCESS - printk( "DC=%d, ", data_count ) ; + printk("DC=%d, ", data_count); #endif - if (data_count > current_SC->SCp.this_residual) - data_count = current_SC->SCp.this_residual; - if (data_count > 0) { + if (data_count > current_SC->SCp.this_residual) + data_count = current_SC->SCp.this_residual; + if (data_count > 0) { #if EVERY_ACCESS - printk( "%d OUT, ", data_count ); + printk("%d OUT, ", data_count); #endif - if (data_count == 1) { - Bytes_Written++; - - outb( *current_SC->SCp.ptr++, Write_FIFO_port ); - --current_SC->SCp.this_residual; - } else { - data_count >>= 1; - tmp_count = data_count << 1; - outsw( Write_FIFO_port, current_SC->SCp.ptr, data_count ); - current_SC->SCp.ptr += tmp_count; - Bytes_Written += tmp_count; - current_SC->SCp.this_residual -= tmp_count; - } - } - if (!current_SC->SCp.this_residual) { - if (current_SC->SCp.buffers_residual) { - --current_SC->SCp.buffers_residual; - ++current_SC->SCp.buffer; - current_SC->SCp.ptr = current_SC->SCp.buffer->address; - current_SC->SCp.this_residual = current_SC->SCp.buffer->length; - } else - break; - } - } - } else if (current_SC->SCp.have_data_in == 1) { /* DATA IN */ - while ((data_count = inw( FIFO_Data_Count_port )) > 0) { + if (data_count == 1) { + Bytes_Written++; + + outb(*current_SC->SCp.ptr++, Write_FIFO_port); + --current_SC->SCp.this_residual; + } else { + data_count >>= 1; + tmp_count = data_count << 1; + outsw(Write_FIFO_port, current_SC->SCp.ptr, data_count); + current_SC->SCp.ptr += tmp_count; + Bytes_Written += tmp_count; + current_SC->SCp.this_residual -= tmp_count; + } + } + if (!current_SC->SCp.this_residual) { + if (current_SC->SCp.buffers_residual) { + --current_SC->SCp.buffers_residual; + ++current_SC->SCp.buffer; + current_SC->SCp.ptr = page_address(current_SC->SCp.buffer->page) + current_SC->SCp.buffer->offset; + current_SC->SCp.this_residual = current_SC->SCp.buffer->length; + } else + break; + } + } + } else if (current_SC->SCp.have_data_in == 1) { /* DATA IN */ + while ((data_count = inw(FIFO_Data_Count_port)) > 0) { #if EVERY_ACCESS - printk( "DC=%d, ", data_count ); + printk("DC=%d, ", data_count); #endif - if (data_count > current_SC->SCp.this_residual) - data_count = current_SC->SCp.this_residual; - if (data_count) { + if (data_count > current_SC->SCp.this_residual) + data_count = current_SC->SCp.this_residual; + if (data_count) { #if EVERY_ACCESS - printk( "%d IN, ", data_count ); + printk("%d IN, ", data_count); #endif - if (data_count == 1) { - Bytes_Read++; - *current_SC->SCp.ptr++ = inb( Read_FIFO_port ); - --current_SC->SCp.this_residual; - } else { - data_count >>= 1; /* Number of words */ - tmp_count = data_count << 1; - insw( Read_FIFO_port, current_SC->SCp.ptr, data_count ); - current_SC->SCp.ptr += tmp_count; - Bytes_Read += tmp_count; - current_SC->SCp.this_residual -= tmp_count; + if (data_count == 1) { + Bytes_Read++; + *current_SC->SCp.ptr++ = inb(Read_FIFO_port); + --current_SC->SCp.this_residual; + } else { + data_count >>= 1; /* Number of words */ + tmp_count = data_count << 1; + insw(Read_FIFO_port, current_SC->SCp.ptr, data_count); + current_SC->SCp.ptr += tmp_count; + Bytes_Read += tmp_count; + current_SC->SCp.this_residual -= tmp_count; + } + } + if (!current_SC->SCp.this_residual && current_SC->SCp.buffers_residual) { + --current_SC->SCp.buffers_residual; + ++current_SC->SCp.buffer; + current_SC->SCp.ptr = page_address(current_SC->SCp.buffer->page) + current_SC->SCp.buffer->offset; + current_SC->SCp.this_residual = current_SC->SCp.buffer->length; + } + } } - } - if (!current_SC->SCp.this_residual - && current_SC->SCp.buffers_residual) { - --current_SC->SCp.buffers_residual; - ++current_SC->SCp.buffer; - current_SC->SCp.ptr = current_SC->SCp.buffer->address; - current_SC->SCp.this_residual = current_SC->SCp.buffer->length; - } - } - } - - if (done) { + + if (done) { #if EVERY_ACCESS - printk( " ** IN DONE %d ** ", current_SC->SCp.have_data_in ); + printk(" ** IN DONE %d ** ", current_SC->SCp.have_data_in); #endif #if ERRORS_ONLY - if (current_SC->cmnd[0] == REQUEST_SENSE && !current_SC->SCp.Status) { - if ((unsigned char)(*((char *)current_SC->request_buffer+2)) & 0x0f) { - unsigned char key; - unsigned char code; - unsigned char qualifier; - - key = (unsigned char)(*((char *)current_SC->request_buffer + 2)) - & 0x0f; - code = (unsigned char)(*((char *)current_SC->request_buffer + 12)); - qualifier = (unsigned char)(*((char *)current_SC->request_buffer - + 13)); - - if (key != UNIT_ATTENTION - && !(key == NOT_READY - && code == 0x04 - && (!qualifier || qualifier == 0x02 || qualifier == 0x01)) - && !(key == ILLEGAL_REQUEST && (code == 0x25 - || code == 0x24 - || !code))) - - printk( "fd_mcs: REQUEST SENSE " - "Key = %x, Code = %x, Qualifier = %x\n", - key, code, qualifier ); - } - } + if (current_SC->cmnd[0] == REQUEST_SENSE && !current_SC->SCp.Status) { + if ((unsigned char) (*((char *) current_SC->request_buffer + 2)) & 0x0f) { + unsigned char key; + unsigned char code; + unsigned char qualifier; + + key = (unsigned char) (*((char *) current_SC->request_buffer + 2)) & 0x0f; + code = (unsigned char) (*((char *) current_SC->request_buffer + 12)); + qualifier = (unsigned char) (*((char *) current_SC->request_buffer + 13)); + + if (key != UNIT_ATTENTION && !(key == NOT_READY && code == 0x04 && (!qualifier || qualifier == 0x02 || qualifier == 0x01)) + && !(key == ILLEGAL_REQUEST && (code == 0x25 || code == 0x24 || !code))) + + printk("fd_mcs: REQUEST SENSE " "Key = %x, Code = %x, Qualifier = %x\n", key, code, qualifier); + } + } #endif #if EVERY_ACCESS - printk( "BEFORE MY_DONE. . ." ); + printk("BEFORE MY_DONE. . ."); #endif - spin_lock_irqsave(shpnt->host_lock, flags); - my_done( shpnt, - (current_SC->SCp.Status & 0xff) - | ((current_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16) ); - spin_unlock_irqrestore(shpnt->host_lock, flags); + spin_lock_irqsave(shpnt->host_lock, flags); + my_done(shpnt, (current_SC->SCp.Status & 0xff) + | ((current_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16)); + spin_unlock_irqrestore(shpnt->host_lock, flags); #if EVERY_ACCESS - printk( "RETURNING.\n" ); + printk("RETURNING.\n"); #endif - - } else { - if (current_SC->SCp.phase & disconnect) { - outb( 0xd0 | FIFO_COUNT, Interrupt_Cntl_port ); - outb( 0x00, SCSI_Cntl_port ); - } else { - outb( 0x90 | FIFO_COUNT, Interrupt_Cntl_port ); - } - } + + } else { + if (current_SC->SCp.phase & disconnect) { + outb(0xd0 | FIFO_COUNT, Interrupt_Cntl_port); + outb(0x00, SCSI_Cntl_port); + } else { + outb(0x90 | FIFO_COUNT, Interrupt_Cntl_port); + } + } #if DEBUG_RACE - in_interrupt_flag = 0; + in_interrupt_flag = 0; #endif - return; + return; } -int fd_mcs_release(struct Scsi_Host *shpnt) +static int fd_mcs_release(struct Scsi_Host *shpnt) { - int i, this_host, irq_usage; + int i, this_host, irq_usage; - release_region(shpnt->io_port, shpnt->n_io_port); + release_region(shpnt->io_port, shpnt->n_io_port); - this_host = -1; - irq_usage = 0; - for (i = 0; i < found; i++) { - if (shpnt == hosts[i]) - this_host = i; - if (shpnt->irq == hosts[i]->irq) - irq_usage++; - } + this_host = -1; + irq_usage = 0; + for (i = 0; i < found; i++) { + if (shpnt == hosts[i]) + this_host = i; + if (shpnt->irq == hosts[i]->irq) + irq_usage++; + } - /* only for the last one */ - if (1 == irq_usage) - free_irq(shpnt->irq, hosts); + /* only for the last one */ + if (1 == irq_usage) + free_irq(shpnt->irq, hosts); - found--; + found--; - for (i = this_host; i < found; i++) - hosts[i] = hosts[i+1]; + for (i = this_host; i < found; i++) + hosts[i] = hosts[i + 1]; - hosts[found] = NULL; + hosts[found] = NULL; - return 0; + return 0; } -int fd_mcs_queue( Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *)) +static int fd_mcs_queue(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) { - struct Scsi_Host *shpnt = SCpnt->host; + struct Scsi_Host *shpnt = SCpnt->host; - if (in_command) { - panic( "fd_mcs: fd_mcs_queue() NOT REENTRANT!\n" ); - } + if (in_command) { + panic("fd_mcs: fd_mcs_queue() NOT REENTRANT!\n"); + } #if EVERY_ACCESS - printk( "queue: target = %d cmnd = 0x%02x pieces = %d size = %u\n", - SCpnt->target, - *(unsigned char *)SCpnt->cmnd, - SCpnt->use_sg, - SCpnt->request_bufflen ); + printk("queue: target = %d cmnd = 0x%02x pieces = %d size = %u\n", SCpnt->target, *(unsigned char *) SCpnt->cmnd, SCpnt->use_sg, SCpnt->request_bufflen); #endif - fd_mcs_make_bus_idle(shpnt); - - SCpnt->scsi_done = done; /* Save this for the done function */ - current_SC = SCpnt; - - /* Initialize static data */ - - if (current_SC->use_sg) { - current_SC->SCp.buffer = - (struct scatterlist *)current_SC->request_buffer; - current_SC->SCp.ptr = current_SC->SCp.buffer->address; - current_SC->SCp.this_residual = current_SC->SCp.buffer->length; - current_SC->SCp.buffers_residual = current_SC->use_sg - 1; - } else { - current_SC->SCp.ptr = (char *)current_SC->request_buffer; - current_SC->SCp.this_residual = current_SC->request_bufflen; - current_SC->SCp.buffer = NULL; - current_SC->SCp.buffers_residual = 0; - } - - - current_SC->SCp.Status = 0; - current_SC->SCp.Message = 0; - current_SC->SCp.have_data_in = 0; - current_SC->SCp.sent_command = 0; - current_SC->SCp.phase = in_arbitration; - - /* Start arbitration */ - outb( 0x00, Interrupt_Cntl_port ); - outb( 0x00, SCSI_Cntl_port ); /* Disable data drivers */ - outb( adapter_mask, SCSI_Data_NoACK_port ); /* Set our id bit */ - in_command = 1; - outb( 0x20, Interrupt_Cntl_port ); - outb( 0x14 | PARITY_MASK, TMC_Cntl_port ); /* Start arbitration */ - - return 0; + fd_mcs_make_bus_idle(shpnt); + + SCpnt->scsi_done = done; /* Save this for the done function */ + current_SC = SCpnt; + + /* Initialize static data */ + + if (current_SC->use_sg) { + current_SC->SCp.buffer = (struct scatterlist *) current_SC->request_buffer; + current_SC->SCp.ptr = page_address(current_SC->SCp.buffer->page) + current_SC->SCp.buffer->offset; + current_SC->SCp.this_residual = current_SC->SCp.buffer->length; + current_SC->SCp.buffers_residual = current_SC->use_sg - 1; + } else { + current_SC->SCp.ptr = (char *) current_SC->request_buffer; + current_SC->SCp.this_residual = current_SC->request_bufflen; + current_SC->SCp.buffer = NULL; + current_SC->SCp.buffers_residual = 0; + } + + + current_SC->SCp.Status = 0; + current_SC->SCp.Message = 0; + current_SC->SCp.have_data_in = 0; + current_SC->SCp.sent_command = 0; + current_SC->SCp.phase = in_arbitration; + + /* Start arbitration */ + outb(0x00, Interrupt_Cntl_port); + outb(0x00, SCSI_Cntl_port); /* Disable data drivers */ + outb(adapter_mask, SCSI_Data_NoACK_port); /* Set our id bit */ + in_command = 1; + outb(0x20, Interrupt_Cntl_port); + outb(0x14 | PARITY_MASK, TMC_Cntl_port); /* Start arbitration */ + + return 0; } -static void internal_done( Scsi_Cmnd *SCpnt ) +static void internal_done(Scsi_Cmnd * SCpnt) { - /* flag it done */ - SCpnt->host_scribble = (unsigned char *)1; + /* flag it done */ + SCpnt->host_scribble = (unsigned char *) 1; } -int fd_mcs_command( Scsi_Cmnd *SCpnt ) +int fd_mcs_command(Scsi_Cmnd * SCpnt) { - fd_mcs_queue( SCpnt, internal_done ); - /* host_scribble is used for status here */ - SCpnt->host_scribble = NULL; - while (!SCpnt->host_scribble) - barrier(); - return SCpnt->result; + fd_mcs_queue(SCpnt, internal_done); + /* host_scribble is used for status here */ + SCpnt->host_scribble = NULL; + while (!SCpnt->host_scribble) { + cpu_relax(); + barrier(); + } + return SCpnt->result; } #if DEBUG_ABORT || DEBUG_RESET -static void fd_mcs_print_info( Scsi_Cmnd *SCpnt ) +static void fd_mcs_print_info(Scsi_Cmnd * SCpnt) { - unsigned int imr; - unsigned int irr; - unsigned int isr; - struct Scsi_Host *shpnt = SCpnt->host; - - if (!SCpnt || !SCpnt->host) { - printk( "fd_mcs: cannot provide detailed information\n" ); - } - - printk( "%s\n", fd_mcs_info( SCpnt->host ) ); - print_banner( SCpnt->host ); - switch (SCpnt->SCp.phase) { - case in_arbitration: printk( "arbitration " ); break; - case in_selection: printk( "selection " ); break; - case in_other: printk( "other " ); break; - default: printk( "unknown " ); break; - } - - printk( "(%d), target = %d cmnd = 0x%02x pieces = %d size = %u\n", - SCpnt->SCp.phase, - SCpnt->target, - *(unsigned char *)SCpnt->cmnd, - SCpnt->use_sg, - SCpnt->request_bufflen ); - printk( "sent_command = %d, have_data_in = %d, timeout = %d\n", - SCpnt->SCp.sent_command, - SCpnt->SCp.have_data_in, - SCpnt->timeout ); + unsigned int imr; + unsigned int irr; + unsigned int isr; + struct Scsi_Host *shpnt = SCpnt->host; + + if (!SCpnt || !SCpnt->host) { + printk("fd_mcs: cannot provide detailed information\n"); + } + + printk("%s\n", fd_mcs_info(SCpnt->host)); + print_banner(SCpnt->host); + switch (SCpnt->SCp.phase) { + case in_arbitration: + printk("arbitration "); + break; + case in_selection: + printk("selection "); + break; + case in_other: + printk("other "); + break; + default: + printk("unknown "); + break; + } + + printk("(%d), target = %d cmnd = 0x%02x pieces = %d size = %u\n", SCpnt->SCp.phase, SCpnt->target, *(unsigned char *) SCpnt->cmnd, SCpnt->use_sg, SCpnt->request_bufflen); + printk("sent_command = %d, have_data_in = %d, timeout = %d\n", SCpnt->SCp.sent_command, SCpnt->SCp.have_data_in, SCpnt->timeout); #if DEBUG_RACE - printk( "in_interrupt_flag = %d\n", in_interrupt_flag ); + printk("in_interrupt_flag = %d\n", in_interrupt_flag); #endif - imr = (inb( 0x0a1 ) << 8) + inb( 0x21 ); - outb( 0x0a, 0xa0 ); - irr = inb( 0xa0 ) << 8; - outb( 0x0a, 0x20 ); - irr += inb( 0x20 ); - outb( 0x0b, 0xa0 ); - isr = inb( 0xa0 ) << 8; - outb( 0x0b, 0x20 ); - isr += inb( 0x20 ); - - /* Print out interesting information */ - printk( "IMR = 0x%04x", imr ); - if (imr & (1 << shpnt->irq)) - printk( " (masked)" ); - printk( ", IRR = 0x%04x, ISR = 0x%04x\n", irr, isr ); - - printk( "SCSI Status = 0x%02x\n", inb( SCSI_Status_port ) ); - printk( "TMC Status = 0x%02x", inb( TMC_Status_port ) ); - if (inb( TMC_Status_port ) & 1) - printk( " (interrupt)" ); - printk( "\n" ); - printk( "Interrupt Status = 0x%02x", inb( Interrupt_Status_port ) ); - if (inb( Interrupt_Status_port ) & 0x08) - printk( " (enabled)" ); - printk( "\n" ); - if (chip == tmc18c50 || chip == tmc18c30) { - printk( "FIFO Status = 0x%02x\n", inb( shpnt->io_port + FIFO_Status ) ); - printk( "Int. Condition = 0x%02x\n", - inb( shpnt->io_port + Interrupt_Cond ) ); - } - printk( "Configuration 1 = 0x%02x\n", inb( shpnt->io_port + Configuration1 ) ); - if (chip == tmc18c50 || chip == tmc18c30) - printk( "Configuration 2 = 0x%02x\n", - inb( shpnt->io_port + Configuration2 ) ); + imr = (inb(0x0a1) << 8) + inb(0x21); + outb(0x0a, 0xa0); + irr = inb(0xa0) << 8; + outb(0x0a, 0x20); + irr += inb(0x20); + outb(0x0b, 0xa0); + isr = inb(0xa0) << 8; + outb(0x0b, 0x20); + isr += inb(0x20); + + /* Print out interesting information */ + printk("IMR = 0x%04x", imr); + if (imr & (1 << shpnt->irq)) + printk(" (masked)"); + printk(", IRR = 0x%04x, ISR = 0x%04x\n", irr, isr); + + printk("SCSI Status = 0x%02x\n", inb(SCSI_Status_port)); + printk("TMC Status = 0x%02x", inb(TMC_Status_port)); + if (inb(TMC_Status_port) & 1) + printk(" (interrupt)"); + printk("\n"); + printk("Interrupt Status = 0x%02x", inb(Interrupt_Status_port)); + if (inb(Interrupt_Status_port) & 0x08) + printk(" (enabled)"); + printk("\n"); + if (chip == tmc18c50 || chip == tmc18c30) { + printk("FIFO Status = 0x%02x\n", inb(shpnt->io_port + FIFO_Status)); + printk("Int. Condition = 0x%02x\n", inb(shpnt->io_port + Interrupt_Cond)); + } + printk("Configuration 1 = 0x%02x\n", inb(shpnt->io_port + Configuration1)); + if (chip == tmc18c50 || chip == tmc18c30) + printk("Configuration 2 = 0x%02x\n", inb(shpnt->io_port + Configuration2)); } #endif -int fd_mcs_abort( Scsi_Cmnd *SCpnt) +static int fd_mcs_abort(Scsi_Cmnd * SCpnt) { - struct Scsi_Host *shpnt = SCpnt->host; + struct Scsi_Host *shpnt = SCpnt->host; - unsigned long flags; + unsigned long flags; #if EVERY_ACCESS || ERRORS_ONLY || DEBUG_ABORT - printk( "fd_mcs: abort " ); + printk("fd_mcs: abort "); #endif - save_flags( flags ); - cli(); - if (!in_command) { + spin_lock_irqsave(shpnt->host_lock, flags); + if (!in_command) { #if EVERY_ACCESS || ERRORS_ONLY - printk( " (not in command)\n" ); + printk(" (not in command)\n"); #endif - restore_flags( flags ); - return SCSI_ABORT_NOT_RUNNING; - } else printk( "\n" ); + spin_unlock_irqrestore(shpnt->host_lock, flags); + return FAILED; + } else + printk("\n"); #if DEBUG_ABORT - fd_mcs_print_info( SCpnt ); + fd_mcs_print_info(SCpnt); #endif - fd_mcs_make_bus_idle(shpnt); + fd_mcs_make_bus_idle(shpnt); - current_SC->SCp.phase |= aborted; + current_SC->SCp.phase |= aborted; - current_SC->result = DID_ABORT << 16; + current_SC->result = DID_ABORT << 16; - restore_flags( flags ); - - /* Aborts are not done well. . . */ - spin_lock_irqsave(shpnt->host_lock, flags); - my_done( shpnt, DID_ABORT << 16 ); - spin_unlock_irqrestore(shpnt->host_lock, flags); + /* Aborts are not done well. . . */ + my_done(shpnt, DID_ABORT << 16); - return SCSI_ABORT_SUCCESS; + spin_unlock_irqrestore(shpnt->host_lock, flags); + return SUCCESS; } -int fd_mcs_reset( Scsi_Cmnd *SCpnt, unsigned int reset_flags ) +static int fd_mcs_host_reset(Scsi_Cmnd * SCpnt) { - struct Scsi_Host *shpnt = SCpnt->host; + return FAILED; +} + +static int fd_mcs_device_reset(Scsi_Cmnd * SCpnt) { + return FAILED; + } + + static int fd_mcs_bus_reset(Scsi_Cmnd * SCpnt) { + struct Scsi_Host *shpnt = SCpnt->host; + unsigned long flags; #if DEBUG_RESET - static int called_once = 0; + static int called_once = 0; #endif #if ERRORS_ONLY - if (SCpnt) printk( "fd_mcs: SCSI Bus Reset\n" ); + if (SCpnt) + printk("fd_mcs: SCSI Bus Reset\n"); #endif #if DEBUG_RESET - if (called_once) fd_mcs_print_info( current_SC ); - called_once = 1; + if (called_once) + fd_mcs_print_info(current_SC); + called_once = 1; #endif - - outb( 1, SCSI_Cntl_port ); - do_pause( 2 ); - outb( 0, SCSI_Cntl_port ); - do_pause( 115 ); - outb( 0, SCSI_Mode_Cntl_port ); - outb( PARITY_MASK, TMC_Cntl_port ); - - /* Unless this is the very first call (i.e., SCPnt == NULL), everything - is probably hosed at this point. We will, however, try to keep - things going by informing the high-level code that we need help. */ - - return SCSI_RESET_WAKEUP; -} + + spin_lock_irqsave(shpnt->host_lock, flags); + + outb(1, SCSI_Cntl_port); + do_pause(2); + outb(0, SCSI_Cntl_port); + do_pause(115); + outb(0, SCSI_Mode_Cntl_port); + outb(PARITY_MASK, TMC_Cntl_port); + + /* Unless this is the very first call (i.e., SCPnt == NULL), everything + is probably hosed at this point. We will, however, try to keep + things going by informing the high-level code that we need help. */ + + spin_unlock_irqrestore(shpnt->host_lock, flags); + return SUCCESS; + } #include "sd.h" #include <scsi/scsi_ioctl.h> -int fd_mcs_biosparam( Scsi_Disk *disk, struct block_device *bdev, int *info_array ) -{ - unsigned char buf[512 + sizeof( int ) * 2]; - int size = disk->capacity; - int *sizes = (int *)buf; - unsigned char *data = (unsigned char *)(sizes + 2); - unsigned char do_read[] = { READ_6, 0, 0, 0, 1, 0 }; - int retcode; - - /* BIOS >= 3.4 for MCA cards */ - /* This algorithm was provided by Future Domain (much thanks!). */ - - sizes[0] = 0; /* zero bytes out */ - sizes[1] = 512; /* one sector in */ - memcpy( data, do_read, sizeof( do_read ) ); - retcode = kernel_scsi_ioctl( disk->device, - SCSI_IOCTL_SEND_COMMAND, - (void *)buf ); - if (!retcode /* SCSI command ok */ - && data[511] == 0xaa && data[510] == 0x55 /* Partition table valid */ - && data[0x1c2]) { /* Partition type */ - - /* The partition table layout is as follows: - - Start: 0x1b3h - Offset: 0 = partition status - 1 = starting head - 2 = starting sector and cylinder (word, encoded) - 4 = partition type - 5 = ending head - 6 = ending sector and cylinder (word, encoded) - 8 = starting absolute sector (double word) - c = number of sectors (double word) - Signature: 0x1fe = 0x55aa - - So, this algorithm assumes: - 1) the first partition table is in use, - 2) the data in the first entry is correct, and - 3) partitions never divide cylinders - - Note that (1) may be FALSE for NetBSD (and other BSD flavors), - as well as for Linux. Note also, that Linux doesn't pay any - attention to the fields that are used by this algorithm -- it - only uses the absolute sector data. Recent versions of Linux's - fdisk(1) will fill this data in correctly, and forthcoming - versions will check for consistency. - - Checking for a non-zero partition type is not part of the - Future Domain algorithm, but it seemed to be a reasonable thing - to do, especially in the Linux and BSD worlds. */ - - info_array[0] = data[0x1c3] + 1; /* heads */ - info_array[1] = data[0x1c4] & 0x3f; /* sectors */ - } else { - - /* Note that this new method guarantees that there will always be - less than 1024 cylinders on a platter. This is good for drives - up to approximately 7.85GB (where 1GB = 1024 * 1024 kB). */ - - if ((unsigned int)size >= 0x7e0000U) { - info_array[0] = 0xff; /* heads = 255 */ - info_array[1] = 0x3f; /* sectors = 63 */ - } else if ((unsigned int)size >= 0x200000U) { - info_array[0] = 0x80; /* heads = 128 */ - info_array[1] = 0x3f; /* sectors = 63 */ - } else { - info_array[0] = 0x40; /* heads = 64 */ - info_array[1] = 0x20; /* sectors = 32 */ - } - } - /* For both methods, compute the cylinders */ - info_array[2] = (unsigned int)size / (info_array[0] * info_array[1] ); - - - return 0; -} + static int fd_mcs_biosparam(Scsi_Disk * disk, struct block_device *bdev, int *info_array) { + unsigned char buf[512 + sizeof(int) * 2]; + int size = disk->capacity; + int *sizes = (int *) buf; + unsigned char *data = (unsigned char *) (sizes + 2); + unsigned char do_read[] = { READ_6, 0, 0, 0, 1, 0 }; + int retcode; + + /* BIOS >= 3.4 for MCA cards */ + /* This algorithm was provided by Future Domain (much thanks!). */ + + sizes[0] = 0; /* zero bytes out */ + sizes[1] = 512; /* one sector in */ + memcpy(data, do_read, sizeof(do_read)); + retcode = kernel_scsi_ioctl(disk->device, SCSI_IOCTL_SEND_COMMAND, (void *) buf); + if (!retcode /* SCSI command ok */ + && data[511] == 0xaa && data[510] == 0x55 /* Partition table valid */ + && data[0x1c2]) { /* Partition type */ + + /* The partition table layout is as follows: + + Start: 0x1b3h + Offset: 0 = partition status + 1 = starting head + 2 = starting sector and cylinder (word, encoded) + 4 = partition type + 5 = ending head + 6 = ending sector and cylinder (word, encoded) + 8 = starting absolute sector (double word) + c = number of sectors (double word) + Signature: 0x1fe = 0x55aa + + So, this algorithm assumes: + 1) the first partition table is in use, + 2) the data in the first entry is correct, and + 3) partitions never divide cylinders + + Note that (1) may be FALSE for NetBSD (and other BSD flavors), + as well as for Linux. Note also, that Linux doesn't pay any + attention to the fields that are used by this algorithm -- it + only uses the absolute sector data. Recent versions of Linux's + fdisk(1) will fill this data in correctly, and forthcoming + versions will check for consistency. + + Checking for a non-zero partition type is not part of the + Future Domain algorithm, but it seemed to be a reasonable thing + to do, especially in the Linux and BSD worlds. */ + + info_array[0] = data[0x1c3] + 1; /* heads */ + info_array[1] = data[0x1c4] & 0x3f; /* sectors */ + } else { + + /* Note that this new method guarantees that there will always be + less than 1024 cylinders on a platter. This is good for drives + up to approximately 7.85GB (where 1GB = 1024 * 1024 kB). */ + + if ((unsigned int) size >= 0x7e0000U) { + info_array[0] = 0xff; /* heads = 255 */ + info_array[1] = 0x3f; /* sectors = 63 */ + } else if ((unsigned int) size >= 0x200000U) { + info_array[0] = 0x80; /* heads = 128 */ + info_array[1] = 0x3f; /* sectors = 63 */ + } else { + info_array[0] = 0x40; /* heads = 64 */ + info_array[1] = 0x20; /* sectors = 32 */ + } + } + /* For both methods, compute the cylinders */ + info_array[2] = (unsigned int) size / (info_array[0] * info_array[1]); + + + return 0; + } /* Eventually this will go into an include file, but this will be later */ -static Scsi_Host_Template driver_template = FD_MCS; + static Scsi_Host_Template driver_template = FD_MCS; #include "scsi_module.c" diff --git a/drivers/scsi/fd_mcs.h b/drivers/scsi/fd_mcs.h index fb490c906afc..a98e6e8fdf45 100644 --- a/drivers/scsi/fd_mcs.h +++ b/drivers/scsi/fd_mcs.h @@ -22,31 +22,36 @@ #ifndef _FD_MCS_H #define _FD_MCS_H -extern int fd_mcs_detect( Scsi_Host_Template * ); -extern int fd_mcs_release( struct Scsi_Host * ); -extern int fd_mcs_command( Scsi_Cmnd * ); -extern int fd_mcs_abort( Scsi_Cmnd * ); -extern int fd_mcs_reset( Scsi_Cmnd *, unsigned int ); -extern int fd_mcs_queue( Scsi_Cmnd *, void (*done)(Scsi_Cmnd *) ); -extern int fd_mcs_biosparam( Disk *, struct block_device *, int * ); -extern int fd_mcs_proc_info( char *, char **, off_t, int, int, int ); -extern const char *fd_mcs_info(struct Scsi_Host *); +static int fd_mcs_detect(Scsi_Host_Template *); +static int fd_mcs_release(struct Scsi_Host *); +static int fd_mcs_command(Scsi_Cmnd *); +static int fd_mcs_abort(Scsi_Cmnd *); +static int fd_mcs_bus_reset(Scsi_Cmnd *); +static int fd_mcs_device_reset(Scsi_Cmnd *); +static int fd_mcs_host_reset(Scsi_Cmnd *); +static int fd_mcs_queue(Scsi_Cmnd *, void (*done) (Scsi_Cmnd *)); +static int fd_mcs_biosparam(Disk *, struct block_device *, int *); +static int fd_mcs_proc_info(char *, char **, off_t, int, int, int); +static const char *fd_mcs_info(struct Scsi_Host *); #define FD_MCS {\ - proc_name: "fd_mcs", \ - proc_info: fd_mcs_proc_info, \ - detect: fd_mcs_detect, \ - release: fd_mcs_release, \ - info: fd_mcs_info, \ - command: fd_mcs_command, \ - queuecommand: fd_mcs_queue, \ - abort: fd_mcs_abort, \ - reset: fd_mcs_reset, \ - bios_param: fd_mcs_biosparam, \ - can_queue: 1, \ - this_id: 7, \ - sg_tablesize: 64, \ - cmd_per_lun: 1, \ - use_clustering: DISABLE_CLUSTERING } - -#endif /* _FD_MCS_H */ + proc_name: "fd_mcs", \ + proc_info: fd_mcs_proc_info, \ + detect: fd_mcs_detect, \ + release: fd_mcs_release, \ + info: fd_mcs_info, \ + command: fd_mcs_command, \ + queuecommand: fd_mcs_queue, \ + eh_abort_handler: fd_mcs_abort, \ + eh_bus_reset_handler: fd_mcs_bus_reset, \ + eh_host_reset_handler: fd_mcs_host_reset, \ + eh_device_reset_handler: fd_mcs_device_reset, \ + bios_param: fd_mcs_biosparam, \ + can_queue: 1, \ + this_id: 7, \ + sg_tablesize: 64, \ + cmd_per_lun: 1, \ + use_clustering: DISABLE_CLUSTERING \ + } + +#endif /* _FD_MCS_H */ diff --git a/drivers/scsi/g_NCR5380.c b/drivers/scsi/g_NCR5380.c index 04d100595355..6c6789f30203 100644 --- a/drivers/scsi/g_NCR5380.c +++ b/drivers/scsi/g_NCR5380.c @@ -100,12 +100,6 @@ #define NCR5380_STATS #undef NCR5380_STAT_LIMIT #endif -#if defined(CONFIG_SCSI_G_NCR5380_PORT) && defined(CONFIG_SCSI_G_NCR5380_MEM) -#error You can not configure the Generic NCR 5380 SCSI Driver for memory mapped I/O and port mapped I/O at the same time (yet) -#endif -#if !defined(CONFIG_SCSI_G_NCR5380_PORT) && !defined(CONFIG_SCSI_G_NCR5380_MEM) -#error You must configure the Generic NCR 5380 SCSI Driver for one of memory mapped I/O and port mapped I/O. -#endif #include <asm/system.h> #include <asm/io.h> @@ -121,6 +115,7 @@ #include <linux/init.h> #include <linux/ioport.h> #include <linux/isapnp.h> +#include <linux/delay.h> #define NCR_NOT_SET 0 static int ncr_irq = NCR_NOT_SET; @@ -143,8 +138,11 @@ static struct override { [1] __initdata = { { 0,},}; #endif + #define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override)) +#ifndef MODULE + /** * internal_setup - handle lilo command string override * @board: BOARD_* identifier for the board @@ -199,6 +197,7 @@ static void __init internal_setup(int board, char *str, int *ints) } } + /** * do_NCR53C80_setup - set up entry point * @str: unused @@ -270,6 +269,8 @@ static int __init do_DTC3181E_setup(char *str) return 1; } +#endif + /** * generic_NCR5380_detect - look for NCR5380 controllers * @tpnt: the scsi template @@ -367,7 +368,7 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt) break; } -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM if (ports) { /* wakeup sequence for the NCR53C400A and DTC3181E */ @@ -412,7 +413,7 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt) #endif instance = scsi_register(tpnt, sizeof(struct NCR5380_hostdata)); if (instance == NULL) { -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM release_region(overrides[current_override].NCR5380_map_name, NCR5380_region_size); #else release_mem_region(overrides[current_override].NCR5380_map_name, NCR5380_region_size); @@ -430,7 +431,7 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt) instance->irq = NCR5380_probe_irq(instance, 0xffff); if (instance->irq != IRQ_NONE) - if (request_irq(instance->irq, do_generic_NCR5380_intr, SA_INTERRUPT, "NCR5380", NULL)) { + if (request_irq(instance->irq, generic_NCR5380_intr, SA_INTERRUPT, "NCR5380", NULL)) { printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); instance->irq = IRQ_NONE; } @@ -482,7 +483,7 @@ int generic_NCR5380_release_resources(struct Scsi_Host *instance) NCR5380_local_declare(); NCR5380_setup(instance); -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM release_region(instance->NCR5380_instance_name, NCR5380_region_size); #else release_mem_region(instance->NCR5380_instance_name, NCR5380_region_size); @@ -555,7 +556,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, } while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY); -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM { int i; for (i = 0; i < 128; i++) @@ -575,7 +576,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, // FIXME - no timeout } -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM { int i; for (i = 0; i < 128; i++) @@ -641,7 +642,7 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src, } while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY) ; // FIXME - timeout -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM { for (i = 0; i < 128; i++) NCR5380_write(C400_HOST_BUFFER, src[start + i]); @@ -657,7 +658,7 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src, while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY) ; // FIXME - no timeout -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM { for (i = 0; i < 128; i++) NCR5380_write(C400_HOST_BUFFER, src[start + i]); @@ -781,9 +782,8 @@ int generic_NCR5380_proc_info(char *buffer, char **start, off_t offset, int leng #endif /* For now this is constant so we may walk it */ - for (scsi_ptr = first_instance; scsi_ptr; scsi_ptr = scsi_ptr->next) - if (scsi_ptr->host_no == hostno) - break; + scsi_ptr = scsi_host_hn_get(hostno); + NCR5380_setup(scsi_ptr); hostdata = (struct NCR5380_hostdata *) scsi_ptr->hostdata; diff --git a/drivers/scsi/g_NCR5380.h b/drivers/scsi/g_NCR5380.h index 6ab4524b66c9..4195fb2e5d24 100644 --- a/drivers/scsi/g_NCR5380.h +++ b/drivers/scsi/g_NCR5380.h @@ -44,25 +44,19 @@ #endif #ifndef ASM -int generic_NCR5380_abort(Scsi_Cmnd *); -int generic_NCR5380_detect(Scsi_Host_Template *); -int generic_NCR5380_release_resources(struct Scsi_Host *); -int generic_NCR5380_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -int generic_NCR5380_bus_reset(Scsi_Cmnd *); -int generic_NCR5380_host_reset(Scsi_Cmnd *); -int generic_NCR5380_device_reset(Scsi_Cmnd *); -int notyet_generic_proc_info (char *buffer ,char **start, off_t offset, +static int generic_NCR5380_abort(Scsi_Cmnd *); +static int generic_NCR5380_detect(Scsi_Host_Template *); +static int generic_NCR5380_release_resources(struct Scsi_Host *); +static int generic_NCR5380_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); +static int generic_NCR5380_bus_reset(Scsi_Cmnd *); +static int generic_NCR5380_host_reset(Scsi_Cmnd *); +static int generic_NCR5380_device_reset(Scsi_Cmnd *); +static int notyet_generic_proc_info (char *buffer ,char **start, off_t offset, int length, int hostno, int inout); -const char* generic_NCR5380_info(struct Scsi_Host *); -#ifdef BIOSPARAM -int generic_NCR5380_biosparam(Disk *, struct block_device *, int *); -#endif - -int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int length, int hostno, int inout); +static const char* generic_NCR5380_info(struct Scsi_Host *); +static int generic_NCR5380_biosparam(Disk *, struct block_device *, int *); -#ifndef NULL -#define NULL 0 -#endif +static int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int length, int hostno, int inout); #ifndef CMD_PER_LUN #define CMD_PER_LUN 2 @@ -95,18 +89,13 @@ int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int leng #define __STRVAL(x) #x #define STRVAL(x) __STRVAL(x) -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM #define NCR5380_map_config port - #define NCR5380_map_type int - #define NCR5380_map_name port - #define NCR5380_instance_name io_port - #define NCR53C400_register_offset 0 - #define NCR53C400_address_adjust 8 #ifdef NCR53C400 @@ -122,27 +111,17 @@ int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int leng /* therefore CONFIG_SCSI_G_NCR5380_MEM */ #define NCR5380_map_config memory - #define NCR5380_map_type unsigned long - #define NCR5380_map_name base - #define NCR5380_instance_name base - #define NCR53C400_register_offset 0x108 - #define NCR53C400_address_adjust 0 - #define NCR53C400_mem_base 0x3880 - #define NCR53C400_host_buffer 0x3900 - #define NCR5380_region_size 0x3a00 - #define NCR5380_read(reg) isa_readb(NCR5380_map_name + NCR53C400_mem_base + (reg)) #define NCR5380_write(reg, value) isa_writeb(NCR5380_map_name + NCR53C400_mem_base + (reg), value) - #endif #define NCR5380_implementation_fields \ @@ -155,7 +134,6 @@ int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int leng NCR5380_map_name = (NCR5380_map_type)((instance)->NCR5380_instance_name) #define NCR5380_intr generic_NCR5380_intr -#define do_NCR5380_intr do_generic_NCR5380_intr #define NCR5380_queue_command generic_NCR5380_queue_command #define NCR5380_abort generic_NCR5380_abort #define NCR5380_bus_reset generic_NCR5380_bus_reset diff --git a/drivers/scsi/g_NCR5380_mmio.c b/drivers/scsi/g_NCR5380_mmio.c new file mode 100644 index 000000000000..8cdde71ba0c8 --- /dev/null +++ b/drivers/scsi/g_NCR5380_mmio.c @@ -0,0 +1,10 @@ +/* + * There is probably a nicer way to do this but this one makes + * pretty obvious what is happening. We rebuild the same file with + * different options for mmio versus pio. + */ + +#define SCSI_G_NCR5380_MEM + +#include "g_NCR5380.c" + diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index a67ab4b1ea9d..aa1d58677908 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c @@ -91,8 +91,8 @@ int scsi_tp_for_each_host(Scsi_Host_Template *shost_tp, int * @shost: * * Description: - * This is the default case for the release function. It should do - * the right thing for most correctly written host adapters. + * This is the default case for the release function. Its completely + * useless for anything but old ISA adapters **/ static void scsi_host_generic_release(struct Scsi_Host *shost) { diff --git a/drivers/scsi/ibmmca.c b/drivers/scsi/ibmmca.c index 0f17af51c3cc..1cc93764b795 100644 --- a/drivers/scsi/ibmmca.c +++ b/drivers/scsi/ibmmca.c @@ -28,6 +28,7 @@ #include <linux/proc_fs.h> #include <linux/stat.h> #include <linux/mca.h> +#include <linux/string.h> #include <asm/system.h> #include <linux/spinlock.h> #include <asm/io.h> @@ -504,15 +505,16 @@ static void interrupt_handler (int irq, void *dev_id, struct pt_regs *regs) unsigned long flags; Scsi_Cmnd *cmd; int lastSCSI; + struct Scsi_Host *dev = dev_id; - IBMLOCK(dev_id) + IBMLOCK(dev) /* search for one adapter-response on shared interrupt */ for (host_index=0; hosts[host_index] && !(inb(IM_STAT_REG(host_index)) & IM_INTR_REQUEST); host_index++); /* return if some other device on this IRQ caused the interrupt */ if (!hosts[host_index]) { - IBMUNLOCK(dev_id) + IBMUNLOCK(dev) return; } @@ -521,15 +523,16 @@ static void interrupt_handler (int irq, void *dev_id, struct pt_regs *regs) if ((reset_status(host_index) == IM_RESET_NOT_IN_PROGRESS_NO_INT)|| (reset_status(host_index) == IM_RESET_FINISHED_OK_NO_INT)) { reset_status(host_index) = IM_RESET_NOT_IN_PROGRESS; - IBMUNLOCK(dev_id) + IBMUNLOCK(dev) return; } /*must wait for attention reg not busy, then send EOI to subsystem */ while (1) { if (!(inb (IM_STAT_REG(host_index)) & IM_BUSY)) break; - IBMUNLOCK(dev_id) /* cycle interrupt */ - IBMLOCK(dev_id) + IBMUNLOCK(dev) /* cycle interrupt */ + cpu_relax(); + IBMLOCK(dev) } ihost_index=host_index; /*get command result and logical device */ @@ -539,7 +542,7 @@ static void interrupt_handler (int irq, void *dev_id, struct pt_regs *regs) /* get the last_scsi_command here */ lastSCSI = last_scsi_command(ihost_index)[ldn]; outb (IM_EOI | ldn, IM_ATTN_REG(ihost_index)); - IBMUNLOCK(dev_id) + IBMUNLOCK(dev) /*these should never happen (hw fails, or a local programming bug) */ if (!global_command_error_excuse) { switch (cmd_result) { @@ -1435,12 +1438,13 @@ void internal_ibmmca_scsi_setup (char *str, int *ints) return; } -static int ibmmca_getinfo (char *buf, int slot, void *dev) +static int ibmmca_getinfo (char *buf, int slot, void *dev_id) { struct Scsi_Host *shpnt; int len, speciale, connectore, k; unsigned int pos[8]; unsigned long flags; + struct Scsi_Host *dev = dev_id; IBMLOCK(dev) shpnt = dev; /* assign host-structure to local pointer */ diff --git a/drivers/scsi/imm.c b/drivers/scsi/imm.c index 792572fcf124..0f7024405595 100644 --- a/drivers/scsi/imm.c +++ b/drivers/scsi/imm.c @@ -199,6 +199,8 @@ int imm_detect(Scsi_Host_Template * host) continue; } + INIT_WORK(&imm_hosts[i].imm_tq, imm_interrupt, &imm_hosts[i]); + host->can_queue = IMM_CAN_QUEUE; host->sg_tablesize = imm_sg; hreg = scsi_register(host, 0); diff --git a/drivers/scsi/in2000.c b/drivers/scsi/in2000.c index 781a5775aa28..aae9d08fba04 100644 --- a/drivers/scsi/in2000.c +++ b/drivers/scsi/in2000.c @@ -832,7 +832,7 @@ int i; static void in2000_intr (int irqnum, void * dev_id, struct pt_regs *ptregs) { -struct Scsi_Host *instance; +struct Scsi_Host *instance = dev_id; struct IN2000_hostdata *hostdata; Scsi_Cmnd *patch, *cmd; uchar asr, sr, phs, id, lun, *ucp, msg; @@ -842,14 +842,6 @@ unsigned short *sp; unsigned short f; unsigned long flags; - for (instance = instance_list; instance; instance = instance->next) { - if (instance->irq == irqnum) - break; - } - if (!instance) { - printk("*** Hmm... interrupts are screwed up! ***\n"); - return; - } hostdata = (struct IN2000_hostdata *)instance->hostdata; /* Get the spin_lock and disable further ints, for SMP */ @@ -2046,7 +2038,7 @@ char buf[32]; write1_io(0,IO_FIFO_READ); /* start fifo out in read mode */ write1_io(0,IO_INTR_MASK); /* allow all ints */ x = int_tab[(switches & (SW_INT0 | SW_INT1)) >> SW_INT_SHIFT]; - if (request_irq(x, in2000_intr, SA_INTERRUPT, "in2000", NULL)) { + if (request_irq(x, in2000_intr, SA_INTERRUPT, "in2000", instance)) { printk("in2000_detect: Unable to allocate IRQ.\n"); detect_count--; continue; @@ -2163,6 +2155,15 @@ char buf[32]; return detect_count; } +static int in2000_release(struct Scsi_Host *shost) +{ + if (shost->irq) + free_irq(shost->irq, shost); + if (shost->io_port && shost->n_io_port) + release_region(shost->io_port, shost->n_io_port); + return 0; +} + /* NOTE: I lifted this function straight out of the old driver, * and have not tested it. Presumably it does what it's @@ -2215,10 +2216,7 @@ Scsi_Cmnd *cmd; int x,i; static int stop = 0; - for (instance=instance_list; instance; instance=instance->next) { - if (instance->host_no == hn) - break; - } + instance = scsi_host_hn_get(hn); if (!instance) { printk("*** Hmm... Can't find host #%d!\n",hn); return (-ESRCH); diff --git a/drivers/scsi/in2000.h b/drivers/scsi/in2000.h index d51298eaf8b0..88576d4722a3 100644 --- a/drivers/scsi/in2000.h +++ b/drivers/scsi/in2000.h @@ -417,6 +417,7 @@ static int in2000_device_reset(Scsi_Cmnd *); proc_info: in2000_proc_info, /* pointer to proc info function */ \ name: "Always IN2000", /* device name */ \ detect: in2000_detect, /* returns number of in2000's found */ \ + release: in2000_release, /* release the in2000 controller */ \ queuecommand: in2000_queuecommand, /* queue scsi command, don't wait */ \ eh_abort_handler: in2000_abort, /* abort current command */ \ eh_bus_reset_handler: in2000_bus_reset, /* reset scsi bus */ \ diff --git a/drivers/scsi/inia100.h b/drivers/scsi/inia100.h index 431c8adfff09..d8289e0357e4 100644 --- a/drivers/scsi/inia100.h +++ b/drivers/scsi/inia100.h @@ -85,10 +85,9 @@ extern int inia100_reset(Scsi_Cmnd *, unsigned int); extern int inia100_biosparam(Scsi_Disk *, struct block_device *, int *); -#define inia100_REVID "Initio INI-A100U2W SCSI device driver; Revision: 1.02c" +#define inia100_REVID "Initio INI-A100U2W SCSI device driver; Revision: 1.02d" #define INIA100 { \ - next: NULL, \ module: NULL, \ proc_name: "inia100", \ proc_info: NULL, \ diff --git a/drivers/scsi/mesh.c b/drivers/scsi/mesh.c index 3c617b7f26a4..28352f085c29 100644 --- a/drivers/scsi/mesh.c +++ b/drivers/scsi/mesh.c @@ -24,7 +24,6 @@ #include <linux/blk.h> #include <linux/proc_fs.h> #include <linux/stat.h> -#include <linux/tqueue.h> #include <linux/interrupt.h> #include <linux/reboot.h> #include <linux/spinlock.h> diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c index 26ce03f229c2..93f0b241787a 100644 --- a/drivers/scsi/ncr53c8xx.c +++ b/drivers/scsi/ncr53c8xx.c @@ -9125,16 +9125,11 @@ static int ncr53c8xx_proc_info(char *buffer, char **start, off_t offset, printk("ncr53c8xx_proc_info: hostno=%d, func=%d\n", hostno, func); #endif - for (host = first_host; host; host = host->next) { - if (host->hostt == the_template && host->host_no == hostno) { - host_data = (struct host_data *) host->hostdata; - ncb = host_data->ncb; - break; - } - } - - if (!ncb) + if((host = scsi_host_hn_get(hostno))==NULL) return -EINVAL; + + host_data = (struct host_data *) host->hostdata; + ncb = host_data->ncb; if (func) { #ifdef SCSI_NCR_USER_COMMAND_SUPPORT diff --git a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c index 08b40184c4b4..7515a8ef52a1 100644 --- a/drivers/scsi/nsp32.c +++ b/drivers/scsi/nsp32.c @@ -1575,11 +1575,9 @@ static int nsp32_proc_info(char *buffer, } /* search this HBA host */ - for (host=scsi_hostlist; host; host=host->next) { - if (host->host_no == hostno) { - break; - } - } + + host = scsi_host_hn_get(hostno); + if (host == NULL) { return -ESRCH; } diff --git a/drivers/scsi/pas16.c b/drivers/scsi/pas16.c index 5c347dc8edea..227e98d4fd8f 100644 --- a/drivers/scsi/pas16.c +++ b/drivers/scsi/pas16.c @@ -118,6 +118,7 @@ #include <linux/sched.h> #include <asm/io.h> #include <linux/blk.h> +#include <linux/delay.h> #include "scsi.h" #include "hosts.h" #include "pas16.h" @@ -450,7 +451,7 @@ int __init pas16_detect(Scsi_Host_Template * tpnt) instance->irq = NCR5380_probe_irq(instance, PAS16_IRQS); if (instance->irq != IRQ_NONE) - if (request_irq(instance->irq, do_pas16_intr, SA_INTERRUPT, "pas16", instance)) { + if (request_irq(instance->irq, pas16_intr, SA_INTERRUPT, "pas16", instance)) { printk("scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); instance->irq = IRQ_NONE; diff --git a/drivers/scsi/pas16.h b/drivers/scsi/pas16.h index 09d418bb31bd..6053efd379f2 100644 --- a/drivers/scsi/pas16.h +++ b/drivers/scsi/pas16.h @@ -114,14 +114,14 @@ #ifndef ASM -int pas16_abort(Scsi_Cmnd *); -int pas16_biosparam(Disk *, struct block_device *, int*); -int pas16_detect(Scsi_Host_Template *); -int pas16_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -int pas16_bus_reset(Scsi_Cmnd *); -int pas16_host_reset(Scsi_Cmnd *); -int pas16_device_reset(Scsi_Cmnd *); -int pas16_proc_info (char *buffer ,char **start, off_t offset, +static int pas16_abort(Scsi_Cmnd *); +static int pas16_biosparam(Disk *, struct block_device *, int*); +static int pas16_detect(Scsi_Host_Template *); +static int pas16_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); +static int pas16_bus_reset(Scsi_Cmnd *); +static int pas16_host_reset(Scsi_Cmnd *); +static int pas16_device_reset(Scsi_Cmnd *); +static int pas16_proc_info (char *buffer ,char **start, off_t offset, int length, int hostno, int inout); #ifndef NULL diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index 82916db1c391..17548ba0844e 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c @@ -1,8 +1,10 @@ /*====================================================================== - NinjaSCSI-3 / NinjaSCSI-32Bi PCMCIA SCSI hostadapter card driver + NinjaSCSI-3 / NinjaSCSI-32Bi PCMCIA SCSI host adapter card driver By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp> + Ver.2.8 Support 32bit MMIO mode + Support Synchronous Data TRansfer (SDTR) mode Ver.2.0 Support 32bit PIO mode Ver.1.1.2 Fix for scatter list buffer exceeds Ver.1.1 Support scatter list @@ -23,7 +25,7 @@ ***********************************************************************/ -/* $Id: nsp_cs.c,v 1.42 2001/09/10 10:30:58 elca Exp $ */ +/* $Id: nsp_cs.c,v 1.4 2002/10/15 15:57:01 elca Exp $ */ #ifdef NSP_KERNEL_2_2 #include <pcmcia/config.h> @@ -39,7 +41,6 @@ #include <linux/timer.h> #include <linux/ioport.h> #include <linux/delay.h> -#include <linux/tqueue.h> #include <linux/interrupt.h> #include <linux/module.h> #include <linux/major.h> @@ -51,7 +52,6 @@ #include <../drivers/scsi/scsi.h> #include <../drivers/scsi/hosts.h> -#include <../drivers/scsi/sd.h> #include <scsi/scsi.h> #include <scsi/scsi_ioctl.h> @@ -60,20 +60,24 @@ #include <pcmcia/cs_types.h> #include <pcmcia/cs.h> #include <pcmcia/cistpl.h> +#include <pcmcia/cisreg.h> #include <pcmcia/ds.h> +#include <pcmcia/bus_ops.h> #include "nsp_cs.h" MODULE_AUTHOR("YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>"); -MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module"); +MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module $Revision: 1.4 $"); MODULE_SUPPORTED_DEVICE("sd,sr,sg,st"); +#ifdef MODULE_LICENSE MODULE_LICENSE("GPL"); +#endif #ifdef PCMCIA_DEBUG static int pc_debug = PCMCIA_DEBUG; MODULE_PARM(pc_debug, "i"); MODULE_PARM_DESC(pc_debug, "set debug level"); -static char *version = "$Id: nsp_cs.c,v 1.42 2001/09/10 10:30:58 elca Exp $"; +static char *version = "$Id: nsp_cs.c,v 1.4 2002/10/15 15:57:01 elca Exp $"; #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args) #else #define DEBUG(n, args...) /* */ @@ -108,48 +112,56 @@ static struct proc_dir_entry proc_scsi_nsp = { static unsigned int irq_mask = 0xffff; MODULE_PARM(irq_mask, "i"); -MODULE_PARM_DESC(irq_mask, "IRQ mask bits"); +MODULE_PARM_DESC(irq_mask, "IRQ mask bits (default: 0xffff)"); static int irq_list[4] = { -1 }; MODULE_PARM(irq_list, "1-4i"); -MODULE_PARM_DESC(irq_list, "IRQ number list"); +MODULE_PARM_DESC(irq_list, "Use specified IRQ number. (default: auto select)"); -/*----------------------------------------------------------------*/ -/* driver state info, local to driver */ -static char nspinfo[100]; /* description */ +static int nsp_burst_mode = 2; +MODULE_PARM(nsp_burst_mode, "i"); +MODULE_PARM_DESC(nsp_burst_mode, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))"); + +/* Release IO ports after configuration? */ +static int free_ports = 0; +MODULE_PARM(free_ports, "i"); +MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))"); /* /usr/src/linux/drivers/scsi/hosts.h */ static Scsi_Host_Template driver_template = { -/* next: NULL,*/ -#if (KERNEL_VERSION(2,3,99) > LINUX_VERSION_CODE) - proc_dir: &proc_scsi_nsp, /* kernel 2.2 */ +/* .next = NULL,*/ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)) + .proc_name = "nsp_cs", /* kernel 2.4 */ #else - proc_name: "nsp_cs", /* kernel 2.4 */ + .proc_dir = &proc_scsi_nsp, /* kernel 2.2 */ #endif -/* proc_info: NULL,*/ - name: "WorkBit NinjaSCSI-3/32Bi", - detect: nsp_detect, - release: nsp_release, - info: nsp_info, -/* command: NULL,*/ - queuecommand: nsp_queuecommand, -/* eh_strategy_handler: nsp_eh_strategy,*/ - eh_abort_handler: nsp_eh_abort, - eh_device_reset_handler: nsp_eh_device_reset, - eh_bus_reset_handler: nsp_eh_bus_reset, - eh_host_reset_handler: nsp_eh_host_reset, - abort: nsp_abort, - reset: nsp_reset, -/* slave_attach: NULL,*/ -/* bios_param: NULL,*/ - can_queue: 1, - this_id: SCSI_INITIATOR_ID, - sg_tablesize: SG_ALL, - cmd_per_lun: 1, -/* present: 0,*/ -/* unchecked_isa_dma: 0,*/ - use_clustering: DISABLE_CLUSTERING, -/* emulated: 0,*/ + .proc_info = nsp_proc_info, + .name = "WorkBit NinjaSCSI-3/32Bi", + .detect = nsp_detect, + .release = nsp_release, + .info = nsp_info, +/* .command = NULL,*/ + .queuecommand = nsp_queuecommand, +/* .eh_strategy_handler = nsp_eh_strategy,*/ +/* .eh_abort_handler = nsp_eh_abort,*/ +/* .eh_device_reset_handler = nsp_eh_device_reset,*/ + .eh_bus_reset_handler = nsp_eh_bus_reset, + .eh_host_reset_handler = nsp_eh_host_reset, + .abort = nsp_abort, + .reset = nsp_reset, +/* .slave_attach = NULL,*/ +/* .bios_param = NULL,*/ + .can_queue = 1, + .this_id = NSP_INITIATOR_ID, + .sg_tablesize = SG_ALL, + .cmd_per_lun = 1, +/* .present = 0,*/ +/* .unchecked_isa_dma = 0,*/ + .use_clustering = DISABLE_CLUSTERING, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,2)) + .use_new_eh_code = 1, +#endif +/* .emulated = 0,*/ }; static dev_link_t *dev_list = NULL; @@ -162,18 +174,18 @@ static nsp_hw_data nsp_data; static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) { #ifdef PCMCIA_DEBUG - //unsigned int host_id = SCpnt->host->this_id; - //unsigned int base = SCpnt->host->io_port; + /*unsigned int host_id = SCpnt->host->this_id;*/ + /*unsigned int base = SCpnt->host->io_port;*/ unsigned char target = SCpnt->target; #endif nsp_hw_data *data = &nsp_data; - DEBUG(0, __FUNCTION__ "() SCpnt=0x%p target=%d lun=%d buff=0x%p bufflen=%d use_sg=%d\n", - SCpnt, target, SCpnt->lun, SCpnt->request_buffer, SCpnt->request_bufflen, SCpnt->use_sg); + DEBUG(0, "%s() SCpnt=0x%p target=%d lun=%d buff=0x%p bufflen=%d use_sg=%d\n", + __FUNCTION__, SCpnt, target, SCpnt->lun, SCpnt->request_buffer, SCpnt->request_bufflen, SCpnt->use_sg); //DEBUG(0, " before CurrentSC=0x%p\n", data->CurrentSC); if(data->CurrentSC != NULL) { - printk(KERN_DEBUG " " __FUNCTION__ "() CurrentSC!=NULL this can't be happen\n"); + printk(KERN_DEBUG " %s() CurrentSC!=NULL cannot happen!\n", __FUNCTION__); data->CurrentSC = NULL; SCpnt->result = DID_BAD_TARGET << 16; done(SCpnt); @@ -184,13 +196,13 @@ static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) SCpnt->scsi_done = done; data->CurrentSC = SCpnt; - RESID = SCpnt->request_bufflen; - SCpnt->SCp.Status = -1; - SCpnt->SCp.Message = -1; + SCpnt->SCp.Status = CHECK_CONDITION; + SCpnt->SCp.Message = 0; SCpnt->SCp.have_data_in = IO_UNKNOWN; SCpnt->SCp.sent_command = 0; SCpnt->SCp.phase = PH_UNDETERMINED; + RESID = SCpnt->request_bufflen; /* setup scratch area SCp.ptr : buffer pointer @@ -200,7 +212,7 @@ static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) SCp.phase : current state of the command */ if (SCpnt->use_sg) { SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->request_buffer; - SCpnt->SCp.ptr = SCpnt->SCp.buffer->address; + SCpnt->SCp.ptr = BUFFER_ADDR; SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1; } else { @@ -219,7 +231,7 @@ static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) } - //DEBUG(0, __FUNCTION__ "() out\n"); + //DEBUG(0, __func__ "() out\n"); return 0; } @@ -231,7 +243,7 @@ static void nsp_setup_fifo(nsp_hw_data *data, int enabled) unsigned int base = data->BaseAddress; unsigned char transfer_mode_reg; - //DEBUG(0, __FUNCTION__ "() enabled=%d\n", enabled); + //DEBUG(0, __func__ "() enabled=%d\n", enabled); if (enabled != FALSE) { transfer_mode_reg = TRANSFER_GO | BRAIND; @@ -244,31 +256,35 @@ static void nsp_setup_fifo(nsp_hw_data *data, int enabled) nsp_index_write(base, TRANSFERMODE, transfer_mode_reg); } +static void nsphw_init_sync(nsp_hw_data *data) +{ + sync_data tmp_sync = { .SyncNegotiation = SYNC_NOT_YET, + .SyncPeriod = 0, + .SyncOffset = 0 + }; + int i; + + /* setup sync data */ + for ( i = 0; i < N_TARGET; i++ ) { + data->Sync[i] = tmp_sync; + } +} + /* * Initialize Ninja hardware */ static int nsphw_init(nsp_hw_data *data) { unsigned int base = data->BaseAddress; - int i, j; - sync_data tmp_sync = { SyncNegotiation: SYNC_NOT_YET, - SyncPeriod: 0, - SyncOffset: 0 - }; - DEBUG(0, __FUNCTION__ "() in base=0x%x\n", base); + DEBUG(0, "%s() in base=0x%x\n", __FUNCTION__, base); - data->ScsiClockDiv = CLOCK_40M; + data->ScsiClockDiv = CLOCK_40M | FAST_20; data->CurrentSC = NULL; data->FifoCount = 0; data->TransferMode = MODE_IO8; - /* setup sync data */ - for ( i = 0; i < N_TARGET; i++ ) { - for ( j = 0; j < N_LUN; j++ ) { - data->Sync[i][j] = tmp_sync; - } - } + nsphw_init_sync(data); /* block all interrupts */ nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK); @@ -321,10 +337,10 @@ static unsigned int nsphw_start_selection(Scsi_Cmnd *SCpnt, unsigned int host_id = SCpnt->host->this_id; unsigned int base = SCpnt->host->io_port; unsigned char target = SCpnt->target; - int wait_count; + int time_out; unsigned char phase, arbit; - //DEBUG(0, __FUNCTION__ "()in\n"); + //DEBUG(0, __func__ "()in\n"); phase = nsp_index_read(base, SCSIBUSMON); if(phase != BUSMON_BUS_FREE) { @@ -337,14 +353,14 @@ static unsigned int nsphw_start_selection(Scsi_Cmnd *SCpnt, SCpnt->SCp.phase = PH_ARBSTART; nsp_index_write(base, SETARBIT, ARBIT_GO); - wait_count = jiffies + 10 * HZ; + time_out = 1000; do { /* XXX: what a stupid chip! */ arbit = nsp_index_read(base, ARBITSTATUS); //DEBUG(0, " arbit=%d, wait_count=%d\n", arbit, wait_count); udelay(1); /* hold 1.2us */ } while((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 && - time_before(jiffies, wait_count)); + (time_out-- != 0)); if((arbit & ARBIT_WIN) == 0) { //DEBUG(0, " arbit fail\n"); @@ -356,13 +372,13 @@ static unsigned int nsphw_start_selection(Scsi_Cmnd *SCpnt, //DEBUG(0, " assert SEL line\n"); SCpnt->SCp.phase = PH_SELSTART; udelay(3); - nsp_index_write(base, SCSIDATALATCH, (1 << host_id) | (1 << target)); - nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN); + nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target)); + nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN); udelay(3); nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_DATAOUT_ENB | SCSI_ATN); nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR); udelay(3); - nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_DATAOUT_ENB | SCSI_ATN); + nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_DATAOUT_ENB | SCSI_ATN); /* check selection timeout */ nsp_start_timer(SCpnt, data, 1000/51); @@ -399,23 +415,21 @@ static struct nsp_sync_table nsp_sync_table_20M[] = { static int nsp_msg(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { unsigned char target = SCpnt->target; - unsigned char lun = SCpnt->lun; - sync_data *sync = &(data->Sync[target][lun]); +// unsigned char lun = SCpnt->lun; + sync_data *sync = &(data->Sync[target]); struct nsp_sync_table *sync_table; unsigned int period, offset; int i; - DEBUG(0, __FUNCTION__ "()\n"); - -/**!**/ + DEBUG(0, "%s()\n", __FUNCTION__); period = sync->SyncPeriod; offset = sync->SyncOffset; DEBUG(0, " period=0x%x, offset=0x%x\n", period, offset); - if (data->ScsiClockDiv == CLOCK_20M) { + if ((data->ScsiClockDiv & (BIT(0)|BIT(1))) == CLOCK_20M) { sync_table = &nsp_sync_table_20M[0]; } else { sync_table = &nsp_sync_table_40M[0]; @@ -438,7 +452,6 @@ static int nsp_msg(Scsi_Cmnd *SCpnt, nsp_hw_data *data) sync->SyncOffset = 0; sync->SyncRegister = 0; sync->AckWidth = 0; - sync->SyncNegotiation = SYNC_OK; return FALSE; } @@ -446,7 +459,6 @@ static int nsp_msg(Scsi_Cmnd *SCpnt, nsp_hw_data *data) sync->SyncRegister = (sync_table->chip_period << SYNCREG_PERIOD_SHIFT) | (offset & SYNCREG_OFFSET_MASK); sync->AckWidth = sync_table->ack_width; - sync->SyncNegotiation = SYNC_OK; DEBUG(0, " sync_reg=0x%x, ack_width=0x%x\n", sync->SyncRegister, sync->AckWidth); @@ -461,7 +473,7 @@ static void nsp_start_timer(Scsi_Cmnd *SCpnt, nsp_hw_data *data, int time) { unsigned int base = SCpnt->host->io_port; - //DEBUG(0, __FUNCTION__ "() in SCpnt=0x%p, time=%d\n", SCpnt, time); + //DEBUG(0, __func__ "() in SCpnt=0x%p, time=%d\n", SCpnt, time); data->TimerCount = time; nsp_index_write(base, TIMERCOUNT, time); } @@ -473,21 +485,21 @@ static int nsp_negate_signal(Scsi_Cmnd *SCpnt, unsigned char mask, char *str) { unsigned int base = SCpnt->host->io_port; unsigned char reg; - int count, i = TRUE; + int time_out; - //DEBUG(0, __FUNCTION__ "()\n"); + //DEBUG(0, __func__ "()\n"); - count = jiffies + HZ; + time_out = 100; do { reg = nsp_index_read(base, SCSIBUSMON); if (reg == 0xff) { break; } - } while ((i = time_before(jiffies, count)) && (reg & mask) != 0); + } while ((time_out-- != 0) && (reg & mask) != 0); - if (!i) { - printk(KERN_DEBUG __FUNCTION__ " %s signal off timeut\n", str); + if (time_out == 0) { + printk(KERN_DEBUG "%s: %s signal off timeut\n", __FUNCTION__, str); } return 0; @@ -501,12 +513,12 @@ static int nsp_expect_signal(Scsi_Cmnd *SCpnt, unsigned char mask) { unsigned int base = SCpnt->host->io_port; - int wait_count; + int time_out; unsigned char phase, i_src; - //DEBUG(0, __FUNCTION__ "() current_phase=0x%x, mask=0x%x\n", current_phase, mask); + //DEBUG(0, __func__ "() current_phase=0x%x, mask=0x%x\n", current_phase, mask); - wait_count = jiffies + HZ; + time_out = 100; do { phase = nsp_index_read(base, SCSIBUSMON); if (phase == 0xff) { @@ -522,9 +534,9 @@ static int nsp_expect_signal(Scsi_Cmnd *SCpnt, //DEBUG(0, " ret 1 phase=0x%x\n", phase); return 1; } - } while(time_before(jiffies, wait_count)); + } while(time_out-- != 0); - //DEBUG(0, __FUNCTION__ " : " __FUNCTION__ " timeout\n"); + //DEBUG(0, __func__ " : " __func__ " timeout\n"); return -1; } @@ -539,7 +551,7 @@ static int nsp_xfer(Scsi_Cmnd *SCpnt, nsp_hw_data *data, int phase) int ptr; int ret; - //DEBUG(0, __FUNCTION__ "()\n"); + //DEBUG(0, __func__ "()\n"); for (ptr = 0; len > 0; len --, ptr ++) { ret = nsp_expect_signal(SCpnt, phase, BUSMON_REQ); @@ -574,7 +586,7 @@ static int nsp_dataphase_bypass(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { unsigned int count; - //DEBUG(0, __FUNCTION__ "()\n"); + //DEBUG(0, __func__ "()\n"); if (SCpnt->SCp.have_data_in != IO_IN) { return 0; @@ -590,11 +602,11 @@ static int nsp_dataphase_bypass(Scsi_Cmnd *SCpnt, nsp_hw_data *data) * XXX: NSP_QUIRK * data phase skip only occures in case of SCSI_LOW_READ */ + DEBUG(0, " use bypass quirk\n"); SCpnt->SCp.phase = PH_DATA; nsp_pio_read(SCpnt, data); nsp_setup_fifo(data, FALSE); - DEBUG(0, " use bypass quirk\n"); return 0; } @@ -606,7 +618,7 @@ static int nsp_reselected(Scsi_Cmnd *SCpnt, nsp_hw_data *data) unsigned int base = SCpnt->host->io_port; unsigned char reg; - //DEBUG(0, __FUNCTION__ "()\n"); + //DEBUG(0, __func__ "()\n"); nsp_negate_signal(SCpnt, BUSMON_SEL, "reselect<SEL>"); @@ -625,17 +637,18 @@ static int nsp_fifo_count(Scsi_Cmnd *SCpnt) { unsigned int base = SCpnt->host->io_port; unsigned int count; - unsigned int l, m, h; + unsigned int l, m, h, dummy; - nsp_index_write(base, POINTERCLR, POINTER_CLEAR); + nsp_index_write(base, POINTERCLR, POINTER_CLEAR | ACK_COUNTER); - l = (unsigned int)nsp_read(base, DATAREG); - m = (unsigned int)nsp_read(base, DATAREG); - h = (unsigned int)nsp_read(base, DATAREG); + l = nsp_index_read(base, TRANSFERCOUNT); + m = nsp_index_read(base, TRANSFERCOUNT); + h = nsp_index_read(base, TRANSFERCOUNT); + dummy = nsp_index_read(base, TRANSFERCOUNT); count = (h << 16) | (m << 8) | (l << 0); - //DEBUG(0, __FUNCTION__ "() =0x%x\n", count); + //DEBUG(0, __func__ "() =0x%x\n", count); return count; } @@ -649,25 +662,27 @@ static int nsp_fifo_count(Scsi_Cmnd *SCpnt) */ static void nsp_pio_read(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { - unsigned int base = SCpnt->host->io_port; - int time_out, i; + unsigned int base = SCpnt->host->io_port; + unsigned long mmio_base = SCpnt->host->base; + long time_out; int ocount, res; unsigned char stat, fifo_stat; ocount = data->FifoCount; - DEBUG(0, __FUNCTION__ "() in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d\n", SCpnt, RESID, ocount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual); + DEBUG(0, "%s() in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d\n", + __FUNCTION__, SCpnt, RESID, ocount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual); - time_out = jiffies + 10 * HZ; + time_out = 1000; - while ((i = time_before(jiffies,time_out)) && + while ((time_out-- != 0) && (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0 ) ) { stat = nsp_index_read(base, SCSIBUSMON); stat &= BUSMON_PHASE_MASK; - res = nsp_fifo_count(SCpnt) - ocount; + res = nsp_fifo_count(SCpnt) - ocount; //DEBUG(0, " ptr=0x%p this=0x%x ocount=0x%x res=0x%x\n", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount, res); if (res == 0) { /* if some data avilable ? */ if (stat == BUSPHASE_DATA_IN) { /* phase changed? */ @@ -695,9 +710,15 @@ static void nsp_pio_read(Scsi_Cmnd *SCpnt, nsp_hw_data *data) case MODE_IO8: nsp_fifo8_read (base, SCpnt->SCp.ptr, res ); break; + + case MODE_MEM32: + res &= ~(BIT(1)|BIT(0)); /* align 4 */ + nsp_mmio_fifo32_read(mmio_base, SCpnt->SCp.ptr, res >> 2); + break; + default: DEBUG(0, "unknown read mode\n"); - break; + return; } RESID -= res; @@ -712,17 +733,19 @@ static void nsp_pio_read(Scsi_Cmnd *SCpnt, nsp_hw_data *data) //DEBUG(0, " scatterlist next timeout=%d\n", time_out); SCpnt->SCp.buffers_residual--; SCpnt->SCp.buffer++; - SCpnt->SCp.ptr = SCpnt->SCp.buffer->address; + SCpnt->SCp.ptr = BUFFER_ADDR; SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; - } + time_out = 1000; - time_out = jiffies + 10 * HZ; + //DEBUG(0, "page: 0x%p, off: 0x%x\n", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset); + } } data->FifoCount = ocount; - if (!i) { - printk(KERN_DEBUG __FUNCTION__ "() pio read timeout resid=%d this_residual=%d buffers_residual=%d\n", RESID, SCpnt->SCp.this_residual, SCpnt->SCp.buffers_residual); + if (time_out == 0) { + printk(KERN_DEBUG "%s() pio read timeout resid=%d this_residual=%d buffers_residual=%d\n", + __FUNCTION__, RESID, SCpnt->SCp.this_residual, SCpnt->SCp.buffers_residual); } DEBUG(0, " read ocount=0x%x\n", ocount); } @@ -733,22 +756,32 @@ static void nsp_pio_read(Scsi_Cmnd *SCpnt, nsp_hw_data *data) static void nsp_pio_write(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { unsigned int base = SCpnt->host->io_port; - int time_out, i; - unsigned int ocount, res; + unsigned long mmio_base = SCpnt->host->base; + int time_out; + int ocount, res; unsigned char stat; ocount = data->FifoCount; - DEBUG(0, __FUNCTION__ "() in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x\n", data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual, RESID); + DEBUG(0, "%s() in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x\n", __FUNCTION__, data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual, RESID); - time_out = jiffies + 10 * HZ; + time_out = 1000; - while ((i = time_before(jiffies, time_out)) && + while ((time_out-- != 0) && (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0)) { stat = nsp_index_read(base, SCSIBUSMON); stat &= BUSMON_PHASE_MASK; + if (stat != BUSPHASE_DATA_OUT) { - DEBUG(0, " phase changed stat=0x%x\n", stat); + res = ocount - nsp_fifo_count(SCpnt); + + DEBUG(0, " phase changed stat=0x%x, res=%d\n", stat, res); + /* Put back pointer */ + RESID += res; + SCpnt->SCp.ptr -= res; + SCpnt->SCp.this_residual += res; + ocount -= res; + break; } @@ -769,6 +802,12 @@ static void nsp_pio_write(Scsi_Cmnd *SCpnt, nsp_hw_data *data) case MODE_IO8: nsp_fifo8_write (base, SCpnt->SCp.ptr, res ); break; + + case MODE_MEM32: + res &= ~(BIT(1)|BIT(0)); /* align 4 */ + nsp_mmio_fifo32_write(mmio_base, SCpnt->SCp.ptr, res >> 2); + break; + default: DEBUG(0, "unknown write mode\n"); break; @@ -785,19 +824,18 @@ static void nsp_pio_write(Scsi_Cmnd *SCpnt, nsp_hw_data *data) //DEBUG(0, " scatterlist next\n"); SCpnt->SCp.buffers_residual--; SCpnt->SCp.buffer++; - SCpnt->SCp.ptr = SCpnt->SCp.buffer->address; + SCpnt->SCp.ptr = BUFFER_ADDR; SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; + time_out = 1000; } - - time_out = jiffies + 10 * HZ; } data->FifoCount = ocount; - if (!i) { - printk(KERN_DEBUG __FUNCTION__ "() pio write timeout resid=%d\n", RESID); + if (time_out == 0) { + printk(KERN_DEBUG "%s() pio write timeout resid=0x%x\n", __FUNCTION__, RESID); } - //DEBUG(0, " write ocount=%d\n", ocount); + DEBUG(0, " write ocount=0x%x\n", ocount); } #undef RFIFO_CRIT @@ -810,20 +848,25 @@ static int nsp_nexus(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { unsigned int base = SCpnt->host->io_port; unsigned char target = SCpnt->target; - unsigned char lun = SCpnt->lun; - sync_data *sync = &(data->Sync[target][lun]); +// unsigned char lun = SCpnt->lun; + sync_data *sync = &(data->Sync[target]); - //DEBUG(0, __FUNCTION__ "() in SCpnt=0x%p\n", SCpnt); + //DEBUG(0, __func__ "() in SCpnt=0x%p\n", SCpnt); /* setup synch transfer registers */ nsp_index_write(base, SYNCREG, sync->SyncRegister); nsp_index_write(base, ACKWIDTH, sync->AckWidth); - if (RESID % 4 != 0 || - RESID <= 256 ) { + if (SCpnt->use_sg == 0 || + RESID % 4 != 0 || + RESID <= PAGE_SIZE ) { data->TransferMode = MODE_IO8; - } else { + } else if (nsp_burst_mode == BURST_MEM32) { + data->TransferMode = MODE_MEM32; + } else if (nsp_burst_mode == BURST_IO32) { data->TransferMode = MODE_IO32; + } else { + data->TransferMode = MODE_IO8; } /* setup pdma fifo */ @@ -848,24 +891,13 @@ static void nspintr(int irq, void *dev_id, struct pt_regs *regs) unsigned int base; unsigned char i_src, irq_phase, phase; Scsi_Cmnd *tmpSC; - int len; unsigned char target, lun; unsigned int *sync_neg; int i, tmp; - nsp_hw_data *data; + nsp_hw_data *data = dev_id; //printk("&nsp_data=0x%p, dev_id=0x%p\n", &nsp_data, dev_id); - /* sanity check */ - if (&nsp_data != dev_id) { - DEBUG(0, " irq conflict? this can't happen\n"); - return; - } - data = dev_id; - if (irq != data->IrqNumber) { - return; - } - base = data->BaseAddress; //DEBUG(0, " base=0x%x\n", base); @@ -874,13 +906,13 @@ static void nspintr(int irq, void *dev_id, struct pt_regs *regs) */ nsp_write(base, IRQCONTROL, IRQCONTROL_IRQDISABLE); i_src = nsp_read(base, IRQSTATUS); - if (i_src == 0xff || (i_src & IRQSTATUS_MASK) == 0) { + //DEBUG(0, " i_src=0x%x\n", i_src); + if ((i_src == 0xff) || ((i_src & IRQSTATUS_MASK) == 0)) { nsp_write(base, IRQCONTROL, 0); - //DEBUG(0, " no irq\n"); + //DEBUG(0, " no irq/shared irq\n"); return; } - //DEBUG(0, " i_src=0x%x\n", i_src); /* XXX: IMPORTANT * Do not read an irq_phase register if no scsi phase interrupt. @@ -916,13 +948,13 @@ static void nspintr(int irq, void *dev_id, struct pt_regs *regs) nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR | IRQCONTROL_FIFO_CLEAR); if (data->CurrentSC == NULL) { - printk(KERN_DEBUG __FUNCTION__ " CurrentSC==NULL irq_status=0x%x phase=0x%x irq_phase=0x%x this can't be happen\n", i_src, phase, irq_phase); + printk(KERN_DEBUG "%s: CurrentSC==NULL irq_status=0x%x phase=0x%x irq_phase=0x%x cannot happen\n", __FUNCTION__, i_src, phase, irq_phase); return; } else { tmpSC = data->CurrentSC; target = tmpSC->target; lun = tmpSC->lun; - sync_neg = &(data->Sync[target][lun].SyncNegotiation); + sync_neg = &(data->Sync[target].SyncNegotiation); } /* @@ -930,10 +962,12 @@ static void nspintr(int irq, void *dev_id, struct pt_regs *regs) */ if ((i_src & IRQSTATUS_SCSI) != 0) { if ((irq_phase & SCSI_RESET_IRQ) != 0) { - printk(KERN_DEBUG " " __FUNCTION__ "() bus reset (power off?)\n"); + printk(KERN_DEBUG " %s() bus reset (power off?)\n", __FUNCTION__); *sync_neg = SYNC_NOT_YET; data->CurrentSC = NULL; - tmpSC->result = DID_RESET << 16; + tmpSC->result = (DID_RESET << 16) | + ((tmpSC->SCp.Message & 0xff) << 8) | + ((tmpSC->SCp.Status & 0xff) << 0); tmpSC->scsi_done(tmpSC); return; } @@ -955,7 +989,7 @@ static void nspintr(int irq, void *dev_id, struct pt_regs *regs) switch(tmpSC->SCp.phase) { case PH_SELSTART: - *sync_neg = SYNC_NOT_YET; + //*sync_neg = SYNC_NOT_YET; if ((phase & BUSMON_BSY) == 0) { //DEBUG(0, " selection count=%d\n", data->SelectionTimeOut); if (data->SelectionTimeOut >= NSP_SELTIMEOUT) { @@ -987,7 +1021,7 @@ static void nspintr(int irq, void *dev_id, struct pt_regs *regs) case PH_RESELECT: //DEBUG(0, " phase reselect\n"); - *sync_neg = SYNC_NOT_YET; + //*sync_neg = SYNC_NOT_YET; if ((phase & BUSMON_PHASE_MASK) != BUSPHASE_MESSAGE_IN) { data->CurrentSC = NULL; @@ -1009,16 +1043,18 @@ static void nspintr(int irq, void *dev_id, struct pt_regs *regs) //DEBUG(0, " start scsi seq\n"); /* normal disconnect */ - if ((irq_phase & LATCHED_BUS_FREE) != 0) { - //DEBUG(0, " normal disconnect i_src=0x%x, phase=0x%x, irq_phase=0x%x\n", i_src, phase, irq_phase); + if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) && + (irq_phase & LATCHED_BUS_FREE) != 0 ) { + DEBUG(0, " normal disconnect i_src=0x%x, phase=0x%x, irq_phase=0x%x\n", i_src, phase, irq_phase); if ((tmpSC->SCp.Message == MSG_COMMAND_COMPLETE)) { /* all command complete and return status */ - *sync_neg = SYNC_NOT_YET; + //*sync_neg = SYNC_NOT_YET; data->CurrentSC = NULL; - tmpSC->result = (DID_OK << 16) | - (tmpSC->SCp.Message << 8) | - (tmpSC->SCp.Status << 0); + tmpSC->result = (DID_OK << 16) | + ((tmpSC->SCp.Message & 0xff) << 8) | + ((tmpSC->SCp.Status & 0xff) << 0); DEBUG(0, " command complete result=0x%x\n", tmpSC->result); tmpSC->scsi_done(tmpSC); + return; } @@ -1028,7 +1064,7 @@ static void nspintr(int irq, void *dev_id, struct pt_regs *regs) /* check unexpected bus free state */ if (phase == 0) { - printk(KERN_DEBUG " " __FUNCTION__ " unexpected bus free. i_src=0x%x, phase=0x%x, irq_phase=0x%x\n", i_src, phase, irq_phase); + printk(KERN_DEBUG "%s: unexpected bus free. i_src=0x%x, phase=0x%x, irq_phase=0x%x\n", __FUNCTION__, i_src, phase, irq_phase); *sync_neg = SYNC_NOT_YET; data->CurrentSC = NULL; @@ -1050,9 +1086,10 @@ static void nspintr(int irq, void *dev_id, struct pt_regs *regs) nsp_nexus(tmpSC, data); /* write scsi command */ + DEBUG(0, " cmd_len=%d\n", tmpSC->cmd_len); nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER); - for (len = 0; len < COMMAND_SIZE(tmpSC->cmnd[0]); len++) { - nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[len]); + for (i = 0; i < tmpSC->cmd_len; i++) { + nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[i]); } nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER | AUTO_COMMAND_GO); break; @@ -1084,7 +1121,7 @@ static void nspintr(int irq, void *dev_id, struct pt_regs *regs) tmpSC->SCp.phase = PH_STATUS; tmpSC->SCp.Status = nsp_index_read(base, SCSIDATAWITHACK); - //DEBUG(0, " message=0x%x status=0x%x\n", tmpSC->SCp.Message, tmpSC->SCp.Status); + DEBUG(0, " message=0x%x status=0x%x\n", tmpSC->SCp.Message, tmpSC->SCp.Status); break; @@ -1096,26 +1133,24 @@ static void nspintr(int irq, void *dev_id, struct pt_regs *regs) tmpSC->SCp.phase = PH_MSG_OUT; - data->MsgLen = len = 0; - if (*sync_neg == SYNC_NOT_YET) { - data->Sync[target][lun].SyncPeriod = 0; - data->Sync[target][lun].SyncOffset = 0; - nsp_msg(tmpSC, data); + data->MsgLen = i = 0; + data->MsgBuffer[i] = IDENTIFY(TRUE, lun); i++; - data->MsgBuffer[len] = IDENTIFY(TRUE, lun); len++; - /* - data->MsgBuffer[len] = MSG_EXTENDED; len++; - data->MsgBuffer[len] = 3; len++; - data->MsgBuffer[len] = MSG_EXT_SDTR; len++; - data->MsgBuffer[len] = 0x0c; len++; - data->MsgBuffer[len] = 15; len++; - */ - } - if (len == 0) { - data->MsgBuffer[len] = MSG_NO_OPERATION; len++; + if (*sync_neg == SYNC_NOT_YET) { + data->Sync[target].SyncPeriod = 0; + data->Sync[target].SyncOffset = 0; + + /**/ + data->MsgBuffer[i] = MSG_EXTENDED; i++; + data->MsgBuffer[i] = 3; i++; + data->MsgBuffer[i] = MSG_EXT_SDTR; i++; + data->MsgBuffer[i] = 0x0c; i++; + data->MsgBuffer[i] = 15; i++; + /**/ } - data->MsgLen = len; + data->MsgLen = i; + nsp_msg(tmpSC, data); show_message(data); nsp_message_out(tmpSC, data); break; @@ -1130,16 +1165,26 @@ static void nspintr(int irq, void *dev_id, struct pt_regs *regs) tmpSC->SCp.phase = PH_MSG_IN; nsp_message_in(tmpSC, data); - /* - if (data->MsgLen >= 5 && - data->MsgBuffer[0] == MSG_EXTENDED && - data->MsgBuffer[1] == 3 && - data->MsgBuffer[2] == MSG_EXT_SDTR ) { - data->Sync[target][lun].SyncPeriod = data->MsgBuffer[3]; - data->Sync[target][lun].SyncOffset = data->MsgBuffer[4]; + /**/ + if (*sync_neg == SYNC_NOT_YET) { + //printk("%d,%d\n",target,lun); + + if (data->MsgLen >= 5 && + data->MsgBuffer[0] == MSG_EXTENDED && + data->MsgBuffer[1] == 3 && + data->MsgBuffer[2] == MSG_EXT_SDTR ) { + data->Sync[target].SyncPeriod = data->MsgBuffer[3]; + data->Sync[target].SyncOffset = data->MsgBuffer[4]; + //printk("sync ok, %d %d\n", data->MsgBuffer[3], data->MsgBuffer[4]); + *sync_neg = SYNC_OK; + } else { + data->Sync[target].SyncPeriod = 0; + data->Sync[target].SyncOffset = 0; + *sync_neg = SYNC_NG; + } nsp_msg(tmpSC, data); } - */ + /**/ /* search last messeage byte */ tmp = -1; @@ -1163,7 +1208,7 @@ static void nspintr(int irq, void *dev_id, struct pt_regs *regs) break; } - //DEBUG(0, __FUNCTION__ "() out\n"); + //DEBUG(0, __func__ "() out\n"); return; timer_out: @@ -1183,41 +1228,52 @@ static int nsp_detect(Scsi_Host_Template *sht) struct Scsi_Host *host; /* registered host structure */ nsp_hw_data *data = &nsp_data; - DEBUG(0, __FUNCTION__ " this_id=%d\n", sht->this_id); + DEBUG(0, "%s: this_id=%d\n", __FUNCTION__, sht->this_id); request_region(data->BaseAddress, data->NumAddress, "nsp_cs"); host = scsi_register(sht, 0); - host->io_port = data->BaseAddress; host->unique_id = data->BaseAddress; + host->io_port = data->BaseAddress; host->n_io_port = data->NumAddress; host->irq = data->IrqNumber; - host->dma_channel = 0xff; /* not use dms */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)) + host->base = data->MmioAddress; /* kernel 2.4 */ +#else + host->base = (char *)(data->MmioAddress); /* 2.2 */ +#endif + + spin_lock_init(&(data->Lock)); + + snprintf(data->nspinfo, + sizeof(data->nspinfo), + "NinjaSCSI-3/32Bi Driver $Revision: 1.4 $ IO:0x%04lx-0x%04lx MMIO(virt addr):0x%04lx IRQ:%02d", + host->io_port, host->io_port + host->n_io_port - 1, + host->base, + host->irq); + data->nspinfo[sizeof(data->nspinfo) - 1] = '\0'; + sht->name = data->nspinfo; - sprintf(nspinfo, -/* Buffer size is 100 bytes */ -/* 0 1 2 3 4 5 6 7 8 9 0*/ -/* 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890*/ - "NinjaSCSI-3/32Bi Driver $Revision: 1.42 $, I/O 0x%04lx-0x%04lx IRQ %2d", - host->io_port, host->io_port + host->n_io_port, - host->irq); - sht->name = nspinfo; + DEBUG(0, "%s: end\n", __FUNCTION__); - DEBUG(0, __FUNCTION__ " end\n"); + //MOD_INC_USE_COUNT; return 1; /* detect done. */ } -/* nsp_cs requires own release handler because its uses dev_id (=data) */ static int nsp_release(struct Scsi_Host *shpnt) { - nsp_hw_data *data = &nsp_data; + //nsp_hw_data *data = &nsp_data; + + /* PCMCIA Card Service dose same things */ + //if (shpnt->irq) { + // free_irq(shpnt->irq, data); + //} + //if (shpnt->io_port) { + // release_region(shpnt->io_port, shpnt->n_io_port); + //} + + //MOD_DEC_USE_COUNT; - if (shpnt->irq) { - free_irq(shpnt->irq, data); - } - if (shpnt->io_port && shpnt->n_io_port) { - release_region(shpnt->io_port, shpnt->n_io_port); - } return 0; } @@ -1226,25 +1282,152 @@ static int nsp_release(struct Scsi_Host *shpnt) /*----------------------------------------------------------------*/ static const char *nsp_info(struct Scsi_Host *shpnt) { - return nspinfo; + nsp_hw_data *data = &nsp_data; + + return data->nspinfo; +} + +#undef SPRINTF +#define SPRINTF(args...) \ + do { if(pos < buffer + length) pos += sprintf(pos, ## args); } while(0) +static int nsp_proc_info(char *buffer, + char **start, + off_t offset, + int length, + int hostno, + int inout) +{ + int id; + char *pos = buffer; + int thislength; + int speed; + unsigned long flags; + nsp_hw_data *data = &nsp_data; + struct Scsi_Host *host; + + if (inout) { + return -EINVAL; + } + + host = scsi_host_hn_get(hostno); + + SPRINTF("NinjaSCSI status\n\n"); + SPRINTF("Driver version: $Revision: 1.4 $\n"); + SPRINTF("SCSI host No.: %d\n", hostno); + SPRINTF("IRQ: %d\n", host->irq); + SPRINTF("IO: 0x%lx-0x%lx\n", host->io_port, host->io_port + host->n_io_port - 1); + SPRINTF("MMIO(virtual address): 0x%lx\n", host->base); + SPRINTF("sg_tablesize: %d\n", host->sg_tablesize); + + SPRINTF("burst transfer mode: "); + switch (nsp_burst_mode) { + case BURST_IO8: + SPRINTF("io8"); + break; + case BURST_IO32: + SPRINTF("io32"); + break; + case BURST_MEM32: + SPRINTF("mem32"); + break; + default: + SPRINTF("???"); + break; + } + SPRINTF("\n"); + + + spin_lock_irqsave(&(data->Lock), flags); + SPRINTF("CurrentSC: 0x%p\n\n", data->CurrentSC); + spin_unlock_irqrestore(&(data->Lock), flags); + + SPRINTF("SDTR status\n"); + for(id = 0; id < N_TARGET; id++) { + + SPRINTF("id %d: ", id); + + if (id == host->this_id) { + SPRINTF("----- NinjaSCSI-3 host adapter\n"); + continue; + } + + switch(data->Sync[id].SyncNegotiation) { + case SYNC_OK: + SPRINTF(" sync"); + break; + case SYNC_NG: + SPRINTF("async"); + break; + case SYNC_NOT_YET: + SPRINTF(" none"); + break; + default: + SPRINTF("?????"); + break; + } + + if (data->Sync[id].SyncPeriod != 0) { + speed = 1000000 / (data->Sync[id].SyncPeriod * 4); + + SPRINTF(" transfer %d.%dMB/s, offset %d", + speed / 1000, + speed % 1000, + data->Sync[id].SyncOffset + ); + } + SPRINTF("\n"); + } + + thislength = pos - (buffer + offset); + + if(thislength < 0) { + *start = 0; + return 0; + } + + + thislength = MIN(thislength, length); + *start = buffer + offset; + + return thislength; } +#undef SPRINTF /*---------------------------------------------------------------*/ /* error handler */ /*---------------------------------------------------------------*/ -static int nsp_reset(Scsi_Cmnd *SCpnt, unsigned int why) +static int nsp_reset(Scsi_Cmnd *SCpnt, unsigned int reset_flags) { - DEBUG(0, __FUNCTION__ " SCpnt=0x%p why=%d\n", SCpnt, why); + nsp_hw_data *data = &nsp_data; + int ret = 0; - nsp_eh_bus_reset(SCpnt); + DEBUG(0, "%s: SCpnt=0x%p why=%d\n", __FUNCTION__, SCpnt, reset_flags); - return SCSI_RESET_SUCCESS; + if (reset_flags & SCSI_RESET_SUGGEST_BUS_RESET) { + nsp_eh_bus_reset(SCpnt); + + ret |= SCSI_RESET_BUS_RESET; + } + + if (reset_flags & SCSI_RESET_SUGGEST_HOST_RESET) { + nsp_eh_host_reset(SCpnt); + + ret |= SCSI_RESET_HOST_RESET; + } + + if (ret != 0) { + return SCSI_RESET_SUCCESS | ret; + } else { + nsphw_init_sync(data); + return SCSI_RESET_PUNT; + } } static int nsp_abort(Scsi_Cmnd *SCpnt) { - DEBUG(0, __FUNCTION__ " SCpnt=0x%p\n", SCpnt); + DEBUG(0, "%s: SCpnt=0x%p\n", __FUNCTION__, SCpnt); + nsp_eh_host_reset(SCpnt); nsp_eh_bus_reset(SCpnt); return SCSI_ABORT_SUCCESS; @@ -1255,28 +1438,29 @@ static int nsp_abort(Scsi_Cmnd *SCpnt) return FAILED; }*/ +/* static int nsp_eh_abort(Scsi_Cmnd *SCpnt) { - DEBUG(0, __FUNCTION__ " SCpnt=0x%p\n", SCpnt); + DEBUG(0, "%s: SCpnt=0x%p\n", __FUNCTION__, SCpnt); - nsp_eh_bus_reset(SCpnt); - - return SUCCESS; -} + return nsp_eh_bus_reset(SCpnt); +}*/ +/* static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt) { - DEBUG(0, __FUNCTION__ " SCpnt=0x%p\n", SCpnt); + DEBUG(0, "%s: SCpnt=0x%p\n", __FUNCTION__, SCpnt); return FAILED; -} +}*/ static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt) { + nsp_hw_data *data = &nsp_data; unsigned int base = SCpnt->host->io_port; int i; - DEBUG(0, __FUNCTION__ "() SCpnt=0x%p base=0x%x\n", SCpnt, base); + DEBUG(0, "%s() SCpnt=0x%p base=0x%x\n", __FUNCTION__, SCpnt, base); nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK); @@ -1289,6 +1473,8 @@ static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt) nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR); + nsphw_init_sync(data); + return SUCCESS; } @@ -1296,17 +1482,17 @@ static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt) { nsp_hw_data *data = &nsp_data; - DEBUG(0, __FUNCTION__ "\n"); + DEBUG(0, "%s\n", __FUNCTION__); nsphw_init(data); - return nsp_eh_bus_reset(SCpnt); + return SUCCESS; } /********************************************************************** PCMCIA functions - *********************************************************************/ +**********************************************************************/ /*====================================================================*/ static void cs_error(client_handle_t handle, int func, int ret) @@ -1331,7 +1517,7 @@ static dev_link_t *nsp_cs_attach(void) dev_link_t *link; int ret, i; - DEBUG(0, __FUNCTION__ "()\n"); + DEBUG(0, "%s()\n", __FUNCTION__); /* Create new SCSI device */ info = kmalloc(sizeof(*info), GFP_KERNEL); @@ -1359,8 +1545,15 @@ static dev_link_t *nsp_cs_attach(void) link->irq.IRQInfo2 |= 1 << irq_list[i]; } } + + /* IRQ $B$N3NJ]$O$3$3$G(B PCMCIA $B$N4X?t$rMQ$$$F9T$J$&$N$G(B + * host->hostdata $B$r(B irq.Instance $B$KBeF~$G$-$J$$!#(B + * host->hostdata $B$,;H$($l$PJ#?t$N(B NinjaSCSI $B$,(B + * $B;HMQ$G$-$k$N$@$,!#(B + */ link->irq.Handler = &nspintr; link->irq.Instance = &nsp_data; + link->irq.Attributes |= (SA_SHIRQ | SA_SAMPLE_RANDOM); /* General socket configuration */ link->conf.Attributes = CONF_ENABLE_IRQ; @@ -1402,7 +1595,7 @@ static void nsp_cs_detach(dev_link_t *link) { dev_link_t **linkp; - DEBUG(0, __FUNCTION__ "(0x%p)\n", link); + DEBUG(0, "%s(0x%p)\n", __FUNCTION__, link); /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) { @@ -1414,7 +1607,7 @@ static void nsp_cs_detach(dev_link_t *link) return; } - del_timer(&link->release); + del_timer_sync(&link->release); if (link->state & DEV_CONFIG) { nsp_cs_release((u_long)link); if (link->state & DEV_STALE_CONFIG) { @@ -1431,6 +1624,7 @@ static void nsp_cs_detach(dev_link_t *link) /* Unlink device structure, free bits */ *linkp = link->next; kfree(link->priv); + link->priv = NULL; } /* nsp_cs_detach */ @@ -1452,15 +1646,20 @@ static void nsp_cs_config(dev_link_t *link) scsi_info_t *info = link->priv; tuple_t tuple; cisparse_t parse; - int i, last_ret, last_fn; + int last_ret, last_fn; u_char tuple_data[64]; config_info_t conf; + win_req_t req; + memreq_t map; + cistpl_cftable_entry_t dflt = { 0 }; + Scsi_Device *dev; dev_node_t **tail, *node; struct Scsi_Host *host; nsp_hw_data *data = &nsp_data; - DEBUG(0, __FUNCTION__ "() in\n"); + + DEBUG(0, "%s() in\n", __FUNCTION__); tuple.DesiredTuple = CISTPL_CONFIG; tuple.Attributes = 0; @@ -1474,7 +1673,6 @@ static void nsp_cs_config(dev_link_t *link) link->conf.Present = parse.config.rmask[0]; /* Configure card */ - driver_template.module = &__this_module; link->state |= DEV_CONFIG; /* Look up the current Vcc */ @@ -1484,44 +1682,130 @@ static void nsp_cs_config(dev_link_t *link) tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; CS_CHECK(GetFirstTuple, handle, &tuple); while (1) { + cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); + CFG_CHECK(GetTupleData, handle, &tuple); CFG_CHECK(ParseTuple, handle, &tuple, &parse); - link->conf.ConfigIndex = parse.cftable_entry.index; - link->io.BasePort1 = parse.cftable_entry.io.win[0].base; - i = CardServices(RequestIO, handle, &link->io); - if (i == CS_SUCCESS) { - break; + + if (cfg->flags & CISTPL_CFTABLE_DEFAULT) { dflt = *cfg; } + if (cfg->index == 0) { goto next_entry; } + link->conf.ConfigIndex = cfg->index; + + /* Does this card need audio output? */ + if (cfg->flags & CISTPL_CFTABLE_AUDIO) { + link->conf.Attributes |= CONF_ENABLE_SPKR; + link->conf.Status = CCSR_AUDIO_ENA; + } + + /* Use power settings for Vcc and Vpp if present */ + /* Note that the CIS values need to be rescaled */ + if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) { + if (conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM]/10000) { + goto next_entry; + } + } else if (dflt.vcc.present & (1<<CISTPL_POWER_VNOM)) { + if (conf.Vcc != dflt.vcc.param[CISTPL_POWER_VNOM]/10000) { + goto next_entry; + } + } + + if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM)) { + link->conf.Vpp1 = link->conf.Vpp2 = + cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; + } else if (dflt.vpp1.present & (1<<CISTPL_POWER_VNOM)) { + link->conf.Vpp1 = link->conf.Vpp2 = + dflt.vpp1.param[CISTPL_POWER_VNOM]/10000; } + + /* Do we need to allocate an interrupt? */ + if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1) { + link->conf.Attributes |= CONF_ENABLE_IRQ; + } + + /* IO window settings */ + link->io.NumPorts1 = link->io.NumPorts2 = 0; + if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) { + cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io; + link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; + if (!(io->flags & CISTPL_IO_8BIT)) + link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; + if (!(io->flags & CISTPL_IO_16BIT)) + link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; + link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; + link->io.BasePort1 = io->win[0].base; + link->io.NumPorts1 = io->win[0].len; + if (io->nwin > 1) { + link->io.Attributes2 = link->io.Attributes1; + link->io.BasePort2 = io->win[1].base; + link->io.NumPorts2 = io->win[1].len; + } + /* This reserves IO space but doesn't actually enable it */ + CFG_CHECK(RequestIO, link->handle, &link->io); + } + + if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) { + cistpl_mem_t *mem = + (cfg->mem.nwin) ? &cfg->mem : &dflt.mem; + req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM; + req.Attributes |= WIN_ENABLE; + req.Base = mem->win[0].host_addr; + req.Size = mem->win[0].len; + if (req.Size < 0x1000) + req.Size = 0x1000; + req.AccessSpeed = 0; + link->win = (window_handle_t)link->handle; + CFG_CHECK(RequestWindow, &link->win, &req); + map.Page = 0; map.CardOffset = mem->win[0].card_addr; + CFG_CHECK(MapMemPage, link->win, &map); + + data->MmioAddress = (u_long)ioremap_nocache(req.Base, req.Size); + } + /* If we got this far, we're cool! */ + break; + next_entry: - DEBUG(0, __FUNCTION__ " next\n"); + DEBUG(0, "%s next\n", __FUNCTION__); + + if (link->io.NumPorts1) + CardServices(ReleaseIO, link->handle, &link->io); CS_CHECK(GetNextTuple, handle, &tuple); } - CS_CHECK(RequestIRQ, handle, &link->irq); + if (link->conf.Attributes & CONF_ENABLE_IRQ) + CS_CHECK(RequestIRQ, link->handle, &link->irq); CS_CHECK(RequestConfiguration, handle, &link->conf); - /* A bad hack... */ - release_region(link->io.BasePort1, link->io.NumPorts1); + if (free_ports) { + if (link->io.BasePort1) + release_region(link->io.BasePort1, link->io.NumPorts1); + if (link->io.BasePort2) + release_region(link->io.BasePort2, link->io.NumPorts2); + } /* Set port and IRQ */ - data->BaseAddress = link->io.BasePort1; - data->NumAddress = link->io.NumPorts1; - data->IrqNumber = link->irq.AssignedIRQ; + data->BaseAddress = link->io.BasePort1; + data->NumAddress = link->io.NumPorts1; + data->IrqNumber = link->irq.AssignedIRQ; - DEBUG(0, __FUNCTION__ " I/O[0x%x+0x%x] IRQ %d\n", + DEBUG(0, "%s I/O[0x%x+0x%x] IRQ %d\n", + __FUNCTION__, data->BaseAddress, data->NumAddress, data->IrqNumber); if(nsphw_init(data) == FALSE) { goto cs_failed; } +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2)) scsi_register_host(&driver_template); +#else + scsi_register_module(MODULE_SCSI_HA, &driver_template); +#endif DEBUG(0, "GET_SCSI_INFO\n"); tail = &link->dev; info->ndev = 0; for (host = scsi_host_get_next(NULL); host; - host = scsi_host_get_next(host)) + host = scsi_host_get_next(host)) { if (host->hostt == &driver_template) { for (dev = host->host_queue; dev != NULL; dev = dev->next) { u_long arg[2], id; @@ -1575,6 +1859,12 @@ static void nsp_cs_config(dev_link_t *link) printk(", io 0x%04x-0x%04x", link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1-1); } + if (link->io.NumPorts2) + printk(" & 0x%04x-0x%04x", link->io.BasePort2, + link->io.BasePort2+link->io.NumPorts2-1); + if (link->win) + printk(", mem 0x%06lx-0x%06lx", req.Base, + req.Base+req.Size-1); printk("\n"); link->state &= ~DEV_CONFIG_PENDING; @@ -1598,7 +1888,7 @@ static void nsp_cs_release(u_long arg) { dev_link_t *link = (dev_link_t *)arg; - DEBUG(0, __FUNCTION__ "(0x%p)\n", link); + DEBUG(0, "%s(0x%p)\n", __FUNCTION__, link); /* * If the device is currently in use, we won't release until it @@ -1612,10 +1902,15 @@ static void nsp_cs_release(u_long arg) } /* Unlink the device chain */ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2)) scsi_unregister_host(&driver_template); +#else + scsi_unregister_module(MODULE_SCSI_HA, &driver_template); +#endif link->dev = NULL; if (link->win) { + iounmap((void *)(nsp_data.MmioAddress)); CardServices(ReleaseWindow, link->win); } CardServices(ReleaseConfiguration, link->handle); @@ -1645,14 +1940,15 @@ static void nsp_cs_release(u_long arg) the card is still present. ======================================================================*/ -static int nsp_cs_event(event_t event, - int priority, - event_callback_args_t *args) +static int nsp_cs_event(event_t event, + int priority, + event_callback_args_t *args) { dev_link_t *link = args->client_data; scsi_info_t *info = link->priv; + Scsi_Cmnd tmp; - DEBUG(1, __FUNCTION__ "(0x%06x)\n", event); + DEBUG(1, "%s(0x%06x)\n", __FUNCTION__, event); switch (event) { case CS_EVENT_CARD_REMOVAL: @@ -1688,20 +1984,21 @@ static int nsp_cs_event(event_t event, case CS_EVENT_CARD_RESET: DEBUG(0, " event: reset\n"); if (link->state & DEV_CONFIG) { - Scsi_Cmnd tmp; - CardServices(RequestConfiguration, link->handle, &link->conf); - tmp.host = info->host; - nsp_eh_host_reset(&tmp); } info->stop = 0; + + tmp.host = info->host; + nsp_eh_host_reset(&tmp); + nsp_eh_bus_reset(&tmp); + break; default: DEBUG(0, " event: unknown\n"); break; } - DEBUG(0, __FUNCTION__ " end\n"); + DEBUG(0, "%s end\n", __FUNCTION__); return 0; } /* nsp_cs_event */ @@ -1712,7 +2009,7 @@ static int __init nsp_cs_init(void) { servinfo_t serv; - DEBUG(0, __FUNCTION__ "() in\n"); + DEBUG(0, "%s() in\n", __FUNCTION__); DEBUG(0, "%s\n", version); CardServices(GetCardServicesInfo, &serv); if (serv.Revision != CS_RELEASE_CODE) { @@ -1722,14 +2019,14 @@ static int __init nsp_cs_init(void) } register_pcmcia_driver(&dev_info, &nsp_cs_attach, &nsp_cs_detach); - DEBUG(0, __FUNCTION__ "() out\n"); + DEBUG(0, "%s() out\n", __FUNCTION__); return 0; } static void __exit nsp_cs_cleanup(void) { - DEBUG(0, __FUNCTION__ "() unloading\n"); + DEBUG(0, "%s() unloading\n", __FUNCTION__); unregister_pcmcia_driver(&dev_info); while (dev_list != NULL) { if (dev_list->state & DEV_CONFIG) { @@ -1739,8 +2036,8 @@ static void __exit nsp_cs_cleanup(void) } } -module_init(nsp_cs_init); -module_exit(nsp_cs_cleanup); +module_init(nsp_cs_init) +module_exit(nsp_cs_cleanup) /* * diff --git a/drivers/scsi/pcmcia/nsp_cs.h b/drivers/scsi/pcmcia/nsp_cs.h index 3b6303e21c25..9264e1756608 100644 --- a/drivers/scsi/pcmcia/nsp_cs.h +++ b/drivers/scsi/pcmcia/nsp_cs.h @@ -10,13 +10,13 @@ =========================================================*/ -/* $Id: nsp_cs.h,v 1.27 2001/09/10 10:31:13 elca Exp $ */ +/* $Id: nsp_cs.h,v 1.3 2002/10/10 11:07:52 elca Exp $ */ #ifndef __nsp_cs__ #define __nsp_cs__ /* for debugging */ -/*#define PCMCIA_DEBUG 9*/ +//#define PCMCIA_DEBUG 9 /* #define static @@ -27,11 +27,11 @@ * Some useful macros... */ #define Number(arr) ((int) (sizeof(arr) / sizeof(arr[0]))) -#define BIT(x) (1<<(x)) +#define BIT(x) (1L << (x)) #define MIN(a,b) ((a) > (b) ? (b) : (a)) -/* SCSI initiator must be 7 */ -#define SCSI_INITIATOR_ID 7 +/* SCSI initiator must be ID 7 */ +#define NSP_INITIATOR_ID 7 #define NSP_SELTIMEOUT 200 @@ -73,6 +73,7 @@ #define CLOCKDIV 0x11 # define CLOCK_40M 0x02 # define CLOCK_20M 0x01 +# define FAST_20 BIT(2) #define TERMPWRCTRL 0x13 # define POWER_ON BIT(0) @@ -133,6 +134,9 @@ # define REQ_COUNTER_CLEAR BIT(2) # define HOST_COUNTER_CLEAR BIT(3) # define READ_SOURCE 0x30 +# define ACK_COUNTER (0) +# define REQ_COUNTER (BIT(4)) +# define HOST_COUNTER (BIT(5)) #define TRANSFERCOUNT 0x1E /* R */ @@ -222,11 +226,14 @@ typedef struct _sync_data { unsigned char AckWidth; } sync_data; -typedef struct _nsp_data { +typedef struct _nsp_hw_data { unsigned int BaseAddress; unsigned int NumAddress; unsigned int IrqNumber; + unsigned long MmioAddress; +#define NSP_MMIO_OFFSET 0x0800 + unsigned char ScsiClockDiv; unsigned char TransferMode; @@ -238,9 +245,9 @@ typedef struct _nsp_data { int FifoCount; #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)) int Residual; -#define RESID data->Residual +#define RESID (data->Residual) #else -#define RESID SCpnt->resid +#define RESID (SCpnt->resid) #endif #define MSGBUF_SIZE 20 @@ -248,10 +255,20 @@ typedef struct _nsp_data { int MsgLen; #define N_TARGET 8 -#define N_LUN 8 - sync_data Sync[N_TARGET][N_LUN]; + sync_data Sync[N_TARGET]; + + char nspinfo[110]; /* description */ + spinlock_t Lock; } nsp_hw_data; +/* scatter-gather table */ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2)) +# define BUFFER_ADDR ((char *)((unsigned int)(SCpnt->SCp.buffer->page) + SCpnt->SCp.buffer->offset)) +#else +# define BUFFER_ADDR SCpnt->SCp.buffer->address +#endif + + static void nsp_cs_release(u_long arg); static int nsp_cs_event(event_t event, int priority, event_callback_args_t *args); @@ -263,14 +280,16 @@ static void nsp_start_timer(Scsi_Cmnd *SCpnt, nsp_hw_data *data, int time); static int nsp_detect(Scsi_Host_Template * ); static int nsp_release(struct Scsi_Host *shpnt); -static const char * nsp_info(struct Scsi_Host *shpnt); +static const char *nsp_info(struct Scsi_Host *shpnt); +static int nsp_proc_info(char *buffer, char **start, off_t offset, + int length, int hostno, int inout); static int nsp_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); static int nsp_abort(Scsi_Cmnd *); static int nsp_reset(Scsi_Cmnd *, unsigned int); -static int nsp_eh_abort(Scsi_Cmnd * SCpnt); -static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt); +/*static int nsp_eh_abort(Scsi_Cmnd * SCpnt);*/ +/*static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt);*/ static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt); static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt); @@ -294,17 +313,19 @@ static void show_message(nsp_hw_data *data); * SCSI phase */ enum _scsi_phase { - PH_UNDETERMINED, - PH_ARBSTART, - PH_SELSTART, - PH_SELECTED, - PH_COMMAND, - PH_DATA, - PH_STATUS, - PH_MSG_IN, - PH_MSG_OUT, - PH_DISCONNECT, - PH_RESELECT + PH_UNDETERMINED , + PH_ARBSTART , + PH_SELSTART , + PH_SELECTED , + PH_COMMAND , + PH_DATA , + PH_STATUS , + PH_MSG_IN , + PH_MSG_OUT , + PH_DISCONNECT , + PH_RESELECT , + PH_ABORT , + PH_RESET }; enum _data_in_out { @@ -313,11 +334,19 @@ enum _data_in_out { IO_OUT }; +enum _burst_mode { + BURST_IO8 = 0, + BURST_IO32, + BURST_MEM32 +}; + /* SCSI messaage */ #define MSG_COMMAND_COMPLETE 0x00 #define MSG_EXTENDED 0x01 +#define MSG_ABORT 0x06 #define MSG_NO_OPERATION 0x08 +#define MSG_BUS_DEVICE_RESET 0x0c #define MSG_EXT_SDTR 0x01 diff --git a/drivers/scsi/pcmcia/nsp_debug.c b/drivers/scsi/pcmcia/nsp_debug.c index 0dbf3cddf380..4deff0739552 100644 --- a/drivers/scsi/pcmcia/nsp_debug.c +++ b/drivers/scsi/pcmcia/nsp_debug.c @@ -6,7 +6,7 @@ the GNU General Public License. =========================================================================*/ -/* $Id: nsp_debug.c,v 1.8 2001/09/07 04:32:28 elca Exp $ */ +/* $Id: nsp_debug.c,v 1.2 2002/09/20 04:06:58 gotom Exp $ */ /* * Show the command data of a command @@ -87,14 +87,21 @@ static void print_opcodek(unsigned char opcode) static void print_commandk (unsigned char *command) { - int i,s; + int i, s; printk(KERN_DEBUG); print_opcodek(command[0]); /*printk(KERN_DEBUG __FUNCTION__ " ");*/ - for ( i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i) { + if ((command[0] >> 5) == 6 || + (command[0] >> 5) == 7 ) { + s = 12; /* vender specific */ + } else { + s = COMMAND_SIZE(command[0]); + } + for ( i = 1; i < s; ++i) { printk("%02x ", command[i]); } - switch (COMMAND_SIZE(command[0])) { + + switch (s) { case 6: printk("LBA=%d len=%d", (((unsigned int)command[1] & 0x0f) << 16) | diff --git a/drivers/scsi/pcmcia/nsp_io.h b/drivers/scsi/pcmcia/nsp_io.h index 898565746df3..66da4a009857 100644 --- a/drivers/scsi/pcmcia/nsp_io.h +++ b/drivers/scsi/pcmcia/nsp_io.h @@ -7,7 +7,7 @@ */ -/* $Id: nsp_io.h,v 1.9 2001/09/07 04:32:42 elca Exp $ */ +/* $Id: nsp_io.h,v 1.2 2002/09/20 04:06:58 gotom Exp $ */ #ifndef __NSP_IO_H__ #define __NSP_IO_H__ @@ -76,7 +76,7 @@ static inline void nsp_fifo8_read(unsigned int base, void *buf, unsigned long count) { - //DEBUG(0, __FUNCTION__ "() buf=0x%p, count=0x%lx\n", buf, count); + /*DEBUG(0, __FUNCTION__ "() buf=0x%p, count=0x%lx\n", buf, count);*/ nsp_multi_read_1(base, FIFODATA, buf, count); } @@ -172,5 +172,103 @@ static inline void nsp_fifo32_write(unsigned int base, nsp_multi_write_4(base, FIFODATA, buf, count); } + +/*====================================================================*/ + +static inline void nsp_mmio_write(unsigned long base, + unsigned int index, + unsigned char val) +{ + unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index); + + writeb(val, ptr); +} + +static inline unsigned char nsp_mmio_read(unsigned long base, + unsigned int index) +{ + unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index); + + return readb(ptr); +} + +/*-----------*/ + +static inline unsigned char nsp_mmio_index_read(unsigned long base, + unsigned int reg) +{ + unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG); + unsigned char *data_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG); + + writeb((unsigned char)reg, index_ptr); + return readb(data_ptr); +} + +static inline void nsp_mmio_index_write(unsigned long base, + unsigned int reg, + unsigned char val) +{ + unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG); + unsigned char *data_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG); + + writeb((unsigned char)reg, index_ptr); + writeb(val, data_ptr); +} + +/* read 32bit FIFO */ +static inline void nsp_mmio_multi_read_4(unsigned long base, + unsigned int Register, + void *buf, + unsigned long count) +{ + unsigned long *ptr = (unsigned long *)(base + Register); + unsigned long *tmp = (unsigned long *)buf; + int i; + + //printk("base 0x%0lx ptr 0x%p\n",base,ptr); + + for (i = 0; i < count; i++) { + *tmp = readl(ptr); + //printk("<%d,%p,%p,%lx>", i, ptr, tmp, *tmp); + tmp++; + } +} + +static inline void nsp_mmio_fifo32_read(unsigned int base, + void *buf, + unsigned long count) +{ + //DEBUG(0, __FUNCTION__ "() buf=0x%p, count=0x%lx*4\n", buf, count); + nsp_mmio_multi_read_4(base, FIFODATA, buf, count); +} + +static inline void nsp_mmio_multi_write_4(unsigned long base, + unsigned int Register, + void *buf, + unsigned long count) +{ + unsigned long *ptr = (unsigned long *)(base + Register); + unsigned long *tmp = (unsigned long *)buf; + int i; + + //printk("base 0x%0lx ptr 0x%p\n",base,ptr); + + for (i = 0; i < count; i++) { + writel(*tmp, ptr); + //printk("<%d,%p,%p,%lx>", i, ptr, tmp, *tmp); + tmp++; + } +} + +static inline void nsp_mmio_fifo32_write(unsigned int base, + void *buf, + unsigned long count) +{ + //DEBUG(0, __FUNCTION__ "() buf=0x%p, count=0x%lx*4\n", buf, count); + nsp_mmio_multi_write_4(base, FIFODATA, buf, count); +} + + + #endif /* end */ diff --git a/drivers/scsi/pcmcia/nsp_message.c b/drivers/scsi/pcmcia/nsp_message.c index a2cdba1b5ee4..67b5d748f04c 100644 --- a/drivers/scsi/pcmcia/nsp_message.c +++ b/drivers/scsi/pcmcia/nsp_message.c @@ -6,7 +6,7 @@ the GNU General Public License. */ -/* $Id: nsp_message.c,v 1.7 2001/09/07 04:33:01 elca Exp $ */ +/* $Id: nsp_message.c,v 1.2 2002/09/20 04:06:58 gotom Exp $ */ static void nsp_message_in(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { @@ -64,7 +64,7 @@ static void nsp_message_out(Scsi_Cmnd *SCpnt, nsp_hw_data *data) DEBUG(0, " msgout loop\n"); do { if (nsp_xfer(SCpnt, data, BUSPHASE_MESSAGE_OUT)) { - printk(KERN_DEBUG " " __FUNCTION__ " msgout: xfer short\n"); + printk(KERN_DEBUG " %s msgout: xfer short\n", __FUNCTION__); } /* catch a next signal */ diff --git a/drivers/scsi/ppa.c b/drivers/scsi/ppa.c index cbe2bfe1db9c..70bdb7ec6c89 100644 --- a/drivers/scsi/ppa.c +++ b/drivers/scsi/ppa.c @@ -201,6 +201,8 @@ int ppa_detect(Scsi_Host_Template * host) default: /* Never gets here */ continue; } + + INIT_WORK(&ppa_hosts[i].ppa_tq, ppa_interrupt, &ppa_hosts[i]); host->can_queue = PPA_CAN_QUEUE; host->sg_tablesize = ppa_sg; diff --git a/drivers/scsi/qla1280.h b/drivers/scsi/qla1280.h index 5dbaf0a89cb8..113549fb5c92 100644 --- a/drivers/scsi/qla1280.h +++ b/drivers/scsi/qla1280.h @@ -1324,22 +1324,12 @@ void qla1280_setup(char *s, int *dummy); */ #define QLA1280_LINUX_TEMPLATE { \ - next: NULL, \ - module: NULL, \ - proc_dir: NULL, \ proc_info: qla1280_proc_info, \ name: "Qlogic ISP 1280/12160", \ detect: qla1280_detect, \ release: qla1280_release, \ info: qla1280_info, \ - ioctl: NULL, \ - command: NULL, \ queuecommand: qla1280_queuecommand, \ - eh_strategy_handler: NULL, \ - eh_abort_handler: NULL, \ - eh_device_reset_handler: NULL, \ - eh_bus_reset_handler: NULL, \ - eh_host_reset_handler: NULL, \ /* use_new_eh_code: 0, */ \ abort: qla1280_abort, \ reset: qla1280_reset, \ diff --git a/drivers/scsi/qlogicfas.c b/drivers/scsi/qlogicfas.c index ff0edd5c0142..710d6d48006d 100644 --- a/drivers/scsi/qlogicfas.c +++ b/drivers/scsi/qlogicfas.c @@ -22,9 +22,22 @@ Functions as standalone, loadable, and PCMCIA driver, the latter from Dave Hinds' PCMCIA package. + + Cleaned up 26/10/2002 by Alan Cox <alan@redhat.com> as part of the 2.5 + SCSI driver cleanup and audit. This driver still needs work on the + following + - Non terminating hardware waits + - Support multiple cards at a time + - Some layering violations with its pcmcia stub Redistributable under terms of the GNU General Public License + For the avoidance of doubt the "preferred form" of this code is one which + is in an open non patent encumbered format. Where cryptographic key signing + forms part of the process of creating an executable the information + including keys needed to generate an equivalently functional executable + are deemed to be part of the source code. + */ /*----------------------------------------------------------------*/ /* Configuration */ @@ -32,17 +45,21 @@ /* Set the following to 2 to use normal interrupt (active high/totempole- tristate), otherwise use 0 (REQUIRED FOR PCMCIA) for active low, open drain */ + #define QL_INT_ACTIVE_HIGH 2 /* Set the following to 1 to enable the use of interrupts. Note that 0 tends to be more stable, but slower (or ties up the system more) */ + #define QL_USE_IRQ 1 /* Set the following to max out the speed of the PIO PseudoDMA transfers, again, 0 tends to be slower, but more stable. */ + #define QL_TURBO_PDMA 1 /* This should be 1 to enable parity detection */ + #define QL_ENABLE_PARITY 1 /* This will reset all devices when the driver is initialized (during bootup). @@ -51,11 +68,13 @@ without requiring a cold boot. It does take some time to recover from a reset, so it is slower, and I have seen timeouts so that devices weren't recognized when this was set. */ + #define QL_RESET_AT_START 0 /* crystal frequency in megahertz (for offset 5 and 9) Please set this for your card. Most Qlogic cards are 40 Mhz. The Control Concepts ISA (not VLB) is 24 Mhz */ + #define XTALFREQ 40 /**********/ @@ -79,16 +98,14 @@ #define FASTSCSI 0 /* This when set to 1 will set a faster sync transfer rate */ -#define FASTCLK 0 -/*(XTALFREQ>25?1:0)*/ +#define FASTCLK 0 /*(XTALFREQ>25?1:0)*/ /*****/ /* offset 6 */ /* This is the sync transfer divisor, XTALFREQ/X will be the maximum achievable data rate (assuming the rest of the system is capable and set properly) */ -#define SYNCXFRPD 5 -/*(XTALFREQ/5)*/ +#define SYNCXFRPD 5 /*(XTALFREQ/5)*/ /*****/ /* offset 7 */ @@ -107,15 +124,15 @@ #ifdef PCMCIA #undef QL_INT_ACTIVE_HIGH #define QL_INT_ACTIVE_HIGH 0 -#endif +#endif #include <linux/module.h> #ifdef PCMCIA #undef MODULE -#endif +#endif -#include <linux/blk.h> /* to get disk capacity */ +#include <linux/blk.h> /* to get disk capacity */ #include <linux/kernel.h> #include <linux/string.h> #include <linux/init.h> @@ -133,19 +150,19 @@ /*----------------------------------------------------------------*/ /* driver state info, local to driver */ -static int qbase; /* Port */ -static int qinitid; /* initiator ID */ -static int qabort; /* Flag to cause an abort */ -static int qlirq = -1; /* IRQ being used */ -static char qinfo[80]; /* description */ -static Scsi_Cmnd *qlcmd; /* current command being processed */ - -static int qlcfg5 = ( XTALFREQ << 5 ); /* 15625/512 */ -static int qlcfg6 = SYNCXFRPD; -static int qlcfg7 = SYNCOFFST; -static int qlcfg8 = ( SLOWCABLE << 7 ) | ( QL_ENABLE_PARITY << 4 ); -static int qlcfg9 = ( ( XTALFREQ + 4 ) / 5 ); -static int qlcfgc = ( FASTCLK << 3 ) | ( FASTSCSI << 4 ); +static int qbase; /* Port */ +static int qinitid; /* initiator ID */ +static int qabort; /* Flag to cause an abort */ +static int qlirq = -1; /* IRQ being used */ +static char qinfo[80]; /* description */ +static Scsi_Cmnd *qlcmd; /* current command being processed */ + +static int qlcfg5 = (XTALFREQ << 5); /* 15625/512 */ +static int qlcfg6 = SYNCXFRPD; +static int qlcfg7 = SYNCOFFST; +static int qlcfg8 = (SLOWCABLE << 7) | (QL_ENABLE_PARITY << 4); +static int qlcfg9 = ((XTALFREQ + 4) / 5); +static int qlcfgc = (FASTCLK << 3) | (FASTSCSI << 4); /*----------------------------------------------------------------*/ /* The qlogic card uses two register maps - These macros select which one */ @@ -168,107 +185,112 @@ static int qlcfgc = ( FASTCLK << 3 ) | ( FASTSCSI << 4 ); /*----------------------------------------------------------------*/ /* local functions */ /*----------------------------------------------------------------*/ -static void ql_zap(void); + /* error recovery - reset everything */ -void ql_zap() + +static void ql_zap(void) { -int x; -unsigned long flags; - save_flags( flags ); - cli(); + int x; + x = inb(qbase + 0xd); REG0; - outb(3, qbase + 3); /* reset SCSI */ - outb(2, qbase + 3); /* reset chip */ + outb(3, qbase + 3); /* reset SCSI */ + outb(2, qbase + 3); /* reset chip */ if (x & 0x80) REG1; - restore_flags( flags ); } -/*----------------------------------------------------------------*/ -/* do pseudo-dma */ -static int ql_pdma(int phase, char *request, int reqlen) +/* + * Do a pseudo-dma tranfer + */ + +static int ql_pdma(int phase, char *request, int reqlen) { -int j; + int j; j = 0; if (phase & 1) { /* in */ #if QL_TURBO_PDMA -rtrc(4) + rtrc(4) /* empty fifo in large chunks */ - if( reqlen >= 128 && (inb( qbase + 8 ) & 2) ) { /* full */ - insl( qbase + 4, request, 32 ); + if (reqlen >= 128 && (inb(qbase + 8) & 2)) { /* full */ + insl(qbase + 4, request, 32); reqlen -= 128; request += 128; } - while( reqlen >= 84 && !( j & 0xc0 ) ) /* 2/3 */ - if( (j=inb( qbase + 8 )) & 4 ) { - insl( qbase + 4, request, 21 ); + while (reqlen >= 84 && !(j & 0xc0)) /* 2/3 */ + if ((j = inb(qbase + 8)) & 4) + { + insl(qbase + 4, request, 21); reqlen -= 84; request += 84; } - if( reqlen >= 44 && (inb( qbase + 8 ) & 8) ) { /* 1/3 */ - insl( qbase + 4, request, 11 ); + if (reqlen >= 44 && (inb(qbase + 8) & 8)) { /* 1/3 */ + insl(qbase + 4, request, 11); reqlen -= 44; request += 44; } #endif /* until both empty and int (or until reclen is 0) */ -rtrc(7) + rtrc(7) j = 0; - while( reqlen && !( (j & 0x10) && (j & 0xc0) ) ) { + while (reqlen && !((j & 0x10) && (j & 0xc0))) + { /* while bytes to receive and not empty */ j &= 0xc0; - while ( reqlen && !( (j=inb(qbase + 8)) & 0x10 ) ) { + while (reqlen && !((j = inb(qbase + 8)) & 0x10)) + { *request++ = inb(qbase + 4); reqlen--; } - if( j & 0x10 ) - j = inb(qbase+8); + if (j & 0x10) + j = inb(qbase + 8); } - } - else { /* out */ + } else { /* out */ #if QL_TURBO_PDMA -rtrc(4) - if( reqlen >= 128 && inb( qbase + 8 ) & 0x10 ) { /* empty */ - outsl(qbase + 4, request, 32 ); + rtrc(4) + if (reqlen >= 128 && inb(qbase + 8) & 0x10) { /* empty */ + outsl(qbase + 4, request, 32); reqlen -= 128; request += 128; } - while( reqlen >= 84 && !( j & 0xc0 ) ) /* 1/3 */ - if( !((j=inb( qbase + 8 )) & 8) ) { - outsl( qbase + 4, request, 21 ); + while (reqlen >= 84 && !(j & 0xc0)) /* 1/3 */ + if (!((j = inb(qbase + 8)) & 8)) { + outsl(qbase + 4, request, 21); reqlen -= 84; request += 84; } - if( reqlen >= 40 && !(inb( qbase + 8 ) & 4 ) ) { /* 2/3 */ - outsl( qbase + 4, request, 10 ); + if (reqlen >= 40 && !(inb(qbase + 8) & 4)) { /* 2/3 */ + outsl(qbase + 4, request, 10); reqlen -= 40; request += 40; } #endif /* until full and int (or until reclen is 0) */ -rtrc(7) - j = 0; - while( reqlen && !( (j & 2) && (j & 0xc0) ) ) { + rtrc(7) + j = 0; + while (reqlen && !((j & 2) && (j & 0xc0))) { /* while bytes to send and not full */ - while ( reqlen && !( (j=inb(qbase + 8)) & 2 ) ) { + while (reqlen && !((j = inb(qbase + 8)) & 2)) + { outb(*request++, qbase + 4); reqlen--; } - if( j & 2 ) - j = inb(qbase+8); + if (j & 2) + j = inb(qbase + 8); } } -/* maybe return reqlen */ - return inb( qbase + 8 ) & 0xc0; + /* maybe return reqlen */ + return inb(qbase + 8) & 0xc0; } -/*----------------------------------------------------------------*/ -/* wait for interrupt flag (polled - not real hardware interrupt) */ -static int ql_wai(void) +/* + * Wait for interrupt flag (polled - not real hardware interrupt) + */ + +static int ql_wai(void) { -int i,k; + int i, k; k = 0; i = jiffies + WATCHDOG; while (time_before(jiffies, i) && !qabort && !((k = inb(qbase + 4)) & 0xe0)) { @@ -288,65 +310,68 @@ int i,k; return 0; } -/*----------------------------------------------------------------*/ -/* initiate scsi command - queueing handler */ -static void ql_icmd(Scsi_Cmnd * cmd) +/* + * Initiate scsi command - queueing handler + * caller must hold host lock + */ + +static void ql_icmd(Scsi_Cmnd * cmd) { -unsigned int i; -unsigned long flags; + unsigned int i; qabort = 0; - save_flags( flags ); - cli(); REG0; -/* clearing of interrupts and the fifo is needed */ - inb(qbase + 5); /* clear interrupts */ - if (inb(qbase + 5)) /* if still interrupting */ - outb(2, qbase + 3); /* reset chip */ + /* clearing of interrupts and the fifo is needed */ + + inb(qbase + 5); /* clear interrupts */ + if (inb(qbase + 5)) /* if still interrupting */ + outb(2, qbase + 3); /* reset chip */ else if (inb(qbase + 7) & 0x1f) - outb(1, qbase + 3); /* clear fifo */ - while (inb(qbase + 5)); /* clear ints */ + outb(1, qbase + 3); /* clear fifo */ + while (inb(qbase + 5)); /* clear ints */ REG1; - outb(1, qbase + 8); /* set for PIO pseudo DMA */ - outb(0, qbase + 0xb); /* disable ints */ - inb(qbase + 8); /* clear int bits */ + outb(1, qbase + 8); /* set for PIO pseudo DMA */ + outb(0, qbase + 0xb); /* disable ints */ + inb(qbase + 8); /* clear int bits */ REG0; - outb(0x40, qbase + 0xb); /* enable features */ - -/* configurables */ - outb( qlcfgc , qbase + 0xc); -/* config: no reset interrupt, (initiator) bus id */ - outb( 0x40 | qlcfg8 | qinitid, qbase + 8); - outb( qlcfg7 , qbase + 7 ); - outb( qlcfg6 , qbase + 6 ); -/**/ - outb(qlcfg5, qbase + 5); /* select timer */ - outb(qlcfg9 & 7, qbase + 9); /* prescaler */ + outb(0x40, qbase + 0xb); /* enable features */ + + /* configurables */ + outb(qlcfgc, qbase + 0xc); + /* config: no reset interrupt, (initiator) bus id */ + outb(0x40 | qlcfg8 | qinitid, qbase + 8); + outb(qlcfg7, qbase + 7); + outb(qlcfg6, qbase + 6); + /**/ outb(qlcfg5, qbase + 5); /* select timer */ + outb(qlcfg9 & 7, qbase + 9); /* prescaler */ /* outb(0x99, qbase + 5); */ outb(cmd->target, qbase + 4); for (i = 0; i < cmd->cmd_len; i++) outb(cmd->cmnd[i], qbase + 2); + qlcmd = cmd; outb(0x41, qbase + 3); /* select and send command */ - restore_flags( flags ); } -/*----------------------------------------------------------------*/ -/* process scsi command - usually after interrupt */ -static unsigned int ql_pcmd(Scsi_Cmnd * cmd) + +/* + * Process scsi command - usually after interrupt + */ + +static unsigned int ql_pcmd(Scsi_Cmnd * cmd) { -unsigned int i, j, k; -unsigned int result; /* ultimate return result */ -unsigned int status; /* scsi returned status */ -unsigned int message; /* scsi returned message */ -unsigned int phase; /* recorded scsi phase */ -unsigned int reqlen; /* total length of transfer */ -struct scatterlist *sglist; /* scatter-gather list pointer */ -unsigned int sgcount; /* sg counter */ -char *buf; - -rtrc(1) + unsigned int i, j, k; + unsigned int result; /* ultimate return result */ + unsigned int status; /* scsi returned status */ + unsigned int message; /* scsi returned message */ + unsigned int phase; /* recorded scsi phase */ + unsigned int reqlen; /* total length of transfer */ + struct scatterlist *sglist; /* scatter-gather list pointer */ + unsigned int sgcount; /* sg counter */ + char *buf; + + rtrc(1) j = inb(qbase + 6); i = inb(qbase + 5); if (i == 0x20) { @@ -354,36 +379,40 @@ rtrc(1) } i |= inb(qbase + 5); /* the 0x10 bit can be set after the 0x08 */ if (i != 0x18) { - printk("Ql:Bad Interrupt status:%02x\n", i); + printk(KERN_ERR "Ql:Bad Interrupt status:%02x\n", i); ql_zap(); return (DID_BAD_INTR << 16); } - j &= 7; /* j = inb( qbase + 7 ) >> 5; */ -/* correct status is supposed to be step 4 */ -/* it sometimes returns step 3 but with 0 bytes left to send */ -/* We can try stuffing the FIFO with the max each time, but we will get a - sequence of 3 if any bytes are left (but we do flush the FIFO anyway */ - if(j != 3 && j != 4) { - printk("Ql:Bad sequence for command %d, int %02X, cmdleft = %d\n", j, i, inb( qbase+7 ) & 0x1f ); + j &= 7; /* j = inb( qbase + 7 ) >> 5; */ + + /* correct status is supposed to be step 4 */ + /* it sometimes returns step 3 but with 0 bytes left to send */ + /* We can try stuffing the FIFO with the max each time, but we will get a + sequence of 3 if any bytes are left (but we do flush the FIFO anyway */ + + if (j != 3 && j != 4) { + printk(KERN_ERR "Ql:Bad sequence for command %d, int %02X, cmdleft = %d\n", + j, i, inb(qbase + 7) & 0x1f); ql_zap(); return (DID_ERROR << 16); } result = DID_OK; if (inb(qbase + 7) & 0x1f) /* if some bytes in fifo */ - outb(1, qbase + 3); /* clear fifo */ -/* note that request_bufflen is the total xfer size when sg is used */ + outb(1, qbase + 3); /* clear fifo */ + /* note that request_bufflen is the total xfer size when sg is used */ reqlen = cmd->request_bufflen; -/* note that it won't work if transfers > 16M are requested */ + /* note that it won't work if transfers > 16M are requested */ if (reqlen && !((phase = inb(qbase + 4)) & 6)) { /* data phase */ -rtrc(2) - outb(reqlen, qbase); /* low-mid xfer cnt */ - outb(reqlen >> 8, qbase+1); /* low-mid xfer cnt */ + rtrc(2) + outb(reqlen, qbase); /* low-mid xfer cnt */ + outb(reqlen >> 8, qbase + 1); /* low-mid xfer cnt */ outb(reqlen >> 16, qbase + 0xe); /* high xfer cnt */ - outb(0x90, qbase + 3); /* command do xfer */ -/* PIO pseudo DMA to buffer or sglist */ + outb(0x90, qbase + 3); /* command do xfer */ + /* PIO pseudo DMA to buffer or sglist */ REG1; if (!cmd->use_sg) - ql_pdma(phase, cmd->request_buffer, cmd->request_bufflen); + ql_pdma(phase, cmd->request_buffer, + cmd->request_bufflen); else { sgcount = cmd->use_sg; sglist = cmd->request_buffer; @@ -399,74 +428,107 @@ rtrc(2) } } REG0; -rtrc(2) -/* wait for irq (split into second state of irq handler if this can take time) */ + rtrc(2) + /* + * Wait for irq (split into second state of irq handler + * if this can take time) + */ if ((k = ql_wai())) return (k << 16); k = inb(qbase + 5); /* should be 0x10, bus service */ } -/*** Enter Status (and Message In) Phase ***/ + + /* + * Enter Status (and Message In) Phase + */ + k = jiffies + WATCHDOG; - while ( time_before(jiffies, k) && !qabort && !(inb(qbase + 4) & 6)); /* wait for status phase */ - if ( time_after_eq(jiffies, k) ) { + + while (time_before(jiffies, k) && !qabort && !(inb(qbase + 4) & 6)) + cpu_relax(); /* wait for status phase */ + + if (time_after_eq(jiffies, k)) { ql_zap(); return (DID_TIME_OUT << 16); } - while (inb(qbase + 5)); /* clear pending ints */ + + /* FIXME: timeout ?? */ + while (inb(qbase + 5)) + cpu_relax(); /* clear pending ints */ + if (qabort) return ((qabort == 1 ? DID_ABORT : DID_RESET) << 16); - outb(0x11, qbase + 3); /* get status and message */ + + outb(0x11, qbase + 3); /* get status and message */ if ((k = ql_wai())) return (k << 16); - i = inb(qbase + 5); /* get chip irq stat */ - j = inb(qbase + 7) & 0x1f; /* and bytes rec'd */ + i = inb(qbase + 5); /* get chip irq stat */ + j = inb(qbase + 7) & 0x1f; /* and bytes rec'd */ status = inb(qbase + 2); message = inb(qbase + 2); -/* should get function complete int if Status and message, else bus serv if only status */ + + /* + * Should get function complete int if Status and message, else + * bus serv if only status + */ if (!((i == 8 && j == 2) || (i == 0x10 && j == 1))) { - printk("Ql:Error during status phase, int=%02X, %d bytes recd\n", i, j); + printk(KERN_ERR "Ql:Error during status phase, int=%02X, %d bytes recd\n", i, j); result = DID_ERROR; } outb(0x12, qbase + 3); /* done, disconnect */ -rtrc(1) + rtrc(1) if ((k = ql_wai())) return (k << 16); -/* should get bus service interrupt and disconnect interrupt */ + + /* + * Should get bus service interrupt and disconnect interrupt + */ + i = inb(qbase + 5); /* should be bus service */ while (!qabort && ((i & 0x20) != 0x20)) { barrier(); cpu_relax(); i |= inb(qbase + 5); } -rtrc(0) + rtrc(0) + if (qabort) return ((qabort == 1 ? DID_ABORT : DID_RESET) << 16); + return (result << 16) | (message << 8) | (status & STATUS_MASK); } #if QL_USE_IRQ -/*----------------------------------------------------------------*/ -/* interrupt handler */ -static void ql_ihandl(int irq, void *dev_id, struct pt_regs * regs) + +/* + * Interrupt handler + */ + +static void ql_ihandl(int irq, void *dev_id, struct pt_regs *regs) { -Scsi_Cmnd *icmd; + Scsi_Cmnd *icmd; REG0; + if (!(inb(qbase + 4) & 0x80)) /* false alarm? */ return; - if (qlcmd == NULL) { /* no command to process? */ - int i; + + if (qlcmd == NULL) { /* no command to process? */ + int i; i = 16; - while (i-- && inb(qbase + 5)); /* maybe also ql_zap() */ + while (i-- && inb(qbase + 5)); /* maybe also ql_zap() */ return; } icmd = qlcmd; icmd->result = ql_pcmd(icmd); qlcmd = NULL; -/* if result is CHECK CONDITION done calls qcommand to request sense */ + /* + * If result is CHECK CONDITION done calls qcommand to request + * sense + */ (icmd->scsi_done) (icmd); } -static void do_ql_ihandl(int irq, void *dev_id, struct pt_regs * regs) +static void do_ql_ihandl(int irq, void *dev_id, struct pt_regs *regs) { unsigned long flags; struct Scsi_Host *host = dev_id; @@ -475,28 +537,40 @@ static void do_ql_ihandl(int irq, void *dev_id, struct pt_regs * regs) ql_ihandl(irq, dev_id, regs); spin_unlock_irqrestore(host->host_lock, flags); } + #endif -/*----------------------------------------------------------------*/ -/* global functions */ -/*----------------------------------------------------------------*/ -/* non queued command */ #if QL_USE_IRQ -static void qlidone(Scsi_Cmnd * cmd) {}; /* null function */ + +static void qlidone(Scsi_Cmnd * cmd) +{ +} /* null function */ + #endif -/* command process */ -int qlogicfas_command(Scsi_Cmnd * cmd) +/* + * Synchronous command processing + */ + +static int qlogicfas_command(Scsi_Cmnd * cmd) { -int k; + int k; #if QL_USE_IRQ if (qlirq >= 0) { qlogicfas_queuecommand(cmd, qlidone); - while (qlcmd != NULL); + while (qlcmd != NULL) + { + cpu_relax(); + barrier(); + } return cmd->result; } #endif -/* non-irq version */ + + /* + * Non-irq version + */ + if (cmd->target == qinitid) return (DID_BAD_TARGET << 16); ql_icmd(cmd); @@ -507,18 +581,21 @@ int k; } #if QL_USE_IRQ -/*----------------------------------------------------------------*/ -/* queued command */ -int qlogicfas_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) + +/* + * Queued command + */ + +int qlogicfas_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) { - if(cmd->target == qinitid) { + if (cmd->target == qinitid) { cmd->result = DID_BAD_TARGET << 16; done(cmd); return 0; } cmd->scsi_done = done; -/* wait for the last command's interrupt to finish */ + /* wait for the last command's interrupt to finish */ while (qlcmd != NULL) { barrier(); cpu_relax(); @@ -527,121 +604,129 @@ int qlogicfas_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) return 0; } #else -int qlogicfas_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) +int qlogicfas_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) { return 1; } #endif #ifdef PCMCIA -/*----------------------------------------------------------------*/ -/* allow PCMCIA code to preset the port */ -/* port should be 0 and irq to -1 respectively for autoprobing */ -void qlogicfas_preset(int port, int irq) + +/* + * Allow PCMCIA code to preset the port */ + * port should be 0 and irq to -1 respectively for autoprobing + */ + +void qlogicfas_preset(int port, int irq) { - qbase=port; - qlirq=irq; + qbase = port; + qlirq = irq; } + #endif -/*----------------------------------------------------------------*/ -/* look for qlogic card and init if found */ -int __QLINIT qlogicfas_detect(Scsi_Host_Template * host) +/* + * Look for qlogic card and init if found + */ + +int __devinit qlogicfas_detect(Scsi_Host_Template * host) { -int i, j; /* these are only used by IRQ detect */ -int qltyp; /* type of chip */ -struct Scsi_Host *hreg; /* registered host structure */ -unsigned long flags; - -host->proc_name = "qlogicfas"; - -/* Qlogic Cards only exist at 0x230 or 0x330 (the chip itself decodes the - address - I check 230 first since MIDI cards are typically at 330 - - Theoretically, two Qlogic cards can coexist in the same system. This - should work by simply using this as a loadable module for the second - card, but I haven't tested this. -*/ - - if( !qbase ) { + int i, j; /* these are only used by IRQ detect */ + int qltyp; /* type of chip */ + struct Scsi_Host *hreg; /* registered host structure */ + + host->proc_name = "qlogicfas"; + + /* Qlogic Cards only exist at 0x230 or 0x330 (the chip itself + * decodes the address - I check 230 first since MIDI cards are + * typically at 0x330 + * + * Theoretically, two Qlogic cards can coexist in the same system. + * This should work by simply using this as a loadable module for + * the second card, but I haven't tested this. + */ + + if (!qbase) { for (qbase = 0x230; qbase < 0x430; qbase += 0x100) { - if( !request_region( qbase , 0x10, "qlogicfas" ) ) + if (!request_region(qbase, 0x10, "qlogicfas")) continue; REG1; - if ( ( (inb(qbase + 0xe) ^ inb(qbase + 0xe)) == 7 ) - && ( (inb(qbase + 0xe) ^ inb(qbase + 0xe)) == 7 ) ) + if (((inb(qbase + 0xe) ^ inb(qbase + 0xe)) == 7) + && ((inb(qbase + 0xe) ^ inb(qbase + 0xe)) == 7)) break; - release_region(qbase, 0x10 ); + release_region(qbase, 0x10); } if (qbase == 0x430) return 0; - } - else - printk( "Ql: Using preset base address of %03x\n", qbase ); + } else + printk(KERN_INFO "Ql: Using preset base address of %03x\n", qbase); qltyp = inb(qbase + 0xe) & 0xf8; qinitid = host->this_id; if (qinitid < 0) - qinitid = 7; /* if no ID, use 7 */ - outb(1, qbase + 8); /* set for PIO pseudo DMA */ + qinitid = 7; /* if no ID, use 7 */ + outb(1, qbase + 8); /* set for PIO pseudo DMA */ REG0; outb(0x40 | qlcfg8 | qinitid, qbase + 8); /* (ini) bus id, disable scsi rst */ - outb(qlcfg5, qbase + 5); /* select timer */ - outb(qlcfg9, qbase + 9); /* prescaler */ + outb(qlcfg5, qbase + 5); /* select timer */ + outb(qlcfg9, qbase + 9); /* prescaler */ + #if QL_RESET_AT_START - outb( 3 , qbase + 3 ); + outb(3, qbase + 3); REG1; - while( inb( qbase + 0xf ) & 4 ); + /* FIXME: timeout */ + while (inb(qbase + 0xf) & 4) + cpu_relax(); REG0; #endif + #if QL_USE_IRQ -/* IRQ probe - toggle pin and check request pending */ + /* + * IRQ probe - toggle pin and check request pending + */ - if( qlirq == -1 ) { - save_flags( flags ); - cli(); + if (qlirq == -1) { i = 0xffff; j = 3; outb(0x90, qbase + 3); /* illegal command - cause interrupt */ REG1; - outb(10, 0x20); /* access pending interrupt map */ + outb(10, 0x20); /* access pending interrupt map */ outb(10, 0xa0); while (j--) { - outb(0xb0 | QL_INT_ACTIVE_HIGH , qbase + 0xd); /* int pin off */ - i &= ~(inb(0x20) | (inb(0xa0) << 8)); /* find IRQ off */ - outb(0xb4 | QL_INT_ACTIVE_HIGH , qbase + 0xd); /* int pin on */ - i &= inb(0x20) | (inb(0xa0) << 8); /* find IRQ on */ + outb(0xb0 | QL_INT_ACTIVE_HIGH, qbase + 0xd); /* int pin off */ + i &= ~(inb(0x20) | (inb(0xa0) << 8)); /* find IRQ off */ + outb(0xb4 | QL_INT_ACTIVE_HIGH, qbase + 0xd); /* int pin on */ + i &= inb(0x20) | (inb(0xa0) << 8); /* find IRQ on */ } REG0; - while (inb(qbase + 5)); /* purge int */ + while (inb(qbase + 5)); /* purge int */ j = -1; - while (i) /* find on bit */ + while (i) /* find on bit */ i >>= 1, j++; /* should check for exactly 1 on */ qlirq = j; - restore_flags( flags ); - } - else - printk( "Ql: Using preset IRQ %d\n", qlirq ); + } else + printk(KERN_INFO "Ql: Using preset IRQ %d\n", qlirq); if (qlirq >= 0 && !request_irq(qlirq, do_ql_ihandl, 0, "qlogicfas", NULL)) host->can_queue = 1; #endif - hreg = scsi_register( host , 0 ); /* no host data */ + hreg = scsi_register(host, 0); /* no host data */ if (!hreg) goto err_release_mem; hreg->io_port = qbase; hreg->n_io_port = 16; hreg->dma_channel = -1; - if( qlirq != -1 ) + if (qlirq != -1) hreg->irq = qlirq; - sprintf(qinfo, "Qlogicfas Driver version 0.46, chip %02X at %03X, IRQ %d, TPdma:%d", - qltyp, qbase, qlirq, QL_TURBO_PDMA ); + sprintf(qinfo, + "Qlogicfas Driver version 0.46, chip %02X at %03X, IRQ %d, TPdma:%d", + qltyp, qbase, qlirq, QL_TURBO_PDMA); host->name = qinfo; return 1; - err_release_mem: +err_release_mem: release_region(qbase, 0x10); if (host->can_queue) free_irq(qlirq, do_ql_ihandl); @@ -649,18 +734,20 @@ host->proc_name = "qlogicfas"; } -/*----------------------------------------------------------------*/ -/* return bios parameters */ -int qlogicfas_biosparam(Disk * disk, struct block_device *dev, int ip[]) +/* + * Return bios parameters + */ + +int qlogicfas_biosparam(Disk * disk, struct block_device *dev, int ip[]) { /* This should mimic the DOS Qlogic driver's behavior exactly */ ip[0] = 0x40; ip[1] = 0x20; - ip[2] = (unsigned long)disk->capacity / (ip[0] * ip[1]); + ip[2] = (unsigned long) disk->capacity / (ip[0] * ip[1]); if (ip[2] > 1024) { ip[0] = 0xff; ip[1] = 0x3f; - ip[2] = (unsigned long)disk->capacity / (ip[0] * ip[1]); + ip[2] = (unsigned long) disk->capacity / (ip[0] * ip[1]); #if 0 if (ip[2] > 1023) ip[2] = 1023; @@ -669,33 +756,67 @@ int qlogicfas_biosparam(Disk * disk, struct block_device *dev, int ip[]) return 0; } -/*----------------------------------------------------------------*/ -/* abort command in progress */ -int qlogicfas_abort(Scsi_Cmnd * cmd) +/* + * Abort a command in progress + */ + +static int qlogicfas_abort(Scsi_Cmnd * cmd) { qabort = 1; ql_zap(); - return 0; + return SUCCESS; } -/*----------------------------------------------------------------*/ -/* reset SCSI bus */ -int qlogicfas_reset(Scsi_Cmnd * cmd, unsigned int ignored) +/* + * Reset SCSI bus + * FIXME: This function is invoked with cmd = NULL directly by + * the PCMCIA qlogic_stub code. This wants fixing + */ + +static int qlogicfas_bus_reset(Scsi_Cmnd * cmd) { qabort = 2; ql_zap(); - return 1; + return SUCCESS; } -/*----------------------------------------------------------------*/ -/* return info string */ -const char *qlogicfas_info(struct Scsi_Host * host) +/* + * Reset SCSI host controller + */ + +static int qlogicfas_host_reset(Scsi_Cmnd * cmd) +{ + return FAILED; +} + +/* + * Reset SCSI device + */ + +static int qlogicfas_device_reset(Scsi_Cmnd * cmd) +{ + return FAILED; +} + +/* + * Return info string + */ + +static const char *qlogicfas_info(struct Scsi_Host *host) { return qinfo; } + +MODULE_AUTHOR("Tom Zerucha, Michael Griffith"); +MODULE_DESCRIPTION("Driver for the Qlogic FAS SCSI controllers"); MODULE_LICENSE("GPL"); -/* Eventually this will go into an include file, but this will be later */ -static Scsi_Host_Template driver_template = QLOGICFAS; +/* + * The driver template is also needed for PCMCIA + */ + +Scsi_Host_Template qlogicfas_driver_template = QLOGICFAS; +#define driver_template qlogicfas_driver_template + #include "scsi_module.c" diff --git a/drivers/scsi/qlogicfas.h b/drivers/scsi/qlogicfas.h index cca31ef3df58..5a02bed03c72 100644 --- a/drivers/scsi/qlogicfas.h +++ b/drivers/scsi/qlogicfas.h @@ -1,37 +1,31 @@ #ifndef _QLOGICFAS_H #define _QLOGICFAS_H -int qlogicfas_detect(Scsi_Host_Template * ); -const char * qlogicfas_info(struct Scsi_Host *); -int qlogicfas_command(Scsi_Cmnd *); -int qlogicfas_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); -int qlogicfas_abort(Scsi_Cmnd *); -int qlogicfas_reset(Scsi_Cmnd *, unsigned int); -int qlogicfas_biosparam(Disk *, struct block_device *, int[]); - -#ifndef NULL -#define NULL (0) -#endif - -#ifdef PCMCIA -#define __QLINIT __devinit -#else -#define __QLINIT __init -#endif - -#define QLOGICFAS { \ - detect: qlogicfas_detect, \ - info: qlogicfas_info, \ - command: qlogicfas_command, \ - queuecommand: qlogicfas_queuecommand, \ - abort: qlogicfas_abort, \ - reset: qlogicfas_reset, \ - bios_param: qlogicfas_biosparam, \ - can_queue: 0, \ - this_id: -1, \ - sg_tablesize: SG_ALL, \ - cmd_per_lun: 1, \ - use_clustering: DISABLE_CLUSTERING \ +static int qlogicfas_detect(Scsi_Host_Template * ); +static const char * qlogicfas_info(struct Scsi_Host *); +static int qlogicfas_command(Scsi_Cmnd *); +static int qlogicfas_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); +static int qlogicfas_abort(Scsi_Cmnd *); +static int qlogicfas_bus_reset(Scsi_Cmnd *); +static int qlogicfas_device_reset(Scsi_Cmnd *); +static int qlogicfas_host_reset(Scsi_Cmnd *); +static int qlogicfas_biosparam(Disk *, struct block_device *, int[]); + +#define QLOGICFAS { \ + detect: qlogicfas_detect, \ + info: qlogicfas_info, \ + command: qlogicfas_command, \ + queuecommand: qlogicfas_queuecommand, \ + eh_abort_handler: qlogicfas_abort, \ + eh_bus_reset_handler: qlogicfas_bus_reset, \ + eh_device_reset_handler: qlogicfas_device_reset, \ + eh_host_reset_handler: qlogicfas_host_reset, \ + bios_param: qlogicfas_biosparam, \ + can_queue: 0, \ + this_id: -1, \ + sg_tablesize: SG_ALL, \ + cmd_per_lun: 1, \ + use_clustering: DISABLE_CLUSTERING \ } #endif /* _QLOGICFAS_H */ diff --git a/drivers/scsi/seagate.c b/drivers/scsi/seagate.c index e16122a0b2ea..e520ebd26a12 100644 --- a/drivers/scsi/seagate.c +++ b/drivers/scsi/seagate.c @@ -1689,6 +1689,14 @@ static int seagate_st0x_device_reset(Scsi_Cmnd *SCpnt) return FAILED; } +static int seagate_st0x_release(struct Scsi_Host *shost) +{ + if (shost->irq) + free_irq(shost->irq, shost); + release_region(shost->io_port, shost->n_io_port); + return 0; +} + /* Eventually this will go into an include file, but this will be later */ static Scsi_Host_Template driver_template = SEAGATE_ST0X; diff --git a/drivers/scsi/seagate.h b/drivers/scsi/seagate.h index 965e88018a4a..d15de416162f 100644 --- a/drivers/scsi/seagate.h +++ b/drivers/scsi/seagate.h @@ -20,6 +20,7 @@ static int seagate_st0x_device_reset(Scsi_Cmnd *); static int seagate_st0x_host_reset(Scsi_Cmnd *); #define SEAGATE_ST0X { detect: seagate_st0x_detect, \ + release: seagate_st0x_release, \ info: seagate_st0x_info, \ command: seagate_st0x_command, \ queuecommand: seagate_st0x_queue_command, \ diff --git a/drivers/scsi/sym53c416.c b/drivers/scsi/sym53c416.c index cefb0d654e4d..f93efa121ad6 100644 --- a/drivers/scsi/sym53c416.c +++ b/drivers/scsi/sym53c416.c @@ -715,7 +715,6 @@ int __init sym53c416_detect(Scsi_Host_Template *tpnt) if(shpnt==NULL) continue; spin_lock_irqsave(&sym53c416_lock, flags); - /* FIXME: Request_irq with CLI is not safe */ /* Request for specified IRQ */ if(request_irq(hosts[i].irq, sym53c416_intr_handle, 0, ID, shpnt)) { @@ -800,12 +799,20 @@ static int sym53c416_command(Scsi_Cmnd *SCpnt) static int sym53c416_abort(Scsi_Cmnd *SCpnt) { - /* printk("sym53c416_abort\n"); */ - /* We don't know how to abort for the moment */ - return SCSI_ABORT_SNOOZE; + return FAILED; } -static int sym53c416_reset(Scsi_Cmnd *SCpnt, unsigned int reset_flags) +static int sym53c416_bus_reset(Scsi_Cmnd *SCpnt) +{ + return FAILED; +} + +static int sym53c416_device_reset(Scsi_Cmnd *SCpnt) +{ + return FAILED; +} + +static int sym53c416_host_reset(Scsi_Cmnd *SCpnt) { int base; int scsi_id = -1; @@ -813,7 +820,7 @@ static int sym53c416_reset(Scsi_Cmnd *SCpnt, unsigned int reset_flags) /* printk("sym53c416_reset\n"); */ base = SCpnt->host->io_port; - /* search scsi_id */ + /* search scsi_id - fixme, we shouldnt need to iterate for this! */ for(i = 0; i < host_index && scsi_id != -1; i++) if(hosts[i].base == base) scsi_id = hosts[i].scsi_id; @@ -821,7 +828,16 @@ static int sym53c416_reset(Scsi_Cmnd *SCpnt, unsigned int reset_flags) outb(NOOP | PIO_MODE, base + COMMAND_REG); outb(RESET_SCSI_BUS, base + COMMAND_REG); sym53c416_init(base, scsi_id); - return SCSI_RESET_PENDING; + return SUCCESS; +} + +static int sym53c416_release(struct Scsi_Host *shost) +{ + if (shost->irq) + free_irq(shost->irq, shost); + if (shost->io_port && shost->n_io_port) + release_region(shost->io_port, shost->n_io_port); + return 0; } static int sym53c416_bios_param(Disk *disk, struct block_device *dev, int *ip) diff --git a/drivers/scsi/sym53c416.h b/drivers/scsi/sym53c416.h index 0ecf3917626a..ab73d7ee9f82 100644 --- a/drivers/scsi/sym53c416.h +++ b/drivers/scsi/sym53c416.h @@ -32,28 +32,34 @@ static int sym53c416_detect(Scsi_Host_Template *); static const char *sym53c416_info(struct Scsi_Host *); +static int sym53c416_release(struct Scsi_Host *); static int sym53c416_command(Scsi_Cmnd *); static int sym53c416_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); static int sym53c416_abort(Scsi_Cmnd *); -static int sym53c416_reset(Scsi_Cmnd *, unsigned int); +static int sym53c416_host_reset(Scsi_Cmnd *); +static int sym53c416_bus_reset(Scsi_Cmnd *); +static int sym53c416_device_reset(Scsi_Cmnd *); static int sym53c416_bios_param(Disk *, struct block_device *, int *); static void sym53c416_setup(char *str, int *ints); -#define SYM53C416 { \ - proc_name: "sym53c416", \ - name: "Symbios Logic 53c416", \ - detect: sym53c416_detect, \ - info: sym53c416_info, \ - command: sym53c416_command, \ - queuecommand: sym53c416_queuecommand, \ - abort: sym53c416_abort, \ - reset: sym53c416_reset, \ - bios_param: sym53c416_bios_param, \ - can_queue: 1, \ - this_id: SYM53C416_SCSI_ID, \ - sg_tablesize: 32, \ - cmd_per_lun: 1, \ - unchecked_isa_dma: 1, \ - use_clustering: ENABLE_CLUSTERING \ - } +#define SYM53C416 { \ + .proc_name = "sym53c416", \ + .name = "Symbios Logic 53c416", \ + .detect = sym53c416_detect, \ + .info = sym53c416_info, \ + .command = sym53c416_command, \ + .queuecommand = sym53c416_queuecommand, \ + .eh_abort_handler = sym53c416_abort, \ + .eh_host_reset_handler =sym53c416_host_reset, \ + .eh_bus_reset_handler = sym53c416_bus_reset, \ + .eh_device_reset_handler =sym53c416_device_reset,\ + .release = sym53c416_release, \ + .bios_param = sym53c416_bios_param, \ + .can_queue = 1, \ + .this_id = SYM53C416_SCSI_ID, \ + .sg_tablesize = 32, \ + .cmd_per_lun = 1, \ + .unchecked_isa_dma = 1, \ + .use_clustering = ENABLE_CLUSTERING \ + } #endif diff --git a/drivers/scsi/t128.c b/drivers/scsi/t128.c index 4bd494a01a1c..b05fb4f175ee 100644 --- a/drivers/scsi/t128.c +++ b/drivers/scsi/t128.c @@ -120,6 +120,7 @@ #include <linux/stat.h> #include <linux/init.h> #include <linux/module.h> +#include <linux/delay.h> static struct override { unsigned long address; @@ -247,7 +248,7 @@ int __init t128_detect(Scsi_Host_Template * tpnt){ instance->irq = NCR5380_probe_irq(instance, T128_IRQS); if (instance->irq != IRQ_NONE) - if (request_irq(instance->irq, do_t128_intr, SA_INTERRUPT, "t128", instance)) { + if (request_irq(instance->irq, t128_intr, SA_INTERRUPT, "t128", instance)) { printk("scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); instance->irq = IRQ_NONE; diff --git a/drivers/scsi/t128.h b/drivers/scsi/t128.h index 4cbe8ce97a73..cd243b4c214f 100644 --- a/drivers/scsi/t128.h +++ b/drivers/scsi/t128.h @@ -91,14 +91,14 @@ #define T_DATA_REG_OFFSET 0x1e00 /* rw 512 bytes long */ #ifndef ASM -int t128_abort(Scsi_Cmnd *); -int t128_biosparam(Disk *, struct block_device *, int*); -int t128_detect(Scsi_Host_Template *); -int t128_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -int t128_host_reset(Scsi_Cmnd *); -int t128_bus_reset(Scsi_Cmnd *); -int t128_device_reset(Scsi_Cmnd *); -int t128_proc_info (char *buffer, char **start, off_t offset, +static int t128_abort(Scsi_Cmnd *); +static int t128_biosparam(Disk *, struct block_device *, int*); +static int t128_detect(Scsi_Host_Template *); +static int t128_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); +static int t128_host_reset(Scsi_Cmnd *); +static int t128_bus_reset(Scsi_Cmnd *); +static int t128_device_reset(Scsi_Cmnd *); +static int t128_proc_info (char *buffer, char **start, off_t offset, int length, int hostno, int inout); #ifndef NULL @@ -166,7 +166,7 @@ int t128_proc_info (char *buffer, char **start, off_t offset, #define do_NCR5380_intr do_t128_intr #define NCR5380_queue_command t128_queue_command #define NCR5380_abort t128_abort -#define NCR5380_host_reset t128_hostreset +#define NCR5380_host_reset t128_host_reset #define NCR5380_device_reset t128_device_reset #define NCR5380_bus_reset t128_bus_reset #define NCR5380_proc_info t128_proc_info diff --git a/drivers/scsi/u14-34f.c b/drivers/scsi/u14-34f.c index 993109521385..aa8b8e16e310 100644 --- a/drivers/scsi/u14-34f.c +++ b/drivers/scsi/u14-34f.c @@ -1,6 +1,15 @@ /* * u14-34f.c - Low-level driver for UltraStor 14F/34F SCSI host adapters. * + * 10 Oct 2002 Rev. 7.70 for linux 2.5.42 + * + Foreport from revision 6.70. + * + * 25 Jun 2002 Rev. 6.70 for linux 2.4.19 + * + Fixed endian-ness problem due to bitfields. + * + * 21 Feb 2002 Rev. 6.52 for linux 2.4.18 + * + Backport from rev. 7.22 (use io_request_lock). + * * 20 Feb 2002 Rev. 7.22 for linux 2.5.5 * + Remove any reference to virt_to_bus(). * + Fix pio hang while detecting multiple HBAs. @@ -393,6 +402,10 @@ MODULE_AUTHOR("Dario Ballabio"); #include <linux/ctype.h> #include <linux/spinlock.h> +#if !defined(__BIG_ENDIAN_BITFIELD) && !defined(__LITTLE_ENDIAN_BITFIELD) +#error "Adjust your <asm/byteorder.h> defines" +#endif + /* Values for the PRODUCT_ID ports for the 14/34F */ #define PRODUCT_ID1 0x56 #define PRODUCT_ID2 0x40 /* NOTE: Only upper nibble is used */ @@ -459,7 +472,7 @@ MODULE_AUTHOR("Dario Ballabio"); #define REG_CONFIG2 7 #define REG_OGM 8 #define REG_ICM 12 -#define REGION_SIZE 13 +#define REGION_SIZE 13UL #define BSY_ASSERTED 0x01 #define IRQ_ASSERTED 0x01 #define CMD_RESET 0xc0 @@ -481,14 +494,21 @@ struct sg_list { /* MailBox SCSI Command Packet */ struct mscp { - unsigned char opcode: 3; /* type of command */ - unsigned char xdir: 2; /* data transfer direction */ - unsigned char dcn: 1; /* disable disconnect */ - unsigned char ca: 1; /* use cache (if available) */ - unsigned char sg: 1; /* scatter/gather operation */ - unsigned char target: 3; /* SCSI target id */ - unsigned char channel: 2; /* SCSI channel number */ - unsigned char lun: 3; /* SCSI logical unit number */ + +#if defined(__BIG_ENDIAN_BITFIELD) + unsigned char sg:1, ca:1, dcn:1, xdir:2, opcode:3; + unsigned char lun: 3, channel:2, target:3; +#else + unsigned char opcode: 3, /* type of command */ + xdir: 2, /* data transfer direction */ + dcn: 1, /* disable disconnect */ + ca: 1, /* use cache (if available) */ + sg: 1; /* scatter/gather operation */ + unsigned char target: 3, /* SCSI target id */ + channel: 2, /* SCSI channel number */ + lun: 3; /* SCSI logical unit number */ +#endif + unsigned int data_address PACKED; /* transfer data pointer */ unsigned int data_len PACKED; /* length in bytes */ unsigned int link_address PACKED; /* for linking command chains */ @@ -730,17 +750,27 @@ static inline int port_detect \ }; struct config_1 { - unsigned char bios_segment: 3; - unsigned char removable_disks_as_fixed: 1; - unsigned char interrupt: 2; - unsigned char dma_channel: 2; + +#if defined(__BIG_ENDIAN_BITFIELD) + unsigned char dma_channel: 2, interrupt:2, + removable_disks_as_fixed:1, bios_segment: 3; +#else + unsigned char bios_segment: 3, removable_disks_as_fixed: 1, + interrupt: 2, dma_channel: 2; +#endif + } config_1; struct config_2 { - unsigned char ha_scsi_id: 3; - unsigned char mapping_mode: 2; - unsigned char bios_drive_number: 1; - unsigned char tfr_port: 2; + +#if defined(__BIG_ENDIAN_BITFIELD) + unsigned char tfr_port: 2, bios_drive_number: 1, + mapping_mode: 2, ha_scsi_id: 3; +#else + unsigned char ha_scsi_id: 3, mapping_mode: 2, + bios_drive_number: 1, tfr_port: 2; +#endif + } config_2; char name[16]; diff --git a/drivers/scsi/u14-34f.h b/drivers/scsi/u14-34f.h index fe8fe7830a1a..197958470758 100644 --- a/drivers/scsi/u14-34f.h +++ b/drivers/scsi/u14-34f.h @@ -13,7 +13,7 @@ int u14_34f_abort(Scsi_Cmnd *); int u14_34f_reset(Scsi_Cmnd *); int u14_34f_biosparam(Disk *, struct block_device *, int *); -#define U14_34F_VERSION "7.22.00" +#define U14_34F_VERSION "7.70.00" #define ULTRASTOR_14_34F { \ name: "UltraStor 14F/34F rev. " U14_34F_VERSION " ", \ diff --git a/drivers/usb/media/se401.c b/drivers/usb/media/se401.c index 2ca284aed0db..87029897b56d 100644 --- a/drivers/usb/media/se401.c +++ b/drivers/usb/media/se401.c @@ -697,7 +697,8 @@ static int se401_set_size(struct usb_se401 *se401, int width, int height) static inline void enhance_picture(unsigned char *frame, int len) { while (len--) { - *frame++=(((*frame^255)*(*frame^255))/255)^255; + *frame=(((*frame^255)*(*frame^255))/255)^255; + frame++; } } @@ -931,7 +932,8 @@ static inline void decode_bayer (struct usb_se401 *se401, struct se401_scratch * /* Fix the top line */ framedata+=linelength; for (i=0; i<linelength; i++) { - *--framedata=*(framedata+linelength); + framedata--; + *framedata=*(framedata+linelength); } /* Fix the left side (green is already present) */ for (i=0; i<se401->cheight; i++) { diff --git a/fs/Config.help b/fs/Config.help index 76ffd7584add..c14858d2f6c7 100644 --- a/fs/Config.help +++ b/fs/Config.help @@ -963,6 +963,28 @@ CONFIG_VXFS_FS module, say M here and read <file:Documentation/modules.txt>. If unsure, say N. +CONFIG_BEFS_FS + The BeOS File System (BeFS) is the native file system of Be, Inc's + BeOS. Notable features include support for arbitrary attributes + on files and directories, and database-like indices on selected + attributes. (Also note that this driver doesn't make those features + available at this time). It is a 64 bit filesystem, so it supports + extreemly large volumes and files. + + If you use this filesystem, you should also say Y to at least one + of the NLS (native language support) options below. + + If you don't know what this is about, say N. + + If you want to compile this as a module ( = code which can be + inserted in and removed from the running kernel whenever you want), + say M here and read Documentation/modules.txt. The module will be + called befs.o. + +CONFIG_BEFS_DEBUG + If you say Y here, you can use the 'debug' mount option to enable + debugging output from the driver. + CIFS (Common Internet File System) support CONFIG_CIFS This is the client VFS module for the Common Internet File System diff --git a/fs/Config.in b/fs/Config.in index 0464a17a8dbd..6d3b881c76ff 100644 --- a/fs/Config.in +++ b/fs/Config.in @@ -24,6 +24,9 @@ dep_tristate 'Amiga FFS file system support (EXPERIMENTAL)' CONFIG_AFFS_FS $CONF dep_tristate 'Apple Macintosh file system support (EXPERIMENTAL)' CONFIG_HFS_FS $CONFIG_EXPERIMENTAL +dep_tristate 'BeOS file systemv(BeFS) support (read only) (EXPERIMENTAL)' CONFIG_BEFS_FS $CONFIG_EXPERIMENTAL +dep_mbool ' Debug BeFS' CONFIG_BEFS_DEBUG $CONFIG_BEFS_FS + dep_tristate 'BFS file system support (EXPERIMENTAL)' CONFIG_BFS_FS $CONFIG_EXPERIMENTAL tristate 'Ext3 journalling file system support' CONFIG_EXT3_FS diff --git a/fs/Makefile b/fs/Makefile index 68d7074b5ae2..9a6376173af9 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -87,5 +87,6 @@ obj-$(CONFIG_SUN_OPENPROMFS) += openpromfs/ obj-$(CONFIG_JFS_FS) += jfs/ obj-$(CONFIG_XFS_FS) += xfs/ obj-$(CONFIG_AFS_FS) += afs/ +obj-$(CONFIG_BEFS_FS) += befs/ include $(TOPDIR)/Rules.make diff --git a/fs/befs/ChangeLog b/fs/befs/ChangeLog new file mode 100644 index 000000000000..8e09a0bd8ebb --- /dev/null +++ b/fs/befs/ChangeLog @@ -0,0 +1,417 @@ +Version 0.92 (2002-03-29) +========== +* Minor cleanup. Ran Lindent on the sources. + +Version 0.92 (2002-03-27) +========== +* Fixed module makefile problem. It was not compiling all the correct + source files! +* Removed duplicated function definition +* Fixed potential null pointer dereference when reporting an error + +Version 0.91 (2002-03-26) +========== +* Oy! Fixed stupid bug that would cause an unresolved symbol error. + Thanks to Laszlo Boszormenyi for pointing this out to me. + +Version 0.9 (2002-03-14) +========== +* Added Sergey S. Kostyliov's patch to eliminate memcpy() overhead + from b+tree operations. Changes the befs_read_datastream() interface. + +* Segregated the functions that interface directly with the linux vfs + interface into their own file called linuxvfs.c. [WD] + +Version 0.64 (2002-02-07) +========== +* Did the string comparision really right this time (btree.c) [WD] + +* Fixed up some places where I assumed that a long int could hold + a pointer value. (btree.c) [WD] + +* Andrew Farnham <andrewfarnham@uq.net.au> pointed out that the module + wouldn't work on older (<2.4.10) kernels due to an unresolved symbol. + This is bad, since 2.4.9 is still the current RedHat kernel. I added + a workaround for this problem (compatability.h) [WD] + +* Sergey S. Kostyliov made befs_find_key() use a binary search to find + keys within btree nodes, rather than the linear search we were using + before. (btree.c) [Sergey S. Kostyliov <rathamahata@php4.ru>] + +* Made a debian package of the source for use with kernel-package. [WD] + + +Version 0.63 (2002-01-31) +========== +* Fixed bug in befs_find_brun_indirect() that would result in the wrong + block being read. It was introduced when adding byteswapping in + 0.61. (datastream.c) [WD] + +* Fixed a longstanding bug in befs_find_key() that would result in it + finding the first key that is a substring of the string it is searching + for. For example, this would cause files in the same directory with + names like file1 and file2 to mysteriously be duplicates of each other + (because they have the same inode number). Many thanks to Pavel Roskin + for reporting this serious bug!!! + (btree.c) [WD] + +* Added support for long symlinks, after Axel Dorfler explained up how + they work. I had forgotten all about them. (inode.c, symlink.c) [WD] + +* Documentation improvements in source. [WD] + +* Makefile fix for independant module when CONFIG_MODVERSION is set in + kernel config [Pavel Roskin <proski@gnu.org>] + +* Compile warning fix for namei.c. [Sergey S. Kostyliov <rathamahata@php4.ru>] + + +Version 0.62 +========== +* Fixed makefile for module install [WD] + + +Version 0.61 (2002-01-20) +========== +* Made functions in endian.h to do the correct byteswapping, no matter + the arch. [WD] + +* Abbandoned silly checks for a NULL superblock pointer in debug.c. [WD] + +* Misc code cleanups. Also cleanup of this changelog file. [WD] + +* Added byteswapping to all metadata reads from disk. + Uses the functions from endian.h [WD] + +* Remove the typedef of struct super_block to vfs_sb, as it offended + certain peoples' aesthetic sense. [WD] + +* Ditto with the befs_read_block() interface. [WD] + + +Version 0.6 (2001-12-15) +========== +* Cleanup of NLS functions (util.c) [WD] + +* Make directory lookup/read use the NLS if an iocharset is provided. [WD] + +* Fixed stupid bug where specifying the uid or gid mount options as '0' + would result in the filesystem using the on-disk uid and gid. [WD] + +* Added mount option to control debug printing. + The option is, simply enough, 'debug'. + (super.c, debug.c) [WD] + +* Removed notion of btree handle from btree.c. It was unessisary, as the + linux VFS doesn't allow us to keep any state between calls. Updated + dir.c, namei.c befs_fs.h to account for it. [WD] + +* Improved handleing of overflow nodes when listing directories. + Now works for overflow nodes hanging off of nodes other than the root + node. This is the cleaner solution to Brent Miszalaski's problem. [WD] + +* Added new debug/warning/error print functions in debug.c. + More flexible. Will soon be controllable at mount time + (see TODO). [WD] + +* Rewrote datastream positon lookups. + (datastream.c) [WD] + +* Moved the TODO list to it's own file. + + +Version 0.50 (2001-11-13) +========== +* Added workaround for mis-understanding of the nature of the b+trees used + in directories. A cleaner solution will come after I've thought about it + for a while. Thanks to Brent Miszalaski for finding and reporting this bug. + (btree.c) [WD] + +* Minor cleanups + +* Added test for "impossible" condition of empty internal nodes in + seekleaf() in btree.c [WD] + +* Implemented the abstracted read_block() in io.c [WD] + +* Cleaned up the inode validation in inode.c [WD] + +* Anton Altaparmakov figured out (by asking Linus :) ) what was causing the + hanging disk io problem. It turns out you need to have the sync_pages + callback defined in your address_space_ops, even if it just uses the + default linux-supplied implementation. Fixed. Works now. + (file.c) [WD] + +* Anton Altaparmakov and Christoph Hellwig alerted me to the fact that + filesystem code should be using GFP_NOFS instead of GFP_KERNEL as the + priority parameter to kmalloc(). Fixed. + (datastream.c, btree.c super.c inode.c) [WD] + +* Anton also told me that the blocksize is not allowed to be larger than + the page size in linux, which is 4k i386. Oops. Added a test for + (blocksize > PAGE_SIZE), and refuse to mount in that case. What this + practicaly means is that 8k blocksize volumes won't work without a major + restructuring of the driver (or an alpha or other 64bit hardware). [WD] + +* Cleaned up the befs_count_blocks() function. Much smarter now. + And somewhat smaller too. [WD] + +* Made inode allocations use a slab cache + (super.c inode.c) [WD] + +* Moved the freeing of the private inode section from put_inode() to + clear_inode(). This fixes a potential free twice type bug. Put_inode() + can be called multiple times for each inode struct. [WD] + +* Converted all non vfs-callback functions to use befs_sb_info as the + superblock type, rather than struct super_block. This is for + portablity. [WD] + +* Fixed a couple of compile warnings due to use of malloc.h, when slab.h + is the new way. (inode.c, super.c) [WD] + +* Fixed erronous includes of linux/befs_fs_i.h and linux/befs_fs_sb.h + in inode.c [WD] + +Version 0.45 (2001-10-29) +========== +* Added functions to get the private superblock and inode structures from + their enclosing public structures. Switched all references to the + private portions to use them. (many files) [WD] + +* Made read_super and read_inode allocate the private portions of those + structures into the generic pointer fields of the public structures + with kmalloc(). put_super and put_inode free them. This allows us not + to have to touch the definitions of the public structures in + include/linux/fs.h. Also, befs_inode_info is huge (becuase of the + symlink string). (super.c, inode.c, befs_fs.h) [WD] + +* Fixed a thinko that was corrupting file reads after the first block_run + is done being read. (datastream.c) [WD] + +* Removed fsync() hooks, since a read-only filesystem doesn't need them. + [Christoph Hellwig]. + +* Fixed befs_readlink() (symlink.c) [Christoph Hellwig]. + +* Removed all the Read-Write stuff. I'll redo it when it is time to add + write support (various files) [WD]. + +* Removed prototypes for functions who's definitions have been removed + (befs_fs.h) [WD]. + + +Version 0.4 (2001-10-28) +========== +* Made it an option to use the old non-pagecache befs_file_read() for + testing purposes. (fs/Config.in) + +* Fixed unused variable warnings when compiling without debugging. + +* Fixed a bug where the inode and super_block didn't get their blockbits + fields set (inode.c and super.c). + +* Release patch version 11. AKA befs-driver version 0.4. + +* Thats right. New versioning scheme. + I've done some serious testing on it now (on my box anyhow), and it + seems stable and not outragously slow. Existing features are more-or-less + correct (see TODO list). But it isn't 1.0 yet. I think 0.4 gives me some + headroom before the big 1.0. + + +2001-10-26 +========== +* Fixed date format in this file. Was I smoking crack? + +* Removed old datastream code from file.c, since it is nolonger used. + +* Generic_read_file() is now used to read regular file data. + It doesn't chew up the buffer cache (it does page io instead), and seems + to be about as fast (even though it has to look up each file block + indivdualy). And it knows about doing readahead, which is a major plus. + So it does i/o in much larger chunks. It is the correct linux way. It + uses befs_get_block() by way of befs_readpage() to find the disk offsets + of blocks, which in turn calls befs_fpos2brun() in datastream.c to do + the hard work of finding the disk block number. + +* Changed method of checking for a dirty filesystem in befs_read_super + (super.c). Now we check to see if log_start and log_end differ. If so, + the journal needs to be replayed, and the filesystem cannot be mounted. + +* Fixed an extra instance of MOD_DEC_USE_COUNT in super.c + +* Fixed a problem with reading the superblock on devices with large sector + sizes (such as cdroms) on linux 2.4.10 and up. + +2001-10-24 +========== +* Fix nasty bug in converting block numbers to struct befs_inode_addr. + Subtle, because the old version was only sometimes wrong. + Probably responsible for lots of problems. (inode.c) + +* Fix bug with reading an empty directory. (btree.c and dir.c) + +* This one looks good. Release patch version 10 + +2001-10-23 +========== +* Added btree searching function. + +* Use befs_btree_find in befs_lookup (namei.c) + +* Additional comments in btree.c + +2001-10-22 +========== +* Added B+tree reading functions (in btree.c). + Made befs_readdir() use them them instead of the cruft in index.c. + +2001-09-11 +========== +* Converted befs_read_file() to use the new datastream code. + +* Finally updated the README file. + +* Added many comments. + +* Posted version 6 + +* Removed byte-order conversion code. + I have no intention of supporting it, and it was very ugly. + Flow control with #ifdef (ugh). Maybe I'll redo it once + native byteorder works 100%. + +2001-09-10 +========== +* Finished implementing read_datastream() + +* made befs_read_brun() more general + Supports an offset to start at and a max bytes to read + Added a wrapper function to give the old call + +2001-09-30 +========== +* Discovered that the datastream handleing code in file.c is quite deficient + in several respects. For one thing, it doesn't deal with indirect blocks + +* Rewrote datastream handleing. + +* Created io.c, for io related functions. + Previously, the befs_bread() funtions lived in file.c + Created the befs_read_brun() function. + + +2001-09-07 +========== +* Made a function to actually count the number of fs blocks used by a file. + And helper functions. + (fs/befs/inode.c) + +2001-09-05 +========== +* Fixed a misunderstanding of the inode fields. + This fixed the problmem with wrong file sizes from du and others. + The i_blocks field of the inode struct is not the nuber of blocks for the + inode, it is the number of blocks for the file. Also, i_blksize is not + nessisarily the size of the inode, although in practice it works out. + Changed to blocksize of filesystem. + (fs/befs/inode.c) + +* Permanently removed code that had been provisionally ifdefed out of befs_fs.h + +* Since we don't support access time, make that field zero, instead of + copying m_time. + (fs/befs/inode.c) + +* Added sanity check for inode reading + Make sure inode we got was the one we asked for. + (fs/befs/inode.c) + +* Code cleanup + Local pointers to commonly used structures in inode.c. + Got rid of abominations befs_iaddr2inode() and befs_inode2ino(). + Replaced with single function iaddr2blockno(). + (fs/befs/super.c) (fs/befs/inode.c) + +2001-09-01 +========== +* Fixed the problem with statfs where it would always claim the disk was + half full, due to improper understanding of the statfs fields. + (fs/befs/super.c) + +* Posted verion 4 of the patch + +2001-09-01 +========== +* Changed the macros in befs_fs.h to inline functions. + More readable. Typesafe. Better + (include/linux/befs_fs.h) + +* Moved type definitions from befs_fs.h to a new file, befs_fs_types.h + Because befs_fs_i.h and befs_fs_sb.h were including befs_fs.h for the + typedefs, and they are inlcuded in <linux/fs.h>, which has definitions + that I want the inline functions in befs_fs.h to be able to see. Nasty + circularity. + (include/linux/befs_fs.h) + +2001-08-30 +========== +* Cleaned up some wording. + +* Added additional consitency checks on mount + Check block_size agrees with block_shift + Check flags == BEFS_CLEAN + (fs/befs/super.c) + +* Tell the kernel to only mount befs read-only. + By setting the MS_RDONLY flag in befs_read_super(). + Not that it was possible to write before. But now the kernel won't even try. + (fs/befs/super.c) + +* Got rid of kernel warning on mount. + The kernel doesn't like it if you call set_blocksize() on a device when + you have some of its blocks open. Moved the second set_blocksize() to the + very end of befs_read_super(), after we are done with the disk superblock. + (fs/befs/super.c) + +* Fixed wrong number of args bug in befs_dump_inode + (fs/befs/debug.c) + +* Solved lots of type mismatches in kprint()s + (everwhere) + +2001-08-27 +========== +* Cleaned up the fs/Config.in entries a bit, now slightly more descriptive. + +* BeFS depends on NLS, so I made activating BeFS enable the NLS questions + (fs/nls/Config.in) + +* Added Configure.help entries for CONFIG_BEFS_FS and CONFIG_DEBUG_BEFS + (Documentation/Configure.help) + +2001-08-?? +========== +* Removed superblock locking calls in befs_read_super(). In 2.4, the VFS + hands us a super_block struct that is already locked. + +2001-08-13 +========== +* Will Dyson <will_dyson@pobox.com> is now attempting to maintain this module + Makoto Kato <m_kato@ga2.so-net.ne.jp> is original author.Daniel Berlin + also did some work on it (fixing it up for the later 2.3.x kernels, IIRC). + +* Fixed compile errors on 2.4.1 kernel (WD) + Resolve rejected patches + Accomodate changed NLS interface (util.h) + Needed to include <linux/slab.h> in most files + Makefile changes + fs/Config.in changes + +* Tried to niceify the code using the ext2 fs as a guide + Declare befs_fs_type using the DECLARE_FSTYPE_DEV() macro + +* Made it a configure option to turn on debugging (fs/Config.in) + +* Compiles on 2.4.7 diff --git a/fs/befs/Makefile b/fs/befs/Makefile new file mode 100644 index 000000000000..b6cd2c94e3f6 --- /dev/null +++ b/fs/befs/Makefile @@ -0,0 +1,15 @@ +# +# Makefile for the linux BeOS filesystem routines. +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (ie not a .c file). +# +# Note 2! The CFLAGS definitions are now in the main makefile... + + +obj-$(CONFIG_BEFS_FS) += befs.o + +befs-objs := datastream.o btree.o super.o inode.o debug.o io.o linuxvfs.o + +include $(TOPDIR)/Rules.make diff --git a/fs/befs/TODO b/fs/befs/TODO new file mode 100644 index 000000000000..3250921aa2e6 --- /dev/null +++ b/fs/befs/TODO @@ -0,0 +1,14 @@ +TODO +========== + +* Convert comments to the Kernel-Doc format. + +* Befs_fs.h has gotten big and messy. No reason not to break it up into + smaller peices. + +* See if Alexander Viro's option parser made it into the kernel tree. + Use that if we can. (include/linux/parser.h) + +* See if we really need separate types for on-disk and in-memory + representations of the superblock and inode. + diff --git a/fs/befs/attribute.c b/fs/befs/attribute.c new file mode 100644 index 000000000000..e329d727053e --- /dev/null +++ b/fs/befs/attribute.c @@ -0,0 +1,117 @@ +/* + * linux/fs/befs/attribute.c + * + * Copyright (C) 2002 Will Dyson <will_dyson@pobox.com> + * + * Many thanks to Dominic Giampaolo, author of "Practical File System + * Design with the Be File System", for such a helpful book. + * + */ + +#include <linux/fs.h> +#include <linux/kernel.h> +#include <linux/string.h> + +#include "befs.h" +#include "endian.h" + +#define SD_DATA(sd)\ + (void*)((char*)sd + sizeof(*sd) + (sd->name_size - sizeof(sd->name))) + +#define SD_NEXT(sd)\ + (befs_small_data*)((char*)sd + sizeof(*sd) + (sd->name_size - \ + sizeof(sd->name) + sd->data_size)) + +int +list_small_data(struct super_block *sb, befs_inode * inode, filldir_t filldir); + +befs_small_data * +find_small_data(struct super_block *sb, befs_inode * inode, + const char *name); +int +read_small_data(struct super_block *sb, befs_inode * inode, + befs_small_data * sdata, void *buf, size_t bufsize); + +/** + * + * + * + * + * + */ +befs_small_data * +find_small_data(struct super_block *sb, befs_inode * inode, const char *name) +{ + befs_small_data *sdata = inode->small_data; + + while (sdata->type != 0) { + if (strcmp(name, sdata->name) != 0) { + return sdata; + } + sdata = SD_NEXT(sdata); + } + return NULL; +} + +/** + * + * + * + * + * + */ +int +read_small_data(struct super_block *sb, befs_inode * inode, + const char *name, void *buf, size_t bufsize) +{ + befs_small_data *sdata; + + sdata = find_small_data(sb, inode, name); + if (sdata == NULL) + return BEFS_ERR; + else if (sdata->data_size > bufsize) + return BEFS_ERR; + + memcpy(buf, SD_DATA(sdata), sdata->data_size); + + return BEFS_OK; +} + +/** + * + * + * + * + * + */ +int +list_small_data(struct super_block *sb, befs_inode * inode) +{ + +} + +/** + * + * + * + * + * + */ +int +list_attr(struct super_block *sb, befs_inode * inode) +{ + +} + +/** + * + * + * + * + * + */ +int +read_attr(struct super_block *sb, befs_inode * inode) +{ + +} diff --git a/fs/befs/befs.h b/fs/befs/befs.h new file mode 100644 index 000000000000..abe345e5fc3f --- /dev/null +++ b/fs/befs/befs.h @@ -0,0 +1,158 @@ +/* + * befs.h + * + * Copyright (C) 2001-2002 Will Dyson <will_dyson@pobox.com> + * Copyright (C) 1999 Makoto Kato (m_kato@ga2.so-net.ne.jp) + */ + +#ifndef _LINUX_BEFS_H +#define _LINUX_BEFS_H + +#include "befs_fs_types.h" + +/* used in debug.c */ +#define BEFS_VERSION "0.9.3" + + +/* Sector_t makes this sillyness obsolete */ +typedef u64 befs_blocknr_t; +typedef u32 vfs_blocknr_t; + +/* + * BeFS in memory structures + */ + +typedef struct befs_mount_options { + gid_t gid; + uid_t uid; + int use_gid; + int use_uid; + int debug; + char *iocharset; +} befs_mount_options; + +typedef struct befs_sb_info { + u32 magic1; + u32 block_size; + u32 block_shift; + int byte_order; + befs_off_t num_blocks; + befs_off_t used_blocks; + u32 inode_size; + u32 magic2; + + /* Allocation group information */ + u32 blocks_per_ag; + u32 ag_shift; + u32 num_ags; + + /* jornal log entry */ + befs_block_run log_blocks; + befs_off_t log_start; + befs_off_t log_end; + + befs_inode_addr root_dir; + befs_inode_addr indices; + u32 magic3; + + befs_mount_options mount_opts; + struct nls_table *nls; + +} befs_sb_info; + +typedef struct befs_inode_info { + u32 i_flags; + u32 i_type; + + befs_inode_addr i_inode_num; + befs_inode_addr i_parent; + befs_inode_addr i_attribute; + + union { + befs_data_stream ds; + char symlink[BEFS_SYMLINK_LEN]; + } i_data; + + struct inode vfs_inode; + +} befs_inode_info; + +enum befs_err { + BEFS_OK, + BEFS_ERR, + BEFS_BAD_INODE, + BEFS_BT_END, + BEFS_BT_EMPTY, + BEFS_BT_MATCH, + BEFS_BT_PARMATCH, + BEFS_BT_NOT_FOUND +}; + + +/****************************/ +/* debug.c */ +void befs_error(const struct super_block *sb, const char *fmt, ...); +void befs_warning(const struct super_block *sb, const char *fmt, ...); +void befs_debug(const struct super_block *sb, const char *fmt, ...); + +void befs_dump_super_block(const struct super_block *sb, befs_super_block *); +void befs_dump_inode(const struct super_block *sb, befs_inode *); +void befs_dump_index_entry(const struct super_block *sb, befs_btree_super *); +void befs_dump_index_node(const struct super_block *sb, befs_btree_nodehead *); +void befs_dump_inode_addr(const struct super_block *sb, befs_inode_addr); +/****************************/ + + +/* Gets a pointer to the private portion of the super_block + * structure from the public part + */ +static inline befs_sb_info * +BEFS_SB(const struct super_block *super) +{ + return (befs_sb_info *) super->s_fs_info; +} + +static inline befs_inode_info * +BEFS_I(const struct inode *inode) +{ + return list_entry(inode, struct befs_inode_info, vfs_inode); +} + +static inline befs_blocknr_t +iaddr2blockno(struct super_block *sb, befs_inode_addr * iaddr) +{ + return ((iaddr->allocation_group << BEFS_SB(sb)->ag_shift) + + iaddr->start); +} + +static inline befs_inode_addr +blockno2iaddr(struct super_block *sb, befs_blocknr_t blockno) +{ + befs_inode_addr iaddr; + iaddr.allocation_group = blockno >> BEFS_SB(sb)->ag_shift; + iaddr.start = + blockno - (iaddr.allocation_group << BEFS_SB(sb)->ag_shift); + iaddr.len = 1; + + return iaddr; +} + +static inline unsigned int +befs_iaddrs_per_block(struct super_block *sb) +{ + return BEFS_SB(sb)->block_size / sizeof (befs_inode_addr); +} + +static inline int +befs_iaddr_is_empty(befs_inode_addr * iaddr) +{ + return (!iaddr->allocation_group) && (!iaddr->start) && (!iaddr->len); +} + +static inline size_t +befs_brun_size(struct super_block *sb, befs_block_run run) +{ + return BEFS_SB(sb)->block_size * run.len; +} + +#endif /* _LINUX_BEFS_H */ diff --git a/fs/befs/befs_fs_types.h b/fs/befs/befs_fs_types.h new file mode 100644 index 000000000000..9095518e918d --- /dev/null +++ b/fs/befs/befs_fs_types.h @@ -0,0 +1,213 @@ +/* + * include/linux/befs_fs_types.h + * + * Copyright (C) 2001 Will Dyson (will@cs.earlham.edu) + * + * + * + * from linux/include/linux/befs_fs.h + * + * Copyright (C) 1999 Makoto Kato (m_kato@ga2.so-net.ne.jp) + * + */ + +#ifndef _LINUX_BEFS_FS_TYPES +#define _LINUX_BEFS_FS_TYPES + +#ifdef __KERNEL__ +#include <linux/types.h> +#endif /*__KERNEL__*/ + +#define PACKED __attribute__ ((__packed__)) + +/* + * Max name lengths of BFS + */ + +#define BEFS_NAME_LEN 255 + +#define BEFS_SYMLINK_LEN 144 +#define BEFS_NUM_DIRECT_BLOCKS 12 +#define B_OS_NAME_LENGTH 32 + +/* The datastream blocks mapped by the double-indirect + * block are always 4 fs blocks long. + * This eliminates the need for linear searches among + * the potentially huge number of indirect blocks + * + * Err. Should that be 4 fs blocks or 4k??? + * It matters on large blocksize volumes + */ +#define BEFS_DBLINDIR_BRUN_LEN 4 + +/* + * Flags of superblock + */ + +enum super_flags { + BEFS_BYTESEX_BE, + BEFS_BYTESEX_LE, + BEFS_CLEAN = 0x434c454e, + BEFS_DIRTY = 0x44495254, + BEFS_SUPER_MAGIC1 = 0x42465331, /* BFS1 */ + BEFS_SUPER_MAGIC2 = 0xdd121031, + BEFS_SUPER_MAGIC3 = 0x15b6830e, +}; + +#define BEFS_BYTEORDER_NATIVE 0x42494745 + +#define BEFS_SUPER_MAGIC BEFS_SUPER_MAGIC1 + +/* + * Flags of inode + */ + +#define BEFS_INODE_MAGIC1 0x3bbe0ad9 + +enum inode_flags { + BEFS_INODE_IN_USE = 0x00000001, + BEFS_ATTR_INODE = 0x00000004, + BEFS_INODE_LOGGED = 0x00000008, + BEFS_INODE_DELETED = 0x00000010, + BEFS_LONG_SYMLINK = 0x00000040, + BEFS_PERMANENT_FLAG = 0x0000ffff, + BEFS_INODE_NO_CREATE = 0x00010000, + BEFS_INODE_WAS_WRITTEN = 0x00020000, + BEFS_NO_TRANSACTION = 0x00040000, +}; +/* + * On-Disk datastructures of BeFS + */ + +typedef u64 befs_off_t; +typedef u64 befs_time_t; +typedef void befs_binode_etc; + +/* Block runs */ +typedef struct { + u32 allocation_group; + u16 start; + u16 len; +} PACKED befs_block_run; + +typedef befs_block_run befs_inode_addr; + +/* + * The Superblock Structure + */ +typedef struct { + char name[B_OS_NAME_LENGTH]; + u32 magic1; + u32 fs_byte_order; + + u32 block_size; + u32 block_shift; + + befs_off_t num_blocks; + befs_off_t used_blocks; + + u32 inode_size; + + u32 magic2; + u32 blocks_per_ag; + u32 ag_shift; + u32 num_ags; + + u32 flags; + + befs_block_run log_blocks; + befs_off_t log_start; + befs_off_t log_end; + + u32 magic3; + befs_inode_addr root_dir; + befs_inode_addr indices; + +} PACKED befs_super_block; + +/* + * Note: the indirect and dbl_indir block_runs may + * be longer than one block! + */ +typedef struct { + befs_block_run direct[BEFS_NUM_DIRECT_BLOCKS]; + befs_off_t max_direct_range; + befs_block_run indirect; + befs_off_t max_indirect_range; + befs_block_run double_indirect; + befs_off_t max_double_indirect_range; + befs_off_t size; +} PACKED befs_data_stream; + +/* Attribute */ +typedef struct { + u32 type; + u16 name_size; + u16 data_size; + char name[1]; +} PACKED befs_small_data; + +/* Inode structure */ +typedef struct { + u32 magic1; + befs_inode_addr inode_num; + u32 uid; + u32 gid; + u32 mode; + u32 flags; + befs_time_t create_time; + befs_time_t last_modified_time; + befs_inode_addr parent; + befs_inode_addr attributes; + u32 type; + + u32 inode_size; + u32 etc; /* not use */ + + union { + befs_data_stream datastream; + char symlink[BEFS_SYMLINK_LEN]; + } data; + + u32 pad[4]; /* not use */ + befs_small_data small_data[1]; +} PACKED befs_inode; + +/* + * B+tree superblock + */ + +#define BEFS_BTREE_MAGIC 0x69f6c2e8 + +enum btree_types { + BTREE_STRING_TYPE = 0, + BTREE_INT32_TYPE = 1, + BTREE_UINT32_TYPE = 2, + BTREE_INT64_TYPE = 3, + BTREE_UINT64_TYPE = 4, + BTREE_FLOAT_TYPE = 5, + BTREE_DOUBLE_TYPE = 6 +}; + +typedef struct { + u32 magic; + u32 node_size; + u32 max_depth; + u32 data_type; + befs_off_t root_node_ptr; + befs_off_t free_node_ptr; + befs_off_t max_size; +} PACKED befs_btree_super; + +/* + * Header stucture of each btree node + */ +typedef struct { + befs_off_t left; + befs_off_t right; + befs_off_t overflow; + u16 all_key_count; + u16 all_key_length; +} PACKED befs_btree_nodehead; + +#endif /* _LINUX_BEFS_FS_TYPES */ diff --git a/fs/befs/btree.c b/fs/befs/btree.c new file mode 100644 index 000000000000..0a7164836b11 --- /dev/null +++ b/fs/befs/btree.c @@ -0,0 +1,786 @@ +/* + * linux/fs/befs/btree.c + * + * Copyright (C) 2001-2002 Will Dyson <will_dyson@pobox.com> + * + * Licensed under the GNU GPL. See the file COPYING for details. + * + * 2002-02-05: Sergey S. Kostyliov added binary search withing + * btree nodes. + * + * Many thanks to: + * + * Dominic Giampaolo, author of "Practical File System + * Design with the Be File System", for such a helpful book. + * + * Marcus J. Ranum, author of the b+tree package in + * comp.sources.misc volume 10. This code is not copied from that + * work, but it is partially based on it. + * + * Makoto Kato, author of the original BeFS for linux filesystem + * driver. + */ + +#include <linux/kernel.h> +#include <linux/string.h> +#include <linux/slab.h> +#include <linux/mm.h> +#include <linux/buffer_head.h> + +#include "befs.h" +#include "btree.h" +#include "datastream.h" +#include "endian.h" + +/* + * The btree functions in this file are built on top of the + * datastream.c interface, which is in turn built on top of the + * io.c interface. + */ + +/* Befs B+tree structure: + * + * The first thing in the tree is the tree superblock. It tells you + * all kinds of usefull things about the tree, like where the rootnode + * is located, and the size of the nodes (always 1024 with current version + * of BeOS). + * + * The rest of the tree consists of a series of nodes. Nodes contain a header + * (struct befs_btree_nodehead), the packed key data, an array of shorts + * containing the ending offsets for each of the keys, and an array of + * befs_off_t values. In interior nodes, the keys are the ending keys for + * the childnode they point to, and the values are offsets into the + * datastream containing the tree. + */ + +/* Note: + * + * The book states 2 confusing things about befs b+trees. First, + * it states that the overflow feild of node headers is used by internal nodes + * to point to another node that "effectivly continues this one". Here is what + * I belive that means. Each key in internal nodes points to another node that + * contains key values less than itself. Inspection reveals that the last key + * in the internal node is not the last key in the index. Keys that are + * greater than the last key in the internal node go into the overflow node. + * I imagine there is a performance reason for this. + * + * Second, it states that the header of a btree node is sufficient to + * distinguish internal nodes from leaf nodes. Without saying exactly how. + * After figuring out the first, it becomes obvious that internal nodes have + * overflow nodes and leafnodes do not. + */ + +/* + * Currently, this code is only good for directory B+trees. + * In order to be used for other BFS indexes, it needs to be extended to handle + * duplicate keys and non-string keytypes (int32, int64, float, double). + */ + +/* + * In memory structure of each btree node + */ +typedef struct { + befs_btree_nodehead head; /* head of node converted to cpu byteorder */ + struct buffer_head *bh; + befs_btree_nodehead *od_node; /* on disk node */ +} befs_btree_node; + +/* local constants */ +const static befs_off_t befs_bt_inval = 0xffffffffffffffff; + +/* local functions */ +static int befs_btree_seekleaf(struct super_block *sb, befs_data_stream * ds, + befs_btree_super * bt_super, + befs_btree_node * this_node, + befs_off_t * node_off); + +static int befs_bt_read_super(struct super_block *sb, befs_data_stream * ds, + befs_btree_super * sup); + +static int befs_bt_read_node(struct super_block *sb, befs_data_stream * ds, + befs_btree_node * node, befs_off_t node_off); + +static int befs_leafnode(befs_btree_node * node); + +static u16 *befs_bt_keylen_index(befs_btree_node * node); + +static befs_off_t *befs_bt_valarray(befs_btree_node * node); + +static char *befs_bt_keydata(befs_btree_node * node); + +static int befs_find_key(struct super_block *sb, befs_btree_node * node, + const char *findkey, befs_off_t * value); + +static char *befs_bt_get_key(struct super_block *sb, befs_btree_node * node, + int index, u16 * keylen); + +static int befs_compare_strings(const void *key1, int keylen1, + const void *key2, int keylen2); + +/** + * befs_bt_read_super - read in btree superblock convert to cpu byteorder + * @sb: Filesystem superblock + * @ds: Datastream to read from + * @sup: Buffer in which to place the btree superblock + * + * Calls befs_read_datastream to read in the btree superblock and + * makes sure it is in cpu byteorder, byteswapping if nessisary. + * + * On success, returns BEFS_OK and *@sup contains the btree superblock, + * in cpu byte order. + * + * On failure, BEFS_ERR is returned. + */ +static int +befs_bt_read_super(struct super_block *sb, befs_data_stream * ds, + befs_btree_super * sup) +{ + struct buffer_head *bh = NULL; + befs_btree_super *od_sup = NULL; + + befs_debug(sb, "---> befs_btree_read_super()"); + + bh = befs_read_datastream(sb, ds, 0, NULL); + + if (!bh) { + befs_error(sb, "Couldn't read index header."); + goto error; + } + od_sup = (befs_btree_super *) bh->b_data; + befs_dump_index_entry(sb, od_sup); + + sup->magic = fs32_to_cpu(sb, od_sup->magic); + sup->node_size = fs32_to_cpu(sb, od_sup->node_size); + sup->max_depth = fs32_to_cpu(sb, od_sup->max_depth); + sup->data_type = fs32_to_cpu(sb, od_sup->data_type); + sup->root_node_ptr = fs64_to_cpu(sb, od_sup->root_node_ptr); + sup->free_node_ptr = fs64_to_cpu(sb, od_sup->free_node_ptr); + sup->max_size = fs64_to_cpu(sb, od_sup->max_size); + + brelse(bh); + if (sup->magic != BEFS_BTREE_MAGIC) { + befs_error(sb, "Index header has bad magic."); + goto error; + } + + befs_debug(sb, "<--- befs_btree_read_super()"); + return BEFS_OK; + + error: + befs_debug(sb, "<--- befs_btree_read_super() ERROR"); + return BEFS_ERR; +} + +/** + * befs_bt_read_node - read in btree node and convert to cpu byteorder + * @sb: Filesystem superblock + * @ds: Datastream to read from + * @node: Buffer in which to place the btree node + * @node_off: Starting offset (in bytes) of the node in @ds + * + * Calls befs_read_datastream to read in the indicated btree node and + * makes sure its header feilds are in cpu byteorder, byteswapping if + * nessisary. + * Note: node->bh must be NULL when this function called first + * time. Don't forget brelse(node->bh) after last call. + * + * On success, returns BEFS_OK and *@node contains the btree node that + * starts at @node_off, with the node->head fields in cpu byte order. + * + * On failure, BEFS_ERR is returned. + */ + +static int +befs_bt_read_node(struct super_block *sb, befs_data_stream * ds, + befs_btree_node * node, befs_off_t node_off) +{ + uint off = 0; + + befs_debug(sb, "---> befs_bt_read_node()"); + + if (node->bh) + brelse(node->bh); + + node->bh = befs_read_datastream(sb, ds, node_off, &off); + if (!node->bh) { + befs_error(sb, "befs_bt_read_node() failed to read " + "node at %Lu", node_off); + befs_debug(sb, "<--- befs_bt_read_node() ERROR"); + + return BEFS_ERR; + } + node->od_node = + (befs_btree_nodehead *) ((void *) node->bh->b_data + off); + + befs_dump_index_node(sb, node->od_node); + + node->head.left = fs64_to_cpu(sb, node->od_node->left); + node->head.right = fs64_to_cpu(sb, node->od_node->right); + node->head.overflow = fs64_to_cpu(sb, node->od_node->overflow); + node->head.all_key_count = + fs16_to_cpu(sb, node->od_node->all_key_count); + node->head.all_key_length = + fs16_to_cpu(sb, node->od_node->all_key_length); + + befs_debug(sb, "<--- befs_btree_read_node()"); + return BEFS_OK; +} + +/** + * befs_btree_find - Find a key in a befs B+tree + * @sb: Filesystem superblock + * @ds: Datastream containing btree + * @key: Key string to lookup in btree + * @value: Value stored with @key + * + * On sucess, returns BEFS_OK and sets *@value to the value stored + * with @key (usually the disk block number of an inode). + * + * On failure, returns BEFS_ERR or BEFS_BT_NOT_FOUND. + * + * Algorithm: + * Read the superblock and rootnode of the b+tree. + * Drill down through the interior nodes using befs_find_key(). + * Once at the correct leaf node, use befs_find_key() again to get the + * actuall value stored with the key. + */ +int +befs_btree_find(struct super_block *sb, befs_data_stream * ds, + const char *key, befs_off_t * value) +{ + befs_btree_node *this_node = NULL; + befs_btree_super bt_super; + befs_off_t node_off; + int res; + + befs_debug(sb, "---> befs_btree_find() Key: %s", key); + + if (befs_bt_read_super(sb, ds, &bt_super) != BEFS_OK) { + befs_error(sb, + "befs_btree_find() failed to read index superblock"); + goto error; + } + + this_node = (befs_btree_node *) kmalloc(sizeof (befs_btree_node), + GFP_NOFS); + if (!this_node) { + befs_error(sb, "befs_btree_find() failed to allocate %u " + "bytes of memory", sizeof (befs_btree_node)); + goto error; + } + + this_node->bh = NULL; + + /* read in root node */ + node_off = bt_super.root_node_ptr; + if (befs_bt_read_node(sb, ds, this_node, node_off) != BEFS_OK) { + befs_error(sb, "befs_btree_find() failed to read " + "node at %Lu", node_off); + goto error_alloc; + } + + while (!befs_leafnode(this_node)) { + res = befs_find_key(sb, this_node, key, &node_off); + if (res == BEFS_BT_NOT_FOUND) + node_off = this_node->head.overflow; + /* if no match, go to overflow node */ + if (befs_bt_read_node(sb, ds, this_node, node_off) != BEFS_OK) { + befs_error(sb, "befs_btree_find() failed to read " + "node at %Lu", node_off); + goto error_alloc; + } + } + + /* at the correct leaf node now */ + + res = befs_find_key(sb, this_node, key, value); + + brelse(this_node->bh); + kfree(this_node); + + if (res != BEFS_BT_MATCH) { + befs_debug(sb, "<--- befs_btree_find() Key %s not found", key); + *value = 0; + return BEFS_BT_NOT_FOUND; + } + befs_debug(sb, "<--- befs_btree_find() Found key %s, value %Lu", + key, *value); + return BEFS_OK; + + error_alloc: + kfree(this_node); + error: + *value = 0; + befs_debug(sb, "<--- befs_btree_find() ERROR"); + return BEFS_ERR; +} + +/** + * befs_find_key - Search for a key within a node + * @sb: Filesystem superblock + * @node: Node to find the key within + * @key: Keystring to search for + * @value: If key is found, the value stored with the key is put here + * + * finds exact match if one exists, and returns BEFS_BT_MATCH + * If no exact match, finds first key in node that is greater + * (alpabeticly) than the search key and returns BEFS_BT_PARMATCH + * (for partial match, I guess). Can you think of something better to + * call it? + * + * If no key was a match or greater than the search key, return + * BEFS_BT_NOT_FOUND. + * + * Use binary search instead of a linear. + */ +static int +befs_find_key(struct super_block *sb, befs_btree_node * node, + const char *findkey, befs_off_t * value) +{ + int first, last, mid; + int eq; + u16 keylen; + int findkey_len; + char *thiskey; + befs_off_t *valarray; + + befs_debug(sb, "---> befs_find_key() %s", findkey); + + *value = 0; + + findkey_len = strlen(findkey); + + /* if node can not contain key, just skeep this node */ + last = node->head.all_key_count - 1; + thiskey = befs_bt_get_key(sb, node, last, &keylen); + + eq = befs_compare_strings(thiskey, keylen, findkey, findkey_len); + if (eq < 0) { + befs_debug(sb, "<--- befs_find_key() %s not found", findkey); + return BEFS_BT_NOT_FOUND; + } + + valarray = befs_bt_valarray(node); + + /* simple binary search */ + first = 0; + mid = 0; + while (last >= first) { + mid = (last + first) / 2; + befs_debug(sb, "first: %d, last: %d, mid: %d", first, last, + mid); + thiskey = befs_bt_get_key(sb, node, mid, &keylen); + eq = befs_compare_strings(thiskey, keylen, findkey, + findkey_len); + *value = fs64_to_cpu(sb, valarray[mid]); + + if (eq == 0) { + befs_debug(sb, "<--- befs_find_key() found %s at %d", + thiskey, mid); + + return BEFS_BT_MATCH; + } + if (eq > 0) + last = mid - 1; + else + first = mid + 1; + } + if (eq < 0) + *value = fs64_to_cpu(sb, valarray[mid + 1]); + befs_debug(sb, "<--- befs_find_key() found %s at %d", thiskey, mid); + return BEFS_BT_PARMATCH; +} + +/** + * befs_btree_read - Traverse leafnodes of a btree + * @sb: Filesystem superblock + * @ds: Datastream containing btree + * @key_no: Key number (alphabetical order) of key to read + * @bufsize: Size of the buffer to return key in + * @keybuf: Pointer to a buffer to put the key in + * @keysize: Length of the returned key + * @value: Value stored with the returned key + * + * Heres how it works: Key_no is the index of the key/value pair to + * retun in keybuf/value. + * Bufsize is the size of keybuf (BEFS_NAME_LEN+1 is a good size). Keysize is + * the number of charecters in the key (just a convience). + * + * Algorithm: + * Get the first leafnode of the tree. See if the requested key is in that + * node. If not, follow the node->right link to the next leafnode. Repeat + * until the (key_no)th key is found or the tree is out of keys. + */ +int +befs_btree_read(struct super_block *sb, befs_data_stream * ds, + loff_t key_no, size_t bufsize, char *keybuf, size_t * keysize, + befs_off_t * value) +{ + befs_btree_node *this_node; + befs_btree_super bt_super; + befs_off_t node_off = 0; + int cur_key; + befs_off_t *valarray; + char *keystart; + u16 keylen; + int res; + + uint key_sum = 0; + + befs_debug(sb, "---> befs_btree_read()"); + + if (befs_bt_read_super(sb, ds, &bt_super) != BEFS_OK) { + befs_error(sb, + "befs_btree_read() failed to read index superblock"); + goto error; + } + + if ((this_node = (befs_btree_node *) + kmalloc(sizeof (befs_btree_node), GFP_NOFS)) == NULL) { + befs_error(sb, "befs_btree_read() failed to allocate %u " + "bytes of memory", sizeof (befs_btree_node)); + goto error; + } + + node_off = bt_super.root_node_ptr; + this_node->bh = NULL; + + /* seeks down to first leafnode, reads it into this_node */ + res = befs_btree_seekleaf(sb, ds, &bt_super, this_node, &node_off); + if (res == BEFS_BT_EMPTY) { + brelse(this_node->bh); + kfree(this_node); + *value = 0; + *keysize = 0; + befs_debug(sb, "<--- befs_btree_read() Tree is EMPTY"); + return BEFS_BT_EMPTY; + } else if (res == BEFS_ERR) { + goto error_alloc; + } + + /* find the leaf node containing the key_no key */ + + while (key_sum + this_node->head.all_key_count <= key_no) { + + /* no more nodes to look in: key_no is too large */ + if (this_node->head.right == befs_bt_inval) { + *keysize = 0; + *value = 0; + befs_debug(sb, + "<--- befs_btree_read() END of keys at %Lu", + key_sum + this_node->head.all_key_count); + brelse(this_node->bh); + kfree(this_node); + return BEFS_BT_END; + } + + key_sum += this_node->head.all_key_count; + node_off = this_node->head.right; + + if (befs_bt_read_node(sb, ds, this_node, node_off) != BEFS_OK) { + befs_error(sb, "befs_btree_read() failed to read " + "node at %Lu", node_off); + goto error_alloc; + } + } + + /* how many keys into this_node is key_no */ + cur_key = key_no - key_sum; + + /* get pointers to datastructures within the node body */ + valarray = befs_bt_valarray(this_node); + + keystart = befs_bt_get_key(sb, this_node, cur_key, &keylen); + + befs_debug(sb, "Read [%Lu,%d]: keysize %d", node_off, cur_key, keylen); + + if (bufsize < keylen + 1) { + befs_error(sb, "befs_btree_read() keybuf too small (%u) " + "for key of size %d", bufsize, keylen); + brelse(this_node->bh); + goto error_alloc; + }; + + strncpy(keybuf, keystart, keylen); + *value = fs64_to_cpu(sb, valarray[cur_key]); + *keysize = keylen; + keybuf[keylen] = '\0'; + + befs_debug(sb, "Read [%Lu,%d]: Key \"%.*s\", Value %Lu", node_off, + cur_key, keylen, keybuf, *value); + + brelse(this_node->bh); + kfree(this_node); + + befs_debug(sb, "<--- befs_btree_read()"); + + return BEFS_OK; + + error_alloc: + kfree(this_node); + + error: + *keysize = 0; + *value = 0; + befs_debug(sb, "<--- befs_btree_read() ERROR"); + return BEFS_ERR; +} + +/** + * befs_btree_seekleaf - Find the first leafnode in the btree + * @sb: Filesystem superblock + * @ds: Datastream containing btree + * @bt_super: Pointer to the uperblock of the btree + * @this_node: Buffer to return the leafnode in + * @node_off: Pointer to offset of current node within datastream. Modified + * by the function. + * + * + * Helper function for btree traverse. Moves the current position to the + * start of the first leaf node. + * + * Also checks for an empty tree. If there are no keys, returns BEFS_BT_EMPTY. + */ +static int +befs_btree_seekleaf(struct super_block *sb, befs_data_stream * ds, + befs_btree_super * bt_super, befs_btree_node * this_node, + befs_off_t * node_off) +{ + + befs_debug(sb, "---> befs_btree_seekleaf()"); + + if (befs_bt_read_node(sb, ds, this_node, *node_off) != BEFS_OK) { + befs_error(sb, "befs_btree_seekleaf() failed to read " + "node at %Lu", *node_off); + goto error; + } + befs_debug(sb, "Seekleaf to root node %Lu", *node_off); + + if (this_node->head.all_key_count == 0 && befs_leafnode(this_node)) { + befs_debug(sb, "<--- befs_btree_seekleaf() Tree is EMPTY"); + return BEFS_BT_EMPTY; + } + + while (!befs_leafnode(this_node)) { + + if (this_node->head.all_key_count == 0) { + befs_debug(sb, "befs_btree_seekleaf() encountered " + "an empty interior node: %Lu. Using Overflow " + "node: %Lu", *node_off, + this_node->head.overflow); + *node_off = this_node->head.overflow; + } else { + befs_off_t *valarray = befs_bt_valarray(this_node); + *node_off = fs64_to_cpu(sb, valarray[0]); + } + if (befs_bt_read_node(sb, ds, this_node, *node_off) != BEFS_OK) { + befs_error(sb, "befs_btree_seekleaf() failed to read " + "node at %Lu", *node_off); + goto error; + } + + befs_debug(sb, "Seekleaf to child node %Lu", *node_off); + } + befs_debug(sb, "Node %Lu is a leaf node", *node_off); + + return BEFS_OK; + + error: + befs_debug(sb, "<--- befs_btree_seekleaf() ERROR"); + return BEFS_ERR; +} + +/** + * befs_leafnode - Determine if the btree node is a leaf node or an + * interior node + * @node: Pointer to node structure to test + * + * Return 1 if leaf, 0 if interior + */ +static int +befs_leafnode(befs_btree_node * node) +{ + /* all interior nodes (and only interior nodes) have an overflow node */ + if (node->head.overflow == befs_bt_inval) + return 1; + else + return 0; +} + +/** + * befs_bt_keylen_index - Finds start of keylen index in a node + * @node: Pointer to the node structure to find the keylen index within + * + * Returns a pointer to the start of the key length index array + * of the B+tree node *@node + * + * "The length of all the keys in the node is added to the size of the + * header and then rounded up to a multiple of four to get the begining + * of the key length index" (p.88, practical filesystem design). + * + * Exept that rounding up to 8 works, and rounding up to 4 doesn't. + */ +static u16 * +befs_bt_keylen_index(befs_btree_node * node) +{ + const int keylen_align = 8; + unsigned long int off = + (sizeof (befs_btree_nodehead) + node->head.all_key_length); + ulong tmp = off % keylen_align; + + if (tmp) + off += keylen_align - tmp; + + return (u16 *) ((void *) node->od_node + off); +} + +/** + * befs_bt_valarray - Finds the start of value array in a node + * @node: Pointer to the node structure to find the value array within + * + * Returns a pointer to the start of the value array + * of the node pointed to by the node header + */ +static befs_off_t * +befs_bt_valarray(befs_btree_node * node) +{ + void *keylen_index_start = (void *) befs_bt_keylen_index(node); + size_t keylen_index_size = node->head.all_key_count * sizeof (u16); + + return (befs_off_t *) (keylen_index_start + keylen_index_size); +} + +/** + * befs_bt_keydata - Finds start of keydata array in a node + * @node: Pointer to the node structure to find the keydata array within + * + * Returns a pointer to the start of the keydata array + * of the node pointed to by the node header + */ +static char * +befs_bt_keydata(befs_btree_node * node) +{ + return (char *) ((void *) node->od_node + sizeof (befs_btree_nodehead)); +} + +/** + * befs_bt_get_key - returns a pointer to the start of a key + * @sb: filesystem superblock + * @node: node in which to look for the key + * @index: the index of the key to get + * @keylen: modified to be the length of the key at @index + * + * Returns a valid pointer into @node on success. + * Returns NULL on failure (bad input) and sets *@keylen = 0 + */ +static char * +befs_bt_get_key(struct super_block *sb, befs_btree_node * node, + int index, u16 * keylen) +{ + int prev_key_end; + char *keystart; + u16 *keylen_index; + + if (index < 0 || index > node->head.all_key_count) { + *keylen = 0; + return NULL; + } + + keystart = befs_bt_keydata(node); + keylen_index = befs_bt_keylen_index(node); + + if (index == 0) + prev_key_end = 0; + else + prev_key_end = fs16_to_cpu(sb, keylen_index[index - 1]); + + *keylen = fs16_to_cpu(sb, keylen_index[index]) - prev_key_end; + + return keystart + prev_key_end; +} + +/** + * befs_compare_strings - compare two strings + * @key1: pointer to the first key to be compared + * @keylen1: length in bytes of key1 + * @key2: pointer to the second key to be compared + * @kelen2: lenght in bytes of key2 + * + * Returns 0 if @key1 and @key2 are equal. + * Returns >0 if @key1 is greater. + * Returns <0 if @key2 is greater.. + */ +static int +befs_compare_strings(const void *key1, int keylen1, + const void *key2, int keylen2) +{ + int len = min_t(int, keylen1, keylen2); + int result = strncmp(key1, key2, len); + if (result == 0) + result = keylen1 - keylen2; + return result; +} + +/* These will be used for non-string keyed btrees */ +#if 0 +static int +btree_compare_int32(cont void *key1, int keylen1, const void *key2, int keylen2) +{ + return *(int32_t *) key1 - *(int32_t *) key2; +} + +static int +btree_compare_uint32(cont void *key1, int keylen1, + const void *key2, int keylen2) +{ + if (*(u_int32_t *) key1 == *(u_int32_t *) key2) + return 0; + else if (*(u_int32_t *) key1 > *(u_int32_t *) key2) + return 1; + + return -1; +} +static int +btree_compare_int64(cont void *key1, int keylen1, const void *key2, int keylen2) +{ + if (*(int64_t *) key1 == *(int64_t *) key2) + return 0; + else if (*(int64_t *) key1 > *(int64_t *) key2) + return 1; + + return -1; +} + +static int +btree_compare_uint64(cont void *key1, int keylen1, + const void *key2, int keylen2) +{ + if (*(u_int64_t *) key1 == *(u_int64_t *) key2) + return 0; + else if (*(u_int64_t *) key1 > *(u_int64_t *) key2) + return 1; + + return -1; +} + +static int +btree_compare_float(cont void *key1, int keylen1, const void *key2, int keylen2) +{ + float result = *(float *) key1 - *(float *) key2; + if (result == 0.0f) + return 0; + + return (result < 0.0f) ? -1 : 1; +} + +static int +btree_compare_double(cont void *key1, int keylen1, + const void *key2, int keylen2) +{ + double result = *(double *) key1 - *(double *) key2; + if (result == 0.0) + return 0; + + return (result < 0.0) ? -1 : 1; +} +#endif //0 diff --git a/fs/befs/btree.h b/fs/befs/btree.h new file mode 100644 index 000000000000..92e781e5f30e --- /dev/null +++ b/fs/befs/btree.h @@ -0,0 +1,13 @@ +/* + * btree.h + * + */ + + +int befs_btree_find(struct super_block *sb, befs_data_stream * ds, + const char *key, befs_off_t * value); + +int befs_btree_read(struct super_block *sb, befs_data_stream * ds, + loff_t key_no, size_t bufsize, char *keybuf, + size_t * keysize, befs_off_t * value); + diff --git a/fs/befs/datastream.c b/fs/befs/datastream.c new file mode 100644 index 000000000000..bbf0c7872a18 --- /dev/null +++ b/fs/befs/datastream.c @@ -0,0 +1,528 @@ +/* + * linux/fs/befs/datastream.c + * + * Copyright (C) 2001 Will Dyson <will_dyson@pobox.com> + * + * Based on portions of file.c by Makoto Kato <m_kato@ga2.so-net.ne.jp> + * + * Many thanks to Dominic Giampaolo, author of "Practical File System + * Design with the Be File System", for such a helpful book. + * + */ + +#include <linux/kernel.h> +#include <linux/version.h> +#include <linux/slab.h> +#include <linux/buffer_head.h> + +#include "befs.h" +#include "datastream.h" +#include "io.h" +#include "endian.h" + +const befs_inode_addr BAD_IADDR = { 0, 0, 0 }; + +static int befs_find_brun_direct(struct super_block *sb, + befs_data_stream * data, + befs_blocknr_t blockno, befs_block_run * run); + +static int befs_find_brun_indirect(struct super_block *sb, + befs_data_stream * data, + befs_blocknr_t blockno, + befs_block_run * run); + +static int befs_find_brun_dblindirect(struct super_block *sb, + befs_data_stream * data, + befs_blocknr_t blockno, + befs_block_run * run); + +/** + * befs_read_datastream - get buffer_head containing data, starting from pos. + * @sb: Filesystem superblock + * @ds: datastrem to find data with + * @pos: start of data + * @off: offset of data in buffer_head->b_data + * + * Returns pointer to buffer_head containing data starting with offset @off, + * if you don't need to know offset just set @off = NULL. + */ +struct buffer_head * +befs_read_datastream(struct super_block *sb, befs_data_stream * ds, + befs_off_t pos, uint * off) +{ + struct buffer_head *bh = NULL; + befs_block_run run; + befs_blocknr_t block; /* block coresponding to pos */ + + befs_debug(sb, "---> befs_read_datastream() %Lu", pos); + block = pos >> BEFS_SB(sb)->block_shift; + if (off) + *off = pos - (block << BEFS_SB(sb)->block_shift); + + if (befs_fblock2brun(sb, ds, block, &run) != BEFS_OK) { + befs_error(sb, "BeFS: Error finding disk addr of block %lu", + block); + befs_debug(sb, "<--- befs_read_datastream() ERROR"); + return NULL; + } + bh = befs_bread_iaddr(sb, run); + if (!bh) { + befs_error(sb, "BeFS: Error reading block %lu from datastream", + block); + return NULL; + } + + befs_debug(sb, "<--- befs_read_datastream() read data, starting at %Lu", + pos); + + return bh; +} + +/* + * Takes a file position and gives back a brun who's starting block + * is block number fblock of the file. + * + * Returns BEFS_OK or BEFS_ERR. + * + * Calls specialized functions for each of the three possible + * datastream regions. + * + * 2001-11-15 Will Dyson + */ +int +befs_fblock2brun(struct super_block *sb, befs_data_stream * data, + befs_blocknr_t fblock, befs_block_run * run) +{ + int err; + befs_off_t pos = fblock << BEFS_SB(sb)->block_shift; + + if (pos < data->max_direct_range) { + err = befs_find_brun_direct(sb, data, fblock, run); + + } else if (pos < data->max_indirect_range) { + err = befs_find_brun_indirect(sb, data, fblock, run); + + } else if (pos < data->max_double_indirect_range) { + err = befs_find_brun_dblindirect(sb, data, fblock, run); + + } else { + befs_error(sb, + "befs_fblock2brun() was asked to find block %lu, " + "which is not mapped by the datastream\n", fblock); + err = BEFS_ERR; + } + return err; +} + +/** + * befs_read_lsmylink - read long symlink from datastream. + * @sb: Filesystem superblock + * @ds: Datastrem to read from + * @buf: Buffer in wich to place long symlink data + * @len: Length of the long symlink in bytes + * + * Returns the number of bytes read + */ +size_t +befs_read_lsymlink(struct super_block * sb, befs_data_stream * ds, void *buff, + befs_off_t len) +{ + befs_off_t bytes_read = 0; /* bytes readed */ + u16 plen; + struct buffer_head *bh = NULL; + befs_debug(sb, "---> befs_read_lsymlink() length: %Lu", len); + + while (bytes_read < len) { + bh = befs_read_datastream(sb, ds, bytes_read, NULL); + if (!bh) { + befs_error(sb, "BeFS: Error reading datastream block " + "starting from %Lu", bytes_read); + befs_debug(sb, "<--- befs_read_lsymlink() ERROR"); + return bytes_read; + + } + plen = ((bytes_read + BEFS_SB(sb)->block_size) < len) ? + BEFS_SB(sb)->block_size : len - bytes_read; + memcpy(buff + bytes_read, bh->b_data, plen); + brelse(bh); + bytes_read += plen; + } + + befs_debug(sb, "<--- befs_read_lsymlink() read %u bytes", bytes_read); + return bytes_read; +} + +/** + * befs_count_blocks - blocks used by a file + * @sb: Filesystem superblock + * @ds: Datastream of the file + * + * Counts the number of fs blocks that the file represented by + * inode occupies on the filesystem, counting both regular file + * data and filesystem metadata (and eventually attribute data + * when we support attributes) +*/ + +befs_blocknr_t +befs_count_blocks(struct super_block * sb, befs_data_stream * ds) +{ + befs_blocknr_t blocks; + befs_blocknr_t datablocks; /* File data blocks */ + befs_blocknr_t metablocks; /* FS metadata blocks */ + befs_sb_info *befs_sb = BEFS_SB(sb); + + befs_debug(sb, "---> befs_count_blocks()"); + + datablocks = ds->size >> befs_sb->block_shift; + if (ds->size & (befs_sb->block_size - 1)) + datablocks += 1; + + metablocks = 1; /* Start with 1 block for inode */ + + /* Size of indirect block */ + if (ds->size > ds->max_direct_range) + metablocks += ds->indirect.len; + + /* + Double indir block, plus all the indirect blocks it mapps + In the double-indirect range, all block runs of data are + BEFS_DBLINDIR_BRUN_LEN blocks long. Therefore, we know + how many data block runs are in the double-indirect region, + and from that we know how many indirect blocks it takes to + map them. We assume that the indirect blocks are also + BEFS_DBLINDIR_BRUN_LEN blocks long. + */ + if (ds->size > ds->max_indirect_range && ds->max_indirect_range != 0) { + uint dbl_bytes; + uint dbl_bruns; + uint indirblocks; + + dbl_bytes = + ds->max_double_indirect_range - ds->max_indirect_range; + dbl_bruns = + dbl_bytes / (befs_sb->block_size * BEFS_DBLINDIR_BRUN_LEN); + indirblocks = dbl_bruns / befs_iaddrs_per_block(sb); + + metablocks += ds->double_indirect.len; + metablocks += indirblocks; + } + + blocks = datablocks + metablocks; + befs_debug(sb, "<--- befs_count_blocks() %u blocks", blocks); + + return blocks; +} + +/* + Finds the block run that starts at file block number blockno + in the file represented by the datastream data, if that + blockno is in the direct region of the datastream. + + sb: the superblock + data: the datastream + blockno: the blocknumber to find + run: The found run is passed back through this pointer + + Return value is BEFS_OK if the blockrun is found, BEFS_ERR + otherwise. + + Algorithm: + Linear search. Checks each element of array[] to see if it + contains the blockno-th filesystem block. This is nessisary + because the block runs map variable amounts of data. Simply + keeps a count of the number of blocks searched so far (sum), + incrementing this by the length of each block run as we come + across it. Adds sum to *count before returning (this is so + you can search multiple arrays that are logicaly one array, + as in the indirect region code). + + When/if blockno is found, if blockno is inside of a block + run as stored on disk, we offset the start and lenght members + of the block run, so that blockno is the start and len is + still valid (the run ends in the same place). + + 2001-11-15 Will Dyson +*/ +static int +befs_find_brun_direct(struct super_block *sb, befs_data_stream * data, + befs_blocknr_t blockno, befs_block_run * run) +{ + int i; + befs_block_run *array = data->direct; + befs_blocknr_t sum; + befs_blocknr_t max_block = + data->max_direct_range >> BEFS_SB(sb)->block_shift; + + befs_debug(sb, "---> befs_find_brun_direct(), find %lu", blockno); + + if (blockno > max_block) { + befs_error(sb, "befs_find_brun_direct() passed block outside of" + "direct region"); + return BEFS_ERR; + } + + for (i = 0, sum = 0; i < BEFS_NUM_DIRECT_BLOCKS; + sum += array[i].len, i++) { + if (blockno >= sum && blockno < sum + (array[i].len)) { + int offset = blockno - sum; + run->allocation_group = array[i].allocation_group; + run->start = array[i].start + offset; + run->len = array[i].len - offset; + + befs_debug(sb, "---> befs_find_brun_direct(), " + "found %lu at direct[%d]", blockno, i); + return BEFS_OK; + } + } + + befs_debug(sb, "---> befs_find_brun_direct() ERROR"); + return BEFS_ERR; +} + +/* + Finds the block run that starts at file block number blockno + in the file represented by the datastream data, if that + blockno is in the indirect region of the datastream. + + sb: the superblock + data: the datastream + blockno: the blocknumber to find + run: The found run is passed back through this pointer + + Return value is BEFS_OK if the blockrun is found, BEFS_ERR + otherwise. + + Algorithm: + For each block in the indirect run of the datastream, read + it in and search through it for search_blk. + + XXX: + Really should check to make sure blockno is inside indirect + region. + + 2001-11-15 Will Dyson +*/ +static int +befs_find_brun_indirect(struct super_block *sb, + befs_data_stream * data, befs_blocknr_t blockno, + befs_block_run * run) +{ + int i, j; + befs_blocknr_t sum = 0; + befs_blocknr_t indir_start_blk; + befs_blocknr_t search_blk; + struct buffer_head *indirblock; + befs_block_run *array; + + befs_block_run indirect = data->indirect; + befs_blocknr_t indirblockno = iaddr2blockno(sb, &indirect); + int arraylen = befs_iaddrs_per_block(sb); + + befs_debug(sb, "---> befs_find_brun_indirect(), find %lu", blockno); + + indir_start_blk = data->max_direct_range >> BEFS_SB(sb)->block_shift; + search_blk = blockno - indir_start_blk; + + /* Examine blocks of the indirect run one at a time */ + for (i = 0; i < indirect.len; i++) { + indirblock = befs_bread(sb, indirblockno + i); + if (indirblock == NULL) { + befs_debug(sb, + "---> befs_find_brun_indirect() failed to " + "read disk block %lu from the indirect brun", + indirblockno + i); + return BEFS_ERR; + } + + array = (befs_block_run *) indirblock->b_data; + + for (j = 0; j < arraylen; ++j) { + int len = fs16_to_cpu(sb, array[j].len); + + if (search_blk >= sum && search_blk < sum + len) { + int offset = search_blk - sum; + run->allocation_group = + fs32_to_cpu(sb, array[j].allocation_group); + run->start = + fs16_to_cpu(sb, array[j].start) + offset; + run->len = + fs16_to_cpu(sb, array[j].len) - offset; + + brelse(indirblock); + befs_debug(sb, + "<--- befs_find_brun_indirect() found " + "file block %lu at indirect[%d]", + blockno, j + (i * arraylen)); + return BEFS_OK; + } + sum += len; + } + + brelse(indirblock); + } + + /* Only fallthrough is an error */ + befs_error(sb, "BeFS: befs_find_brun_indirect() failed to find " + "file block %lu", blockno); + + befs_debug(sb, "<--- befs_find_brun_indirect() ERROR"); + return BEFS_ERR; +} + +/* + Finds the block run that starts at file block number blockno + in the file represented by the datastream data, if that + blockno is in the double-indirect region of the datastream. + + sb: the superblock + data: the datastream + blockno: the blocknumber to find + run: The found run is passed back through this pointer + + Return value is BEFS_OK if the blockrun is found, BEFS_ERR + otherwise. + + Algorithm: + The block runs in the double-indirect region are different. + They are always allocated 4 fs blocks at a time, so each + block run maps a constant amount of file data. This means + that we can directly calculate how many block runs into the + double-indirect region we need to go to get to the one that + maps a particular filesystem block. + + We do this in two stages. First we calculate which of the + inode addresses in the double-indirect block will point us + to the indirect block that contains the mapping for the data, + then we calculate which of the inode addresses in that + indirect block maps the data block we are after. + + Oh, and once we've done that, we actually read in the blocks + that contain the inode addresses we calculated above. Even + though the double-indirect run may be several blocks long, + we can calculate which of those blocks will contain the index + we are after and only read that one. We then follow it to + the indirect block and perform a similar process to find + the actual block run that maps the data block we are interested + in. + + Then we offset the run as in befs_find_brun_array() and we are + done. + + 2001-11-15 Will Dyson +*/ +static int +befs_find_brun_dblindirect(struct super_block *sb, + befs_data_stream * data, befs_blocknr_t blockno, + befs_block_run * run) +{ + int dblindir_indx; + int indir_indx; + int offset; + int dbl_which_block; + int which_block; + int dbl_block_indx; + int block_indx; + off_t dblindir_leftover; + befs_blocknr_t blockno_at_run_start; + struct buffer_head *dbl_indir_block; + struct buffer_head *indir_block; + befs_block_run indir_run; + befs_inode_addr *iaddr_array = NULL; + befs_sb_info *befs_sb = BEFS_SB(sb); + + befs_blocknr_t indir_start_blk = + data->max_indirect_range >> befs_sb->block_shift; + + off_t dbl_indir_off = blockno - indir_start_blk; + + /* number of data blocks mapped by each of the iaddrs in + * the indirect block pointed to by the double indirect block + */ + size_t iblklen = BEFS_DBLINDIR_BRUN_LEN; + + /* number of data blocks mapped by each of the iaddrs in + * the double indirect block + */ + size_t diblklen = iblklen * befs_iaddrs_per_block(sb) + * BEFS_DBLINDIR_BRUN_LEN; + + befs_debug(sb, "---> befs_find_brun_dblindirect() find %lu", blockno); + + /* First, discover which of the double_indir->indir blocks + * contains pos. Then figure out how much of pos that + * accounted for. Then discover which of the iaddrs in + * the indirect block contains pos. + */ + + dblindir_indx = dbl_indir_off / diblklen; + dblindir_leftover = dbl_indir_off % diblklen; + indir_indx = dblindir_leftover / diblklen; + + /* Read double indirect block */ + dbl_which_block = dblindir_indx / befs_iaddrs_per_block(sb); + if (dbl_which_block > data->double_indirect.len) { + befs_error(sb, "The double-indirect index calculated by " + "befs_read_brun_dblindirect(), %d, is outside the range " + "of the double-indirect block", dblindir_indx); + return BEFS_ERR; + } + + dbl_indir_block = + befs_bread(sb, iaddr2blockno(sb, &data->double_indirect) + + dbl_which_block); + if (dbl_indir_block == NULL) { + befs_error(sb, "befs_read_brun_dblindirect() couldn't read the " + "double-indirect block at blockno %lu", + iaddr2blockno(sb, + &data->double_indirect) + + dbl_which_block); + brelse(dbl_indir_block); + return BEFS_ERR; + } + + dbl_block_indx = + dblindir_indx - (dbl_which_block * befs_iaddrs_per_block(sb)); + iaddr_array = (befs_inode_addr *) dbl_indir_block->b_data; + indir_run = fsrun_to_cpu(sb, iaddr_array[dbl_block_indx]); + brelse(dbl_indir_block); + iaddr_array = NULL; + + /* Read indirect block */ + which_block = indir_indx / befs_iaddrs_per_block(sb); + if (which_block > indir_run.len) { + befs_error(sb, "The indirect index calculated by " + "befs_read_brun_dblindirect(), %d, is outside the range " + "of the indirect block", indir_indx); + return BEFS_ERR; + } + + indir_block = + befs_bread(sb, iaddr2blockno(sb, &indir_run) + which_block); + if (indir_block == NULL) { + befs_error(sb, "befs_read_brun_dblindirect() couldn't read the " + "indirect block at blockno %lu", + iaddr2blockno(sb, &indir_run) + which_block); + brelse(indir_block); + return BEFS_ERR; + } + + block_indx = indir_indx - (which_block * befs_iaddrs_per_block(sb)); + iaddr_array = (befs_inode_addr *) indir_block->b_data; + *run = fsrun_to_cpu(sb, iaddr_array[block_indx]); + brelse(indir_block); + iaddr_array = NULL; + + blockno_at_run_start = indir_start_blk; + blockno_at_run_start += diblklen * dblindir_indx; + blockno_at_run_start += iblklen * indir_indx; + offset = blockno - blockno_at_run_start; + + run->start += offset; + run->len -= offset; + + befs_debug(sb, "Found file block %lu in double_indirect[%d][%d]," + " double_indirect_leftover = %lu", + blockno, dblindir_indx, indir_indx, dblindir_leftover); + + return BEFS_OK; +} diff --git a/fs/befs/datastream.h b/fs/befs/datastream.h new file mode 100644 index 000000000000..45e8a3c98249 --- /dev/null +++ b/fs/befs/datastream.h @@ -0,0 +1,19 @@ +/* + * datastream.h + * + */ + +struct buffer_head *befs_read_datastream(struct super_block *sb, + befs_data_stream * ds, befs_off_t pos, + uint * off); + +int befs_fblock2brun(struct super_block *sb, befs_data_stream * data, + befs_blocknr_t fblock, befs_block_run * run); + +size_t befs_read_lsymlink(struct super_block *sb, befs_data_stream * data, + void *buff, befs_off_t len); + +befs_blocknr_t befs_count_blocks(struct super_block *sb, befs_data_stream * ds); + +extern const befs_inode_addr BAD_IADDR; + diff --git a/fs/befs/debug.c b/fs/befs/debug.c new file mode 100644 index 000000000000..8b85efc7b6c5 --- /dev/null +++ b/fs/befs/debug.c @@ -0,0 +1,262 @@ +/* + * linux/fs/befs/debug.c + * + * Copyright (C) 2001 Will Dyson (will_dyson at pobox.com) + * + * With help from the ntfs-tng driver by Anton Altparmakov + * + * Copyright (C) 1999 Makoto Kato (m_kato@ga2.so-net.ne.jp) + * + * debug functions + */ + +#ifdef __KERNEL__ + +#include <stdarg.h> +#include <linux/string.h> +#include <linux/spinlock.h> +#include <linux/kernel.h> +#include <linux/fs.h> + +#endif /* __KERNEL__ */ + +#include "befs.h" +#include "endian.h" + +#define ERRBUFSIZE 1024 + +void +befs_error(const struct super_block *sb, const char *fmt, ...) +{ + va_list args; + char err_buf[ERRBUFSIZE]; + + va_start(args, fmt); + vsnprintf(err_buf, ERRBUFSIZE, fmt, args); + va_end(args); + + printk(KERN_ERR "BeFS(%s): %s\n", sb->s_id, err_buf); + + befs_debug(sb, err_buf); +} + +void +befs_warning(const struct super_block *sb, const char *fmt, ...) +{ + va_list args; + char err_buf[ERRBUFSIZE]; + + va_start(args, fmt); + vsnprintf(err_buf, ERRBUFSIZE, fmt, args); + va_end(args); + + printk(KERN_WARNING "BeFS(%s): %s\n", sb->s_id, err_buf); + + befs_debug(sb, err_buf); +} + +void +befs_debug(const struct super_block *sb, const char *fmt, ...) +{ +#ifdef CONFIG_BEFS_DEBUG + + va_list args; + char err_buf[ERRBUFSIZE]; + + if (BEFS_SB(sb)->mount_opts.debug) { + va_start(args, fmt); + vsnprintf(err_buf, ERRBUFSIZE, fmt, args); + va_end(args); + + printk(KERN_DEBUG "BeFS(%s): %s\n", sb->s_id, err_buf); + } +#endif //CONFIG_BEFS_DEBUG +} + +void +befs_dump_inode(const struct super_block *sb, befs_inode * inode) +{ +#ifdef CONFIG_BEFS_DEBUG + + befs_block_run tmp_run; + + befs_debug(sb, "befs_inode infomation"); + + befs_debug(sb, " magic1 %08x", fs32_to_cpu(sb, inode->magic1)); + + tmp_run = fsrun_to_cpu(sb, inode->inode_num); + befs_debug(sb, " inode_num %u, %hu, %hu", + tmp_run.allocation_group, tmp_run.start, tmp_run.len); + + befs_debug(sb, " uid %u", fs32_to_cpu(sb, inode->uid)); + befs_debug(sb, " gid %u", fs32_to_cpu(sb, inode->gid)); + befs_debug(sb, " mode %08x", fs32_to_cpu(sb, inode->mode)); + befs_debug(sb, " flags %08x", fs32_to_cpu(sb, inode->flags)); + befs_debug(sb, " create_time %Lu", + fs64_to_cpu(sb, inode->create_time)); + befs_debug(sb, " last_modified_time %Lu", + fs64_to_cpu(sb, inode->last_modified_time)); + + tmp_run = fsrun_to_cpu(sb, inode->parent); + befs_debug(sb, " parent [%u, %hu, %hu]", + tmp_run.allocation_group, tmp_run.start, tmp_run.len); + + tmp_run = fsrun_to_cpu(sb, inode->attributes); + befs_debug(sb, " attributes [%u, %hu, %hu]", + tmp_run.allocation_group, tmp_run.start, tmp_run.len); + + befs_debug(sb, " type %08x", fs32_to_cpu(sb, inode->type)); + befs_debug(sb, " inode_size %u", fs32_to_cpu(sb, inode->inode_size)); + + if (S_ISLNK(inode->mode)) { + befs_debug(sb, " Symbolic link [%s]", inode->data.symlink); + } else { + int i; + + for (i = 0; i < BEFS_NUM_DIRECT_BLOCKS; i++) { + tmp_run = + fsrun_to_cpu(sb, inode->data.datastream.direct[i]); + befs_debug(sb, " direct %d [%u, %hu, %hu]", i, + tmp_run.allocation_group, tmp_run.start, + tmp_run.len); + } + befs_debug(sb, " max_direct_range %Lu", + fs64_to_cpu(sb, + inode->data.datastream. + max_direct_range)); + + tmp_run = fsrun_to_cpu(sb, inode->data.datastream.indirect); + befs_debug(sb, " indirect [%u, %hu, %hu]", + tmp_run.allocation_group, + tmp_run.start, tmp_run.len); + + befs_debug(sb, " max_indirect_range %Lu", + fs64_to_cpu(sb, + inode->data.datastream. + max_indirect_range)); + + tmp_run = + fsrun_to_cpu(sb, inode->data.datastream.double_indirect); + befs_debug(sb, " double indirect [%u, %hu, %hu]", + tmp_run.allocation_group, tmp_run.start, + tmp_run.len); + + befs_debug(sb, " max_double_indirect_range %Lu", + fs64_to_cpu(sb, + inode->data.datastream. + max_double_indirect_range)); + + befs_debug(sb, " size %Lu", + fs64_to_cpu(sb, inode->data.datastream.size)); + } + +#endif //CONFIG_BEFS_DEBUG +} + +/* + * Display super block structure for debug. + */ + +void +befs_dump_super_block(const struct super_block *sb, befs_super_block * sup) +{ +#ifdef CONFIG_BEFS_DEBUG + + befs_block_run tmp_run; + + befs_debug(sb, "befs_super_block information"); + + befs_debug(sb, " name %s", sup->name); + befs_debug(sb, " magic1 %08x", fs32_to_cpu(sb, sup->magic1)); + befs_debug(sb, " fs_byte_order %08x", + fs32_to_cpu(sb, sup->fs_byte_order)); + + befs_debug(sb, " block_size %u", fs32_to_cpu(sb, sup->block_size)); + befs_debug(sb, " block_shift %u", fs32_to_cpu(sb, sup->block_shift)); + + befs_debug(sb, " num_blocks %Lu", fs64_to_cpu(sb, sup->num_blocks)); + befs_debug(sb, " used_blocks %Lu", fs64_to_cpu(sb, sup->used_blocks)); + + befs_debug(sb, " magic2 %08x", fs32_to_cpu(sb, sup->magic2)); + befs_debug(sb, " blocks_per_ag %u", + fs32_to_cpu(sb, sup->blocks_per_ag)); + befs_debug(sb, " ag_shift %u", fs32_to_cpu(sb, sup->ag_shift)); + befs_debug(sb, " num_ags %u", fs32_to_cpu(sb, sup->num_ags)); + + befs_debug(sb, " flags %08x", fs32_to_cpu(sb, sup->flags)); + + tmp_run = fsrun_to_cpu(sb, sup->log_blocks); + befs_debug(sb, " log_blocks %u, %hu, %hu", + tmp_run.allocation_group, tmp_run.start, tmp_run.len); + + befs_debug(sb, " log_start %Ld", fs64_to_cpu(sb, sup->log_start)); + befs_debug(sb, " log_end %Ld", fs64_to_cpu(sb, sup->log_end)); + + befs_debug(sb, " magic3 %08x", fs32_to_cpu(sb, sup->magic3)); + + tmp_run = fsrun_to_cpu(sb, sup->root_dir); + befs_debug(sb, " root_dir %u, %hu, %hu", + tmp_run.allocation_group, tmp_run.start, tmp_run.len); + + tmp_run = fsrun_to_cpu(sb, sup->indices); + befs_debug(sb, " indices %u, %hu, %hu", + tmp_run.allocation_group, tmp_run.start, tmp_run.len); + +#endif //CONFIG_BEFS_DEBUG +} + +void +befs_dump_small_data(const struct super_block *sb, befs_small_data * sd) +{ +} + +void +befs_dump_run(const struct super_block *sb, befs_block_run run) +{ +#ifdef CONFIG_BEFS_DEBUG + + run = fsrun_to_cpu(sb, run); + + befs_debug(sb, "[%u, %hu, %hu]", + run.allocation_group, run.start, run.len); + +#endif //CONFIG_BEFS_DEBUG +} + +void +befs_dump_index_entry(const struct super_block *sb, befs_btree_super * super) +{ +#ifdef CONFIG_BEFS_DEBUG + + befs_debug(sb, "Btree super structure"); + befs_debug(sb, " magic %08x", fs32_to_cpu(sb, super->magic)); + befs_debug(sb, " node_size %u", fs32_to_cpu(sb, super->node_size)); + befs_debug(sb, " max_depth %08x", fs32_to_cpu(sb, super->max_depth)); + + befs_debug(sb, " data_type %08x", fs32_to_cpu(sb, super->data_type)); + befs_debug(sb, " root_node_pointer %016LX", + fs64_to_cpu(sb, super->root_node_ptr)); + befs_debug(sb, " free_node_pointer %016LX", + fs64_to_cpu(sb, super->free_node_ptr)); + befs_debug(sb, " maximum size %016LX", + fs64_to_cpu(sb, super->max_size)); + +#endif //CONFIG_BEFS_DEBUG +} + +void +befs_dump_index_node(const struct super_block *sb, befs_btree_nodehead * node) +{ +#ifdef CONFIG_BEFS_DEBUG + + befs_debug(sb, "Btree node structure"); + befs_debug(sb, " left %016LX", fs64_to_cpu(sb, node->left)); + befs_debug(sb, " right %016LX", fs64_to_cpu(sb, node->right)); + befs_debug(sb, " overflow %016LX", fs64_to_cpu(sb, node->overflow)); + befs_debug(sb, " all_key_count %hu", + fs16_to_cpu(sb, node->all_key_count)); + befs_debug(sb, " all_key_length %hu", + fs16_to_cpu(sb, node->all_key_length)); + +#endif //CONFIG_BEFS_DEBUG +} diff --git a/fs/befs/endian.h b/fs/befs/endian.h new file mode 100644 index 000000000000..9ecaea4e3325 --- /dev/null +++ b/fs/befs/endian.h @@ -0,0 +1,126 @@ +/* + * linux/fs/befs/endian.h + * + * Copyright (C) 2001 Will Dyson <will_dyson@pobox.com> + * + * Partially based on similar funtions in the sysv driver. + */ + +#ifndef LINUX_BEFS_ENDIAN +#define LINUX_BEFS_ENDIAN + +#include <linux/byteorder/generic.h> +#include "befs.h" + +static inline u64 +fs64_to_cpu(const struct super_block *sb, u64 n) +{ + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) + return le64_to_cpu(n); + else + return be64_to_cpu(n); +} + +static inline u64 +cpu_to_fs64(const struct super_block *sb, u64 n) +{ + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) + return cpu_to_le64(n); + else + return cpu_to_be64(n); +} + +static inline u32 +fs32_to_cpu(const struct super_block *sb, u32 n) +{ + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) + return le32_to_cpu(n); + else + return be32_to_cpu(n); +} + +static inline u32 +cpu_to_fs32(const struct super_block *sb, u32 n) +{ + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) + return cpu_to_le32(n); + else + return cpu_to_be32(n); +} + +static inline u16 +fs16_to_cpu(const struct super_block *sb, u16 n) +{ + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) + return le16_to_cpu(n); + else + return be16_to_cpu(n); +} + +static inline u16 +cpu_to_fs16(const struct super_block *sb, u16 n) +{ + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) + return cpu_to_le16(n); + else + return cpu_to_be16(n); +} + +/* Composite types below here */ + +static inline befs_block_run +fsrun_to_cpu(const struct super_block *sb, befs_block_run n) +{ + befs_block_run run; + + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) { + run.allocation_group = le32_to_cpu(n.allocation_group); + run.start = le16_to_cpu(n.start); + run.len = le16_to_cpu(n.len); + } else { + run.allocation_group = be32_to_cpu(n.allocation_group); + run.start = be16_to_cpu(n.start); + run.len = be16_to_cpu(n.len); + } + return run; +} + +static inline befs_block_run +cpu_to_fsrun(const struct super_block *sb, befs_block_run n) +{ + befs_block_run run; + + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) { + run.allocation_group = cpu_to_le32(n.allocation_group); + run.start = cpu_to_le16(n.start); + run.len = cpu_to_le16(n.len); + } else { + run.allocation_group = cpu_to_be32(n.allocation_group); + run.start = cpu_to_be16(n.start); + run.len = cpu_to_be16(n.len); + } + return run; +} + +static inline befs_data_stream +fsds_to_cpu(const struct super_block *sb, befs_data_stream n) +{ + befs_data_stream data; + int i; + + for (i = 0; i < BEFS_NUM_DIRECT_BLOCKS; ++i) + data.direct[i] = fsrun_to_cpu(sb, n.direct[i]); + + data.max_direct_range = fs64_to_cpu(sb, n.max_direct_range); + data.indirect = fsrun_to_cpu(sb, n.indirect); + data.max_indirect_range = fs64_to_cpu(sb, n.max_indirect_range); + data.double_indirect = fsrun_to_cpu(sb, n.double_indirect); + data.max_double_indirect_range = fs64_to_cpu(sb, + n. + max_double_indirect_range); + data.size = fs64_to_cpu(sb, n.size); + + return data; +} + +#endif //LINUX_BEFS_ENDIAN diff --git a/fs/befs/inode.c b/fs/befs/inode.c new file mode 100644 index 000000000000..d41c9247ae8a --- /dev/null +++ b/fs/befs/inode.c @@ -0,0 +1,53 @@ +/* + * inode.c + * + * Copyright (C) 2001 Will Dyson <will_dyson@pobox.com> + */ + +#include <linux/fs.h> + +#include "befs.h" +#include "inode.h" +#include "endian.h" + +/* + Validates the correctness of the befs inode + Returns BEFS_OK if the inode should be used, otherwise + returns BEFS_BAD_INODE +*/ +int +befs_check_inode(struct super_block *sb, befs_inode * raw_inode, + befs_blocknr_t inode) +{ + u32 magic1 = fs32_to_cpu(sb, raw_inode->magic1); + befs_inode_addr ino_num = fsrun_to_cpu(sb, raw_inode->inode_num); + u32 flags = fs32_to_cpu(sb, raw_inode->flags); + + /* check magic header. */ + if (magic1 != BEFS_INODE_MAGIC1) { + befs_error(sb, + "Inode has a bad magic header - inode = %lu", inode); + return BEFS_BAD_INODE; + } + + /* + * Sanity check2: inodes store their own block address. Check it. + */ + if (inode != iaddr2blockno(sb, &ino_num)) { + befs_error(sb, "inode blocknr field disagrees with vfs " + "VFS: %lu, Inode %lu", + inode, iaddr2blockno(sb, &ino_num)); + return BEFS_BAD_INODE; + } + + /* + * check flag + */ + + if (!(flags & BEFS_INODE_IN_USE)) { + befs_error(sb, "inode is not used - inode = %lu", inode); + return BEFS_BAD_INODE; + } + + return BEFS_OK; +} diff --git a/fs/befs/inode.h b/fs/befs/inode.h new file mode 100644 index 000000000000..9dc7fd9b7570 --- /dev/null +++ b/fs/befs/inode.h @@ -0,0 +1,8 @@ +/* + * inode.h + * + */ + +int befs_check_inode(struct super_block *sb, befs_inode * raw_inode, + befs_blocknr_t inode); + diff --git a/fs/befs/io.c b/fs/befs/io.c new file mode 100644 index 000000000000..50b0f9354b41 --- /dev/null +++ b/fs/befs/io.c @@ -0,0 +1,98 @@ +/* + * linux/fs/befs/io.c + * + * Copyright (C) 2001 Will Dyson <will_dyson@pobox.com + * + * Based on portions of file.c and inode.c + * by Makoto Kato (m_kato@ga2.so-net.ne.jp) + * + * Many thanks to Dominic Giampaolo, author of Practical File System + * Design with the Be File System, for such a helpful book. + * + */ + +#include <linux/buffer_head.h> + +#include "befs.h" +#include "io.h" + +/* + * Converts befs notion of disk addr to a disk offset and uses + * linux kernel function sb_bread() to get the buffer containing + * the offset. -Will Dyson + * + */ + +struct buffer_head * +befs_bread_iaddr(struct super_block *sb, befs_inode_addr iaddr) +{ + struct buffer_head *bh = NULL; + befs_blocknr_t block = 0; + vfs_blocknr_t vfs_block = 0; + befs_sb_info *befs_sb = BEFS_SB(sb); + + befs_debug(sb, "---> Enter befs_read_iaddr() " + "[%u, %hu, %hu]", + iaddr.allocation_group, iaddr.start, iaddr.len); + + if (iaddr.allocation_group > befs_sb->num_ags) { + befs_error(sb, "BEFS: Invalid allocation group %u, max is %u", + iaddr.allocation_group, befs_sb->num_ags); + goto error; + } + + block = iaddr2blockno(sb, &iaddr); + vfs_block = (vfs_blocknr_t) block; + + if (vfs_block != block) { + befs_error(sb, "Error converting to host blocknr_t. %Lu " + "is larger than the host can use", block); + goto error; + } + + befs_debug(sb, "befs_read_iaddr: offset = %lu", block); + + bh = sb_bread(sb, vfs_block); + + if (bh == NULL) { + befs_error(sb, "Failed to read block %lu", block); + goto error; + } + + befs_debug(sb, "<--- befs_read_iaddr()"); + return bh; + + error: + befs_debug(sb, "<--- befs_read_iaddr() ERROR"); + return NULL; +} + +struct buffer_head * +befs_bread(struct super_block *sb, befs_blocknr_t block) +{ + struct buffer_head *bh = NULL; + vfs_blocknr_t vfs_block = (vfs_blocknr_t) block; + + befs_debug(sb, "---> Enter befs_read() %Lu", block); + + if (vfs_block != block) { + befs_error(sb, "Error converting to host blocknr_t. %Lu " + "is larger than the host can use", block); + goto error; + } + + bh = sb_bread(sb, vfs_block); + + if (bh == NULL) { + befs_error(sb, "Failed to read block %lu", vfs_block); + goto error; + } + + befs_debug(sb, "<--- befs_read()"); + + return bh; + + error: + befs_debug(sb, "<--- befs_read() ERROR"); + return NULL; +} diff --git a/fs/befs/io.h b/fs/befs/io.h new file mode 100644 index 000000000000..9b78266b6aa5 --- /dev/null +++ b/fs/befs/io.h @@ -0,0 +1,9 @@ +/* + * io.h + */ + +struct buffer_head *befs_bread_iaddr(struct super_block *sb, + befs_inode_addr iaddr); + +struct buffer_head *befs_bread(struct super_block *sb, befs_blocknr_t block); + diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c new file mode 100644 index 000000000000..b1e16362c51a --- /dev/null +++ b/fs/befs/linuxvfs.c @@ -0,0 +1,956 @@ +/* + * linux/fs/befs/linuxvfs.c + * + * Copyright (C) 2001 Will Dyson <will_dyson@pobox.com + * + */ + +#include <linux/module.h> +#include <linux/slab.h> +#include <linux/fs.h> +#include <linux/errno.h> +#include <linux/stat.h> +#include <linux/nls.h> +#include <linux/buffer_head.h> + +#include "befs.h" +#include "btree.h" +#include "inode.h" +#include "datastream.h" +#include "super.h" +#include "io.h" +#include "endian.h" + +EXPORT_NO_SYMBOLS; +MODULE_DESCRIPTION("BeOS File System (BeFS) driver"); +MODULE_AUTHOR("Will Dyson"); +MODULE_LICENSE("GPL"); + +/* The units the vfs expects inode->i_blocks to be in */ +#define VFS_BLOCK_SIZE 512 + +static int befs_readdir(struct file *, void *, filldir_t); +static int befs_get_block(struct inode *, sector_t, struct buffer_head *, int); +static int befs_readpage(struct file *file, struct page *page); +static sector_t befs_bmap(struct address_space *mapping, sector_t block); +static struct dentry *befs_lookup(struct inode *, struct dentry *); +static void befs_read_inode(struct inode *ino); +static struct inode *befs_alloc_inode(struct super_block *sb); +static void befs_destroy_inode(struct inode *inode); +static int befs_init_inodecache(void); +static void befs_destroy_inodecache(void); +static int befs_readlink(struct dentry *, char *, int); +static int befs_follow_link(struct dentry *, struct nameidata *nd); +static int befs_utf2nls(struct super_block *sb, const char *in, int in_len, + char **out, int *out_len); +static int befs_nls2utf(struct super_block *sb, const char *in, int in_len, + char **out, int *out_len); +static void befs_put_super(struct super_block *); +static int befs_remount(struct super_block *, int *, char *); +static int befs_statfs(struct super_block *, struct statfs *); +static int parse_options(char *, befs_mount_options *); + +static const struct super_operations befs_sops = { + .read_inode = befs_read_inode, /* initialize & read inode */ + .alloc_inode = befs_alloc_inode, /* allocate a new inode */ + .destroy_inode = befs_destroy_inode, /* deallocate an inode */ + .put_super = befs_put_super, /* uninit super */ + .statfs = befs_statfs, /* statfs */ + .remount_fs = befs_remount, +}; + +/* slab cache for befs_inode_info objects */ +static kmem_cache_t *befs_inode_cachep; + +struct file_operations befs_dir_operations = { + .read = generic_read_dir, + .readdir = befs_readdir, +}; + +struct inode_operations befs_dir_inode_operations = { + .lookup = befs_lookup, +}; + +struct file_operations befs_file_operations = { + .llseek = default_llseek, + .read = generic_file_read, + .mmap = generic_file_mmap, +}; + +struct address_space_operations befs_aops = { + .readpage = befs_readpage, + .sync_page = block_sync_page, + .bmap = befs_bmap, +}; + +static struct inode_operations befs_symlink_inode_operations = { + .readlink = befs_readlink, + .follow_link = befs_follow_link, +}; + +/* + * Called by generic_file_read() to read a page of data + * + * In turn, simply calls a generic block read function and + * passes it the address of befs_get_block, for mapping file + * positions to disk blocks. + */ +static int +befs_readpage(struct file *file, struct page *page) +{ + return block_read_full_page(page, befs_get_block); +} + +static sector_t +befs_bmap(struct address_space *mapping, sector_t block) +{ + return generic_block_bmap(mapping, block, befs_get_block); +} + +/* + * Generic function to map a file position (block) to a + * disk offset (passed back in bh_result). + * + * Used by many higher level functions. + * + * Calls befs_fblock2brun() in datastream.c to do the real work. + * + * -WD 10-26-01 + */ + +static int +befs_get_block(struct inode *inode, sector_t block, + struct buffer_head *bh_result, int create) +{ + struct super_block *sb = inode->i_sb; + befs_data_stream *ds = &BEFS_I(inode)->i_data.ds; + befs_block_run run = BAD_IADDR; + int res = 0; + ulong disk_off; + + befs_debug(sb, "---> befs_get_block() for inode %lu, block %ld", + inode->i_ino, block); + + if (block < 0) { + befs_error(sb, "befs_get_block() was asked for a block " + "number less than zero: block %ld in inode %lu", + block, inode->i_ino); + return -EIO; + } + + if (create) { + befs_error(sb, "befs_get_block() was asked to write to " + "block %ld in inode %lu", block, inode->i_ino); + return -EPERM; + } + + res = befs_fblock2brun(sb, ds, block, &run); + if (res != BEFS_OK) { + befs_error(sb, + "<--- befs_get_block() for inode %lu, block " + "%ld ERROR", inode->i_ino, block); + return -EFBIG; + } + + disk_off = (ulong) iaddr2blockno(sb, &run); + + map_bh(bh_result, inode->i_sb, disk_off); + + befs_debug(sb, "<--- befs_get_block() for inode %lu, block %ld, " + "disk address %lu", inode->i_ino, block, disk_off); + + return 0; +} + +static struct dentry * +befs_lookup(struct inode *dir, struct dentry *dentry) +{ + struct inode *inode = NULL; + struct super_block *sb = dir->i_sb; + befs_data_stream *ds = &BEFS_I(dir)->i_data.ds; + befs_off_t offset; + int ret; + int utfnamelen; + char *utfname; + const char *name = dentry->d_name.name; + + befs_debug(sb, "---> befs_lookup() " + "name %s inode %ld", dentry->d_name.name, dir->i_ino); + + /* Convert to UTF-8 */ + if (BEFS_SB(sb)->nls) { + ret = + befs_nls2utf(sb, name, strlen(name), &utfname, &utfnamelen); + if (ret < 0) { + befs_debug(sb, "<--- befs_lookup() ERROR"); + return ERR_PTR(ret); + } + ret = befs_btree_find(sb, ds, utfname, &offset); + kfree(utfname); + + } else { + ret = befs_btree_find(sb, ds, dentry->d_name.name, &offset); + } + + if (ret == BEFS_BT_NOT_FOUND) { + befs_debug(sb, "<--- befs_lookup() %s not found", + dentry->d_name.name); + return ERR_PTR(-ENOENT); + + } else if (ret != BEFS_OK || offset == 0) { + befs_warning(sb, "<--- befs_lookup() Error"); + return ERR_PTR(-ENODATA); + } + + inode = iget(dir->i_sb, (ino_t) offset); + if (!inode) + return ERR_PTR(-EACCES); + + d_add(dentry, inode); + + befs_debug(sb, "<--- befs_lookup()"); + + return NULL; +} + +static int +befs_readdir(struct file *filp, void *dirent, filldir_t filldir) +{ + struct inode *inode = filp->f_dentry->d_inode; + struct super_block *sb = inode->i_sb; + befs_data_stream *ds = &BEFS_I(inode)->i_data.ds; + befs_off_t value; + int result; + size_t keysize; + unsigned char d_type; + char keybuf[BEFS_NAME_LEN + 1]; + char *nlsname; + int nlsnamelen; + const char *dirname = filp->f_dentry->d_name.name; + + befs_debug(sb, "---> befs_readdir() " + "name %s, inode %ld, filp->f_pos %Ld", + dirname, inode->i_ino, filp->f_pos); + + result = befs_btree_read(sb, ds, filp->f_pos, BEFS_NAME_LEN + 1, + keybuf, &keysize, &value); + + if (result == BEFS_ERR) { + befs_debug(sb, "<--- befs_readdir() ERROR"); + befs_error(sb, "IO error reading %s (inode %lu)", + dirname, inode->i_ino); + return -EIO; + + } else if (result == BEFS_BT_END) { + befs_debug(sb, "<--- befs_readdir() END"); + return 0; + + } else if (result == BEFS_BT_EMPTY) { + befs_debug(sb, "<--- befs_readdir() Empty directory"); + return 0; + } + + d_type = DT_UNKNOWN; + + /* Convert to NLS */ + if (BEFS_SB(sb)->nls) { + result = + befs_utf2nls(sb, keybuf, keysize, &nlsname, &nlsnamelen); + if (result < 0) { + befs_debug(sb, "<--- befs_readdir() ERROR"); + return result; + } + result = filldir(dirent, nlsname, nlsnamelen, filp->f_pos, + (ino_t) value, d_type); + kfree(nlsname); + + } else { + result = filldir(dirent, keybuf, keysize, filp->f_pos, + (ino_t) value, d_type); + } + + filp->f_pos++; + + befs_debug(sb, "<--- befs_readdir() filp->f_pos %Ld", filp->f_pos); + + return 0; +} + +static struct inode * +befs_alloc_inode(struct super_block *sb) +{ + struct befs_inode_info *bi; + bi = (struct befs_inode_info *)kmem_cache_alloc(befs_inode_cachep, + SLAB_KERNEL); + if (!bi) + return NULL; + return &bi->vfs_inode; +} + +static void +befs_destroy_inode(struct inode *inode) +{ + kmem_cache_free(befs_inode_cachep, BEFS_I(inode)); +} + +static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags) +{ + struct befs_inode_info *bi = (struct befs_inode_info *) foo; + + if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) == + SLAB_CTOR_CONSTRUCTOR) { + inode_init_once(&bi->vfs_inode); + } +} + +static void +befs_read_inode(struct inode *inode) +{ + struct buffer_head *bh = NULL; + befs_inode *raw_inode = NULL; + + struct super_block *sb = inode->i_sb; + befs_sb_info *befs_sb = BEFS_SB(sb); + befs_inode_info *befs_ino = NULL; + + befs_debug(sb, "---> befs_read_inode() " "inode = %lu", inode->i_ino); + + befs_ino = BEFS_I(inode); + + /* convert from vfs's inode number to befs's inode number */ + befs_ino->i_inode_num = blockno2iaddr(sb, inode->i_ino); + + befs_debug(sb, " real inode number [%u, %hu, %hu]", + befs_ino->i_inode_num.allocation_group, + befs_ino->i_inode_num.start, befs_ino->i_inode_num.len); + + bh = befs_bread_iaddr(sb, befs_ino->i_inode_num); + if (!bh) { + befs_error(sb, "unable to read inode block - " + "inode = %lu", inode->i_ino); + goto unaquire_none; + } + + raw_inode = (befs_inode *) bh->b_data; + + befs_dump_inode(sb, raw_inode); + + if (befs_check_inode(sb, raw_inode, inode->i_ino) != BEFS_OK) { + befs_error(sb, "Bad inode: %lu", inode->i_ino); + goto unaquire_bh; + } + + inode->i_mode = (umode_t) fs32_to_cpu(sb, raw_inode->mode); + + /* + * set uid and gid. But since current BeOS is single user OS, so + * you can change by "uid" or "gid" options. + */ + + inode->i_uid = befs_sb->mount_opts.use_uid ? + befs_sb->mount_opts.uid : (uid_t) fs32_to_cpu(sb, raw_inode->uid); + inode->i_gid = befs_sb->mount_opts.use_gid ? + befs_sb->mount_opts.gid : (gid_t) fs32_to_cpu(sb, raw_inode->gid); + + inode->i_nlink = 1; + + /* + * BEFS's time is 64 bits, but current VFS is 32 bits... + * BEFS don't have access time. Nor inode change time. VFS + * doesn't have creation time. + */ + + inode->i_mtime = + (time_t) (fs64_to_cpu(sb, raw_inode->last_modified_time) >> 16); + inode->i_ctime = inode->i_mtime; + inode->i_atime = inode->i_mtime; + inode->i_blksize = befs_sb->block_size; + + befs_ino->i_inode_num = fsrun_to_cpu(sb, raw_inode->inode_num); + befs_ino->i_parent = fsrun_to_cpu(sb, raw_inode->parent); + befs_ino->i_attribute = fsrun_to_cpu(sb, raw_inode->attributes); + befs_ino->i_flags = fs32_to_cpu(sb, raw_inode->flags); + + if (S_ISLNK(inode->i_mode) && !(inode->i_flags & BEFS_LONG_SYMLINK)) { + inode->i_size = 0; + inode->i_blocks = befs_sb->block_size / VFS_BLOCK_SIZE; + strncpy(befs_ino->i_data.symlink, raw_inode->data.symlink, + BEFS_SYMLINK_LEN); + } else { + int num_blks; + + befs_ino->i_data.ds = + fsds_to_cpu(sb, raw_inode->data.datastream); + + num_blks = befs_count_blocks(sb, &befs_ino->i_data.ds); + inode->i_blocks = + num_blks * (befs_sb->block_size / VFS_BLOCK_SIZE); + inode->i_size = befs_ino->i_data.ds.size; + } + + inode->i_mapping->a_ops = &befs_aops; + + if (S_ISREG(inode->i_mode)) { + inode->i_fop = &befs_file_operations; + } else if (S_ISDIR(inode->i_mode)) { + inode->i_op = &befs_dir_inode_operations; + inode->i_fop = &befs_dir_operations; + } else if (S_ISLNK(inode->i_mode)) { + inode->i_op = &befs_symlink_inode_operations; + } else { + befs_error(sb, "Inode %lu is not a regular file, " + "directory or symlink. THAT IS WRONG! BeFS has no " + "on disk special files", inode->i_ino); + goto unaquire_bh; + } + + brelse(bh); + befs_debug(sb, "<--- befs_read_inode()"); + return; + + unaquire_bh: + brelse(bh); + + unaquire_none: + make_bad_inode(inode); + befs_debug(sb, "<--- befs_read_inode() - Bad inode"); + return; +} + +/* Initialize the inode cache. Called at fs setup. + * + * Taken from NFS implementation by Al Viro. + */ +static int +befs_init_inodecache(void) +{ + befs_inode_cachep = kmem_cache_create("befs_inode_cache", + sizeof (struct befs_inode_info), + 0, SLAB_HWCACHE_ALIGN, + init_once, NULL); + if (befs_inode_cachep == NULL) { + printk(KERN_ERR "befs_init_inodecache: " + "Couldn't initalize inode slabcache\n"); + return -ENOMEM; + } + + return 0; +} + +/* Called at fs teardown. + * + * Taken from NFS implementation by Al Viro. + */ +static void +befs_destroy_inodecache(void) +{ + if (kmem_cache_destroy(befs_inode_cachep)) + printk(KERN_ERR "befs_destroy_inodecache: " + "not all structures were freed\n"); +} + +/* + * The inode of symbolic link is different to data stream. + * The data stream become link name. Unless the LONG_SYMLINK + * flag is set. + */ +static int +befs_follow_link(struct dentry *dentry, struct nameidata *nd) +{ + struct super_block *sb = dentry->d_sb; + befs_inode_info *befs_ino = BEFS_I(dentry->d_inode); + char *link; + int res; + + if (befs_ino->i_flags & BEFS_LONG_SYMLINK) { + befs_data_stream *data = &befs_ino->i_data.ds; + befs_off_t linklen = data->size; + + befs_debug(sb, "Follow long symlink"); + + link = kmalloc(linklen, GFP_NOFS); + if (link == NULL) + return -ENOMEM; + + if (befs_read_lsymlink(sb, data, link, linklen) != linklen) { + kfree(link); + befs_error(sb, "Failed to read entire long symlink"); + return -EIO; + } + + res = vfs_follow_link(nd, link); + + kfree(link); + } else { + link = befs_ino->i_data.symlink; + res = vfs_follow_link(nd, link); + } + + return res; +} + +static int +befs_readlink(struct dentry *dentry, char *buffer, int buflen) +{ + struct super_block *sb = dentry->d_sb; + befs_inode_info *befs_ino = BEFS_I(dentry->d_inode); + char *link; + int res; + + if (befs_ino->i_flags & BEFS_LONG_SYMLINK) { + befs_data_stream *data = &befs_ino->i_data.ds; + befs_off_t linklen = data->size; + + befs_debug(sb, "Read long symlink"); + + link = kmalloc(linklen, GFP_NOFS); + if (link == NULL) + return -ENOMEM; + + if (befs_read_lsymlink(sb, data, link, linklen) != linklen) { + kfree(link); + befs_error(sb, "Failed to read entire long symlink"); + return -EIO; + } + + res = vfs_readlink(dentry, buffer, buflen, link); + + kfree(link); + } else { + link = befs_ino->i_data.symlink; + res = vfs_readlink(dentry, buffer, buflen, link); + } + + return res; +} + +/* + * UTF-8 to NLS charset convert routine + * + * Changed 8/10/01 by Will Dyson. Now use uni2char() / char2uni() rather than + * the nls tables directly + */ + +static int +befs_utf2nls(struct super_block *sb, const char *in, + int in_len, char **out, int *out_len) +{ + struct nls_table *nls = BEFS_SB(sb)->nls; + int i, o; + wchar_t uni; + int unilen, utflen; + char *result; + int maxlen = in_len; /* The utf8->nls conversion cant make more chars */ + + befs_debug(sb, "---> utf2nls()"); + + if (!nls) { + befs_error(sb, "befs_utf2nls called with no NLS table loaded"); + return -EINVAL; + } + + *out = result = kmalloc(maxlen, GFP_NOFS); + if (!*out) { + befs_error(sb, "befs_utf2nls() cannot allocate memory"); + *out_len = 0; + return -ENOMEM; + } + + for (i = o = 0; i < in_len; i += utflen, o += unilen) { + + /* convert from UTF-8 to Unicode */ + utflen = utf8_mbtowc(&uni, &in[i], in_len - i); + if (utflen < 0) { + goto conv_err; + } + + /* convert from Unicode to nls */ + unilen = nls->uni2char(uni, &result[o], 1); + if (unilen < 0) { + goto conv_err; + } + } + result[o] = '\0'; + + befs_debug(sb, "<--- utf2nls()"); + + return o; + *out_len = o; + + conv_err: + befs_error(sb, "Name using charecter set %s contains a charecter that " + "cannot be converted to unicode.", nls->charset); + befs_debug(sb, "<--- utf2nls()"); + kfree(result); + return -EILSEQ; +} + +/** + * befs_nls2utf - Convert NLS string to utf8 encodeing + * @sb: Superblock + * @src: Input string buffer in NLS format + * @srclen: Length of input string in bytes + * @dest: The output string in UTF8 format + * @destlen: Length of the output buffer + * + * Converts input string @src, which is in the format of the loaded NLS map, + * into a utf8 string. + * + * The destination string @dest is allocated by this function and the caller is + * responsible for freeing it with kfree() + * + * On return, *@destlen is the length of @dest in bytes. + * + * On success, the return value is the number of utf8 charecters written to + * the ouput buffer @dest. + * + * On Failure, a negative number coresponding to the error code is returned. + */ + +static int +befs_nls2utf(struct super_block *sb, const char *in, + int in_len, char **out, int *out_len) +{ + struct nls_table *nls = BEFS_SB(sb)->nls; + int i, o; + wchar_t uni; + int unilen, utflen; + char *result; + int maxlen = 3 * in_len; + + befs_debug(sb, "---> nls2utf()\n"); + + if (!nls) { + befs_error(sb, "befs_nls2utf called with no NLS table loaded."); + return -EINVAL; + } + + *out = result = kmalloc(maxlen, GFP_NOFS); + if (!*out) { + befs_error(sb, "befs_nls2utf() cannot allocate memory"); + *out_len = 0; + return -ENOMEM; + } + + for (i = o = 0; i < in_len; i += unilen, o += utflen) { + + /* convert from nls to unicode */ + unilen = nls->char2uni(&in[i], in_len - i, &uni); + if (unilen < 0) { + goto conv_err; + } + + /* convert from unicode to UTF-8 */ + utflen = utf8_wctomb(&result[o], uni, 3); + if (utflen <= 0) { + goto conv_err; + } + } + + result[o] = '\0'; + *out_len = o; + + befs_debug(sb, "<--- nls2utf()"); + + return i; + + conv_err: + befs_error(sb, "Name using charecter set %s contains a charecter that " + "cannot be converted to unicode.", nls->charset); + befs_debug(sb, "<--- nls2utf()"); + kfree(result); + return -EILSEQ; +} + +static int +parse_options(char *options, befs_mount_options * opts) +{ + char *this_char; + char *value; + int ret = 1; + + /* Initialize options */ + opts->uid = 0; + opts->gid = 0; + opts->use_uid = 0; + opts->use_gid = 0; + opts->iocharset = NULL; + opts->debug = 0; + + if (!options) + return ret; + + while ((this_char = strsep(&options, ",")) != NULL) { + + if ((value = strchr(this_char, '=')) != NULL) + *value++ = 0; + + if (!strcmp(this_char, "uid")) { + if (!value || !*value) { + ret = 0; + } else { + opts->uid = simple_strtoul(value, &value, 0); + opts->use_uid = 1; + if (*value) { + printk(KERN_ERR "BEFS: Invalid uid " + "option: %s\n", value); + ret = 0; + } + } + } else if (!strcmp(this_char, "gid")) { + if (!value || !*value) + ret = 0; + else { + opts->gid = simple_strtoul(value, &value, 0); + opts->use_gid = 1; + if (*value) { + printk(KERN_ERR + "BEFS: Invalid gid option: " + "%s\n", value); + ret = 0; + } + } + } else if (!strcmp(this_char, "iocharset") && value) { + char *p = value; + int len; + + while (*value && *value != ',') + value++; + len = value - p; + if (len) { + char *buffer = kmalloc(len + 1, GFP_NOFS); + if (buffer) { + opts->iocharset = buffer; + memcpy(buffer, p, len); + buffer[len] = 0; + + } else { + printk(KERN_ERR "BEFS: " + "cannot allocate memory\n"); + ret = 0; + } + } + } else if (!strcmp(this_char, "debug")) { + opts->debug = 1; + } + } + + return ret; +} + +/* This function has the responsibiltiy of getting the + * filesystem ready for unmounting. + * Basicly, we free everything that we allocated in + * befs_read_inode + */ +static void +befs_put_super(struct super_block *sb) +{ + if (BEFS_SB(sb)->mount_opts.iocharset) { + kfree(BEFS_SB(sb)->mount_opts.iocharset); + BEFS_SB(sb)->mount_opts.iocharset = NULL; + } + + if (BEFS_SB(sb)->nls) { + unload_nls(BEFS_SB(sb)->nls); + BEFS_SB(sb)->nls = NULL; + } + + if (sb->s_fs_info) { + kfree(sb->s_fs_info); + sb->s_fs_info = NULL; + } + return; +} + +/* Allocate private field of the superblock, fill it. + * + * Finish filling the public superblock fields + * Make the root directory + * Load a set of NLS translations if needed. + */ +static int +befs_fill_super(struct super_block *sb, void *data, int silent) +{ + struct buffer_head *bh; + befs_sb_info *befs_sb; + befs_super_block *disk_sb; + + const unsigned long sb_block = 0; + const off_t x86_sb_off = 512; + + sb->s_fs_info = kmalloc(sizeof (*befs_sb), GFP_KERNEL); + if (sb->s_fs_info == NULL) { + printk(KERN_ERR + "BeFS(%s): Unable to allocate memory for private " + "portion of superblock. Bailing.\n", sb->s_id); + goto unaquire_none; + } + befs_sb = BEFS_SB(sb); + memset(befs_sb, 0, sizeof(befs_sb_info)); + + if (!parse_options((char *) data, &befs_sb->mount_opts)) { + befs_error(sb, "cannot parse mount options"); + goto unaquire_priv_sbp; + } + + befs_debug(sb, "---> befs_fill_super()"); + +#ifndef CONFIG_BEFS_RW + if (!(sb->s_flags & MS_RDONLY)) { + befs_warning(sb, + "No write support. Marking filesystem read-only"); + sb->s_flags |= MS_RDONLY; + } +#endif /* CONFIG_BEFS_RW */ + + /* + * Set dummy blocksize to read super block. + * Will be set to real fs blocksize later. + * + * Linux 2.4.10 and later refuse to read blocks smaller than + * the hardsect size for the device. But we also need to read at + * least 1k to get the second 512 bytes of the volume. + * -WD 10-26-01 + */ + sb_min_blocksize(sb, 1024); + + if (!(bh = sb_bread(sb, sb_block))) { + befs_error(sb, "unable to read superblock"); + goto unaquire_priv_sbp; + } + + /* account for offset of super block on x86 */ + disk_sb = (befs_super_block *) bh->b_data; + if ((le32_to_cpu(disk_sb->magic1) == BEFS_SUPER_MAGIC1) || + (be32_to_cpu(disk_sb->magic1) == BEFS_SUPER_MAGIC1)) { + befs_debug(sb, "Using PPC superblock location"); + } else { + befs_debug(sb, "Using x86 superblock location"); + disk_sb = + (befs_super_block *) ((void *) bh->b_data + x86_sb_off); + } + + if (befs_load_sb(sb, disk_sb) != BEFS_OK) + goto unaquire_bh; + + befs_dump_super_block(sb, disk_sb); + + brelse(bh); + + if (befs_check_sb(sb) != BEFS_OK) + goto unaquire_priv_sbp; + + /* + * set up enough so that it can read an inode + * Fill in kernel superblock fields from private sb + */ + sb->s_magic = BEFS_SUPER_MAGIC; + /* Set real blocksize of fs */ + sb_set_blocksize(sb, (ulong) befs_sb->block_size); + sb->s_op = (struct super_operations *) &befs_sops; + sb->s_root = + d_alloc_root(iget(sb, iaddr2blockno(sb, &(befs_sb->root_dir)))); + if (!sb->s_root) { + befs_error(sb, "get root inode failed"); + goto unaquire_priv_sbp; + } + + /* load nls library */ + if (befs_sb->mount_opts.iocharset) { + befs_debug(sb, "Loading nls: %s", + befs_sb->mount_opts.iocharset); + befs_sb->nls = load_nls(befs_sb->mount_opts.iocharset); + if (!befs_sb->nls) { + befs_warning(sb, "Cannot load nls %s" + "loding default nls", + befs_sb->mount_opts.iocharset); + befs_sb->nls = load_nls_default(); + } + } + + return 0; +/*****************/ + unaquire_bh: + brelse(bh); + + unaquire_priv_sbp: + kfree(sb->s_fs_info); + + unaquire_none: + sb->s_fs_info = NULL; + return -EINVAL; +} + +static int +befs_remount(struct super_block *sb, int *flags, char *data) +{ + if (!(*flags & MS_RDONLY)) + return -EINVAL; + return 0; +} + +static int +befs_statfs(struct super_block *sb, struct statfs *buf) +{ + + befs_debug(sb, "---> befs_statfs()"); + + buf->f_type = BEFS_SUPER_MAGIC; + buf->f_bsize = sb->s_blocksize; + buf->f_blocks = BEFS_SB(sb)->num_blocks; + buf->f_bfree = BEFS_SB(sb)->num_blocks - BEFS_SB(sb)->used_blocks; + buf->f_bavail = buf->f_bfree; + buf->f_files = 0; /* UNKNOWN */ + buf->f_ffree = 0; /* UNKNOWN */ + buf->f_namelen = BEFS_NAME_LEN; + + befs_debug(sb, "<--- befs_statfs()"); + + return 0; +} + +static struct super_block * +befs_get_sb(struct file_system_type *fs_type, int flags, char *dev_name, + void *data) +{ + return get_sb_bdev(fs_type, flags, dev_name, data, befs_fill_super); +} + +static struct file_system_type befs_fs_type = { + .owner = THIS_MODULE, + .name = "befs", + .get_sb = befs_get_sb, + .kill_sb = kill_block_super, + .fs_flags = FS_REQUIRES_DEV, +}; + +static int __init +init_befs_fs(void) +{ + int err; + + printk(KERN_INFO "BeFS version: %s\n", BEFS_VERSION); + + err = befs_init_inodecache(); + if (err) + return err; + + return register_filesystem(&befs_fs_type); +} + +static void __exit +exit_befs_fs(void) +{ + befs_destroy_inodecache(); + + unregister_filesystem(&befs_fs_type); +} + +/* +Macros that typecheck the init and exit functions, +ensures that they are called at init and cleanup, +and eliminates warnings about unused functions. +*/ +module_init(init_befs_fs) +module_exit(exit_befs_fs) diff --git a/fs/befs/super.c b/fs/befs/super.c new file mode 100644 index 000000000000..4557acbac528 --- /dev/null +++ b/fs/befs/super.c @@ -0,0 +1,112 @@ +/* + * super.c + * + * Copyright (C) 2001-2002 Will Dyson <will_dyson@pobox.com> + * + * Licensed under the GNU GPL. See the file COPYING for details. + * + */ + +#include <linux/fs.h> + +#include "befs.h" +#include "super.h" +#include "endian.h" + +/** + * load_befs_sb -- Read from disk and properly byteswap all the fields + * of the befs superblock + * + * + * + * + */ +int +befs_load_sb(struct super_block *sb, befs_super_block * disk_sb) +{ + befs_sb_info *befs_sb = BEFS_SB(sb); + + /* Check the byte order of the filesystem */ + if (le32_to_cpu(disk_sb->fs_byte_order) == BEFS_BYTEORDER_NATIVE) + befs_sb->byte_order = BEFS_BYTESEX_LE; + else if (be32_to_cpu(disk_sb->fs_byte_order) == BEFS_BYTEORDER_NATIVE) + befs_sb->byte_order = BEFS_BYTESEX_BE; + + befs_sb->magic1 = fs32_to_cpu(sb, disk_sb->magic1); + befs_sb->magic2 = fs32_to_cpu(sb, disk_sb->magic2); + befs_sb->magic3 = fs32_to_cpu(sb, disk_sb->magic3); + befs_sb->block_size = fs32_to_cpu(sb, disk_sb->block_size); + befs_sb->block_shift = fs32_to_cpu(sb, disk_sb->block_shift); + befs_sb->num_blocks = fs64_to_cpu(sb, disk_sb->num_blocks); + befs_sb->used_blocks = fs64_to_cpu(sb, disk_sb->used_blocks); + befs_sb->inode_size = fs32_to_cpu(sb, disk_sb->inode_size); + + befs_sb->blocks_per_ag = fs32_to_cpu(sb, disk_sb->blocks_per_ag); + befs_sb->ag_shift = fs32_to_cpu(sb, disk_sb->ag_shift); + befs_sb->num_ags = fs32_to_cpu(sb, disk_sb->num_ags); + + befs_sb->log_blocks = fsrun_to_cpu(sb, disk_sb->log_blocks); + befs_sb->log_start = fs64_to_cpu(sb, disk_sb->log_start); + befs_sb->log_end = fs64_to_cpu(sb, disk_sb->log_end); + + befs_sb->root_dir = fsrun_to_cpu(sb, disk_sb->root_dir); + befs_sb->indices = fsrun_to_cpu(sb, disk_sb->indices); + befs_sb->nls = NULL; + + return BEFS_OK; +} + +int +befs_check_sb(struct super_block *sb) +{ + befs_sb_info *befs_sb = BEFS_SB(sb); + + /* Check magic headers of super block */ + if ((befs_sb->magic1 != BEFS_SUPER_MAGIC1) + || (befs_sb->magic2 != BEFS_SUPER_MAGIC2) + || (befs_sb->magic3 != BEFS_SUPER_MAGIC3)) { + befs_error(sb, "invalid magic header"); + return BEFS_ERR; + } + + /* + * Check blocksize of BEFS. + * + * Blocksize of BEFS is 1024, 2048, 4096 or 8192. + */ + + if ((befs_sb->block_size != 1024) + && (befs_sb->block_size != 2048) + && (befs_sb->block_size != 4096) + && (befs_sb->block_size != 8192)) { + befs_error(sb, "invalid blocksize: %u", befs_sb->block_size); + return BEFS_ERR; + } + + if (befs_sb->block_size > PAGE_SIZE) { + befs_error(sb, "blocksize(%u) cannot be larger" + "than system pagesize(%lu)", befs_sb->block_size, + PAGE_SIZE); + return BEFS_ERR; + } + + /* + * block_shift and block_size encode the same information + * in different ways as a consistency check. + */ + + if ((1 << befs_sb->block_shift) != befs_sb->block_size) { + befs_error(sb, "block_shift disagrees with block_size. " + "Corruption likely."); + return BEFS_ERR; + } + + if (befs_sb->log_start != befs_sb->log_end) { + befs_error(sb, "Filesystem not clean! There are blocks in the " + "journal. You must boot into BeOS and mount this volume " + "to make it clean."); + return BEFS_ERR; + } + + return BEFS_OK; +} diff --git a/fs/befs/super.h b/fs/befs/super.h new file mode 100644 index 000000000000..dc4556376a22 --- /dev/null +++ b/fs/befs/super.h @@ -0,0 +1,8 @@ +/* + * super.h + */ + +int befs_load_sb(struct super_block *sb, befs_super_block * disk_sb); + +int befs_check_sb(struct super_block *sb); + diff --git a/fs/nls/Config.in b/fs/nls/Config.in index 8274f5e521f4..783b6dfdb87d 100644 --- a/fs/nls/Config.in +++ b/fs/nls/Config.in @@ -12,7 +12,8 @@ fi # msdos and Joliet want NLS if [ "$CONFIG_JOLIET" = "y" -o "$CONFIG_FAT_FS" != "n" \ -o "$CONFIG_NTFS_FS" != "n" -o "$CONFIG_NCPFS_NLS" = "y" \ - -o "$CONFIG_SMB_NLS" = "y" -o "$CONFIG_JFS_FS" != "n" -o "$CONFIG_CIFS" != "n" ]; then + -o "$CONFIG_SMB_NLS" = "y" -o "$CONFIG_JFS_FS" != "n" \ + -o "$CONFIG_CIFS" != "n" -o "$CONFIG_BEFS_FS" != "n" ]; then define_bool CONFIG_NLS y else define_bool CONFIG_NLS n diff --git a/include/asm-i386/voyager.h b/include/asm-i386/voyager.h new file mode 100644 index 000000000000..1e97e05e17d0 --- /dev/null +++ b/include/asm-i386/voyager.h @@ -0,0 +1,522 @@ +/* Copyright (C) 1999,2001 + * + * Author: J.E.J.Bottomley@HansenPartnership.com + * + * Standard include definitions for the NCR Voyager system */ + +#undef VOYAGER_DEBUG +#undef VOYAGER_CAT_DEBUG + +#ifdef VOYAGER_DEBUG +#define VDEBUG(x) printk x +#else +#define VDEBUG(x) +#endif + +/* There are three levels of voyager machine: 3,4 and 5. The rule is + * if it's less than 3435 it's a Level 3 except for a 3360 which is + * a level 4. A 3435 or above is a Level 5 */ +#define VOYAGER_LEVEL5_AND_ABOVE 0x3435 +#define VOYAGER_LEVEL4 0x3360 + +/* The L4 DINO ASIC */ +#define VOYAGER_DINO 0x43 + +/* voyager ports in standard I/O space */ +#define VOYAGER_MC_SETUP 0x96 + + +#define VOYAGER_CAT_CONFIG_PORT 0x97 +# define VOYAGER_CAT_DESELECT 0xff +#define VOYAGER_SSPB_RELOCATION_PORT 0x98 + +/* Valid CAT controller commands */ +/* start instruction register cycle */ +#define VOYAGER_CAT_IRCYC 0x01 +/* start data register cycle */ +#define VOYAGER_CAT_DRCYC 0x02 +/* move to execute state */ +#define VOYAGER_CAT_RUN 0x0F +/* end operation */ +#define VOYAGER_CAT_END 0x80 +/* hold in idle state */ +#define VOYAGER_CAT_HOLD 0x90 +/* single step an "intest" vector */ +#define VOYAGER_CAT_STEP 0xE0 +/* return cat controller to CLEMSON mode */ +#define VOYAGER_CAT_CLEMSON 0xFF + +/* the default cat command header */ +#define VOYAGER_CAT_HEADER 0x7F + +/* the range of possible CAT module ids in the system */ +#define VOYAGER_MIN_MODULE 0x10 +#define VOYAGER_MAX_MODULE 0x1f + +/* The voyager registers per asic */ +#define VOYAGER_ASIC_ID_REG 0x00 +#define VOYAGER_ASIC_TYPE_REG 0x01 +/* the sub address registers can be made auto incrementing on reads */ +#define VOYAGER_AUTO_INC_REG 0x02 +# define VOYAGER_AUTO_INC 0x04 +# define VOYAGER_NO_AUTO_INC 0xfb +#define VOYAGER_SUBADDRDATA 0x03 +#define VOYAGER_SCANPATH 0x05 +# define VOYAGER_CONNECT_ASIC 0x01 +# define VOYAGER_DISCONNECT_ASIC 0xfe +#define VOYAGER_SUBADDRLO 0x06 +#define VOYAGER_SUBADDRHI 0x07 +#define VOYAGER_SUBMODSELECT 0x08 +#define VOYAGER_SUBMODPRESENT 0x09 + +#define VOYAGER_SUBADDR_LO 0xff +#define VOYAGER_SUBADDR_HI 0xffff + +/* the maximum size of a scan path -- used to form instructions */ +#define VOYAGER_MAX_SCAN_PATH 0x100 +/* the biggest possible register size (in bytes) */ +#define VOYAGER_MAX_REG_SIZE 4 + +/* Total number of possible modules (including submodules) */ +#define VOYAGER_MAX_MODULES 16 +/* Largest number of asics per module */ +#define VOYAGER_MAX_ASICS_PER_MODULE 7 + +/* the CAT asic of each module is always the first one */ +#define VOYAGER_CAT_ID 0 +#define VOYAGER_PSI 0x1a + +/* voyager instruction operations and registers */ +#define VOYAGER_READ_CONFIG 0x1 +#define VOYAGER_WRITE_CONFIG 0x2 +#define VOYAGER_BYPASS 0xff + +typedef struct voyager_asic +{ + __u8 asic_addr; /* ASIC address; Level 4 */ + __u8 asic_type; /* ASIC type */ + __u8 asic_id; /* ASIC id */ + __u8 jtag_id[4]; /* JTAG id */ + __u8 asic_location; /* Location within scan path; start w/ 0 */ + __u8 bit_location; /* Location within bit stream; start w/ 0 */ + __u8 ireg_length; /* Instruction register length */ + __u16 subaddr; /* Amount of sub address space */ + struct voyager_asic *next; /* Next asic in linked list */ +} voyager_asic_t; + +typedef struct voyager_module { + __u8 module_addr; /* Module address */ + __u8 scan_path_connected; /* Scan path connected */ + __u16 ee_size; /* Size of the EEPROM */ + __u16 num_asics; /* Number of Asics */ + __u16 inst_bits; /* Instruction bits in the scan path */ + __u16 largest_reg; /* Largest register in the scan path */ + __u16 smallest_reg; /* Smallest register in the scan path */ + voyager_asic_t *asic; /* First ASIC in scan path (CAT_I) */ + struct voyager_module *submodule; /* Submodule pointer */ + struct voyager_module *next; /* Next module in linked list */ +} voyager_module_t; + +typedef struct voyager_eeprom_hdr { + __u8 module_id[4] __attribute__((packed)); + __u8 version_id __attribute__((packed)); + __u8 config_id __attribute__((packed)); + __u16 boundry_id __attribute__((packed)); /* boundary scan id */ + __u16 ee_size __attribute__((packed)); /* size of EEPROM */ + __u8 assembly[11] __attribute__((packed)); /* assembly # */ + __u8 assembly_rev __attribute__((packed)); /* assembly rev */ + __u8 tracer[4] __attribute__((packed)); /* tracer number */ + __u16 assembly_cksum __attribute__((packed)); /* asm checksum */ + __u16 power_consump __attribute__((packed)); /* pwr requirements */ + __u16 num_asics __attribute__((packed)); /* number of asics */ + __u16 bist_time __attribute__((packed)); /* min. bist time */ + __u16 err_log_offset __attribute__((packed)); /* error log offset */ + __u16 scan_path_offset __attribute__((packed));/* scan path offset */ + __u16 cct_offset __attribute__((packed)); + __u16 log_length __attribute__((packed)); /* length of err log */ + __u16 xsum_end __attribute__((packed)); /* offset to end of + checksum */ + __u8 reserved[4] __attribute__((packed)); + __u8 sflag __attribute__((packed)); /* starting sentinal */ + __u8 part_number[13] __attribute__((packed)); /* prom part number */ + __u8 version[10] __attribute__((packed)); /* version number */ + __u8 signature[8] __attribute__((packed)); + __u16 eeprom_chksum __attribute__((packed)); + __u32 data_stamp_offset __attribute__((packed)); + __u8 eflag __attribute__((packed)); /* ending sentinal */ +} voyager_eprom_hdr_t; + + + +#define VOYAGER_EPROM_SIZE_OFFSET ((__u16)(&(((voyager_eprom_hdr_t *)0)->ee_size))) +#define VOYAGER_XSUM_END_OFFSET 0x2a + +/* the following three definitions are for internal table layouts + * in the module EPROMs. We really only care about the IDs and + * offsets */ +typedef struct voyager_sp_table { + __u8 asic_id __attribute__((packed)); + __u8 bypass_flag __attribute__((packed)); + __u16 asic_data_offset __attribute__((packed)); + __u16 config_data_offset __attribute__((packed)); +} voyager_sp_table_t; + +typedef struct voyager_jtag_table { + __u8 icode[4] __attribute__((packed)); + __u8 runbist[4] __attribute__((packed)); + __u8 intest[4] __attribute__((packed)); + __u8 samp_preld[4] __attribute__((packed)); + __u8 ireg_len __attribute__((packed)); +} voyager_jtt_t; + +typedef struct voyager_asic_data_table { + __u8 jtag_id[4] __attribute__((packed)); + __u16 length_bsr __attribute__((packed)); + __u16 length_bist_reg __attribute__((packed)); + __u32 bist_clk __attribute__((packed)); + __u16 subaddr_bits __attribute__((packed)); + __u16 seed_bits __attribute__((packed)); + __u16 sig_bits __attribute__((packed)); + __u16 jtag_offset __attribute__((packed)); +} voyager_at_t; + +/* Voyager Interrupt Controller (VIC) registers */ + +/* Base to add to Cross Processor Interrupts (CPIs) when triggering + * the CPU IRQ line */ +/* register defines for the WCBICs (one per processor) */ +#define VOYAGER_WCBIC0 0x41 /* bus A node P1 processor 0 */ +#define VOYAGER_WCBIC1 0x49 /* bus A node P1 processor 1 */ +#define VOYAGER_WCBIC2 0x51 /* bus A node P2 processor 0 */ +#define VOYAGER_WCBIC3 0x59 /* bus A node P2 processor 1 */ +#define VOYAGER_WCBIC4 0x61 /* bus B node P1 processor 0 */ +#define VOYAGER_WCBIC5 0x69 /* bus B node P1 processor 1 */ +#define VOYAGER_WCBIC6 0x71 /* bus B node P2 processor 0 */ +#define VOYAGER_WCBIC7 0x79 /* bus B node P2 processor 1 */ + + +/* top of memory registers */ +#define VOYAGER_WCBIC_TOM_L 0x4 +#define VOYAGER_WCBIC_TOM_H 0x5 + +/* register defines for Voyager Memory Contol (VMC) + * these are present on L4 machines only */ +#define VOYAGER_VMC1 0x81 +#define VOYAGER_VMC2 0x91 +#define VOYAGER_VMC3 0xa1 +#define VOYAGER_VMC4 0xb1 + +/* VMC Ports */ +#define VOYAGER_VMC_MEMORY_SETUP 0x9 +# define VMC_Interleaving 0x01 +# define VMC_4Way 0x02 +# define VMC_EvenCacheLines 0x04 +# define VMC_HighLine 0x08 +# define VMC_Start0_Enable 0x20 +# define VMC_Start1_Enable 0x40 +# define VMC_Vremap 0x80 +#define VOYAGER_VMC_BANK_DENSITY 0xa +# define VMC_BANK_EMPTY 0 +# define VMC_BANK_4MB 1 +# define VMC_BANK_16MB 2 +# define VMC_BANK_64MB 3 +# define VMC_BANK0_MASK 0x03 +# define VMC_BANK1_MASK 0x0C +# define VMC_BANK2_MASK 0x30 +# define VMC_BANK3_MASK 0xC0 + +/* Magellan Memory Controller (MMC) defines - present on L5 */ +#define VOYAGER_MMC_ASIC_ID 1 +/* the two memory modules corresponding to memory cards in the system */ +#define VOYAGER_MMC_MEMORY0_MODULE 0x14 +#define VOYAGER_MMC_MEMORY1_MODULE 0x15 +/* the Magellan Memory Address (MMA) defines */ +#define VOYAGER_MMA_ASIC_ID 2 + +/* Submodule number for the Quad Baseboard */ +#define VOYAGER_QUAD_BASEBOARD 1 + +/* ASIC defines for the Quad Baseboard */ +#define VOYAGER_QUAD_QDATA0 1 +#define VOYAGER_QUAD_QDATA1 2 +#define VOYAGER_QUAD_QABC 3 + +/* Useful areas in extended CMOS */ +#define VOYAGER_PROCESSOR_PRESENT_MASK 0x88a +#define VOYAGER_MEMORY_CLICKMAP 0xa23 +#define VOYAGER_DUMP_LOCATION 0xb1a + +/* SUS In Control bit - used to tell SUS that we don't need to be + * babysat anymore */ +#define VOYAGER_SUS_IN_CONTROL_PORT 0x3ff +# define VOYAGER_IN_CONTROL_FLAG 0x80 + +/* Voyager PSI defines */ +#define VOYAGER_PSI_STATUS_REG 0x08 +# define PSI_DC_FAIL 0x01 +# define PSI_MON 0x02 +# define PSI_FAULT 0x04 +# define PSI_ALARM 0x08 +# define PSI_CURRENT 0x10 +# define PSI_DVM 0x20 +# define PSI_PSCFAULT 0x40 +# define PSI_STAT_CHG 0x80 + +#define VOYAGER_PSI_SUPPLY_REG 0x8000 + /* read */ +# define PSI_FAIL_DC 0x01 +# define PSI_FAIL_AC 0x02 +# define PSI_MON_INT 0x04 +# define PSI_SWITCH_OFF 0x08 +# define PSI_HX_OFF 0x10 +# define PSI_SECURITY 0x20 +# define PSI_CMOS_BATT_LOW 0x40 +# define PSI_CMOS_BATT_FAIL 0x80 + /* write */ +# define PSI_CLR_SWITCH_OFF 0x13 +# define PSI_CLR_HX_OFF 0x14 +# define PSI_CLR_CMOS_BATT_FAIL 0x17 + +#define VOYAGER_PSI_MASK 0x8001 +# define PSI_MASK_MASK 0x10 + +#define VOYAGER_PSI_AC_FAIL_REG 0x8004 +#define AC_FAIL_STAT_CHANGE 0x80 + +#define VOYAGER_PSI_GENERAL_REG 0x8007 + /* read */ +# define PSI_SWITCH_ON 0x01 +# define PSI_SWITCH_ENABLED 0x02 +# define PSI_ALARM_ENABLED 0x08 +# define PSI_SECURE_ENABLED 0x10 +# define PSI_COLD_RESET 0x20 +# define PSI_COLD_START 0x80 + /* write */ +# define PSI_POWER_DOWN 0x10 +# define PSI_SWITCH_DISABLE 0x01 +# define PSI_SWITCH_ENABLE 0x11 +# define PSI_CLEAR 0x12 +# define PSI_ALARM_DISABLE 0x03 +# define PSI_ALARM_ENABLE 0x13 +# define PSI_CLEAR_COLD_RESET 0x05 +# define PSI_SET_COLD_RESET 0x15 +# define PSI_CLEAR_COLD_START 0x07 +# define PSI_SET_COLD_START 0x17 + + + +struct voyager_bios_info { + __u8 len; + __u8 major; + __u8 minor; + __u8 debug; + __u8 num_classes; + __u8 class_1; + __u8 class_2; +}; + +/* The following structures and definitions are for the Kernel/SUS + * interface these are needed to find out how SUS initialised any Quad + * boards in the system */ + +#define NUMBER_OF_MC_BUSSES 2 +#define SLOTS_PER_MC_BUS 8 +#define MAX_CPUS 16 /* 16 way CPU system */ +#define MAX_PROCESSOR_BOARDS 4 /* 4 processor slot system */ +#define MAX_CACHE_LEVELS 4 /* # of cache levels supported */ +#define MAX_SHARED_CPUS 4 /* # of CPUs that can share a LARC */ +#define NUMBER_OF_POS_REGS 8 + +typedef struct { + __u8 MC_Slot __attribute__((packed)); + __u8 POS_Values[NUMBER_OF_POS_REGS] __attribute__((packed)); +} MC_SlotInformation_t; + +struct QuadDescription { + __u8 Type __attribute__((packed)); /* for type 0 (DYADIC or MONADIC) all fields + * will be zero except for slot */ + __u8 StructureVersion __attribute__((packed)); + __u32 CPI_BaseAddress __attribute__((packed)); + __u32 LARC_BankSize __attribute__((packed)); + __u32 LocalMemoryStateBits __attribute__((packed)); + __u8 Slot __attribute__((packed)); /* Processor slots 1 - 4 */ +}; + +struct ProcBoardInfo { + __u8 Type __attribute__((packed)); + __u8 StructureVersion __attribute__((packed)); + __u8 NumberOfBoards __attribute__((packed)); + struct QuadDescription QuadData[MAX_PROCESSOR_BOARDS] __attribute__((packed)); +}; + +struct CacheDescription { + __u8 Level __attribute__((packed)); + __u32 TotalSize __attribute__((packed)); + __u16 LineSize __attribute__((packed)); + __u8 Associativity __attribute__((packed)); + __u8 CacheType __attribute__((packed)); + __u8 WriteType __attribute__((packed)); + __u8 Number_CPUs_SharedBy __attribute__((packed)); + __u8 Shared_CPUs_Hardware_IDs[MAX_SHARED_CPUS] __attribute__((packed)); + +}; + +struct CPU_Description { + __u8 CPU_HardwareId __attribute__((packed)); + char *FRU_String __attribute__((packed)); + __u8 NumberOfCacheLevels __attribute__((packed)); + struct CacheDescription CacheLevelData[MAX_CACHE_LEVELS] __attribute__((packed)); +}; + +struct CPU_Info { + __u8 Type __attribute__((packed)); + __u8 StructureVersion __attribute__((packed)); + __u8 NumberOf_CPUs __attribute__((packed)); + struct CPU_Description CPU_Data[MAX_CPUS] __attribute__((packed)); +}; + + +/* + * This structure will be used by SUS and the OS. + * The assumption about this structure is that no blank space is + * packed in it by our friend the compiler. + */ +typedef struct { + __u8 Mailbox_SUS; /* Written to by SUS to give commands/response to the OS */ + __u8 Mailbox_OS; /* Written to by the OS to give commands/response to SUS */ + __u8 SUS_MailboxVersion; /* Tells the OS which iteration of the interface SUS supports */ + __u8 OS_MailboxVersion; /* Tells SUS which iteration of the interface the OS supports */ + __u32 OS_Flags; /* Flags set by the OS as info for SUS */ + __u32 SUS_Flags; /* Flags set by SUS as info for the OS */ + __u32 WatchDogPeriod; /* Watchdog period (in seconds) which the DP uses to see if the OS is dead */ + __u32 WatchDogCount; /* Updated by the OS on every tic. */ + __u32 MemoryFor_SUS_ErrorLog; /* Flat 32 bit address which tells SUS where to stuff the SUS error log on a dump */ + MC_SlotInformation_t MC_SlotInfo[NUMBER_OF_MC_BUSSES*SLOTS_PER_MC_BUS]; /* Storage for MCA POS data */ + /* All new SECOND_PASS_INTERFACE fields added from this point */ + struct ProcBoardInfo *BoardData; + struct CPU_Info *CPU_Data; + /* All new fields must be added from this point */ +} Voyager_KernelSUS_Mbox_t; + +/* structure for finding the right memory address to send a QIC CPI to */ +struct voyager_qic_cpi { + /* Each cache line (32 bytes) can trigger a cpi. The cpi + * read/write may occur anywhere in the cache line---pick the + * middle to be safe */ + struct { + __u32 pad1[3]; + __u32 cpi; + __u32 pad2[4]; + } qic_cpi[8]; +}; + +struct voyager_status { + __u32 power_fail:1; + __u32 switch_off:1; + __u32 request_from_kernel:1; +}; + +struct voyager_psi_regs { + __u8 cat_id; + __u8 cat_dev; + __u8 cat_control; + __u8 subaddr; + __u8 dummy4; + __u8 checkbit; + __u8 subaddr_low; + __u8 subaddr_high; + __u8 intstatus; + __u8 stat1; + __u8 stat3; + __u8 fault; + __u8 tms; + __u8 gen; + __u8 sysconf; + __u8 dummy15; +}; + +struct voyager_psi_subregs { + __u8 supply; + __u8 mask; + __u8 present; + __u8 DCfail; + __u8 ACfail; + __u8 fail; + __u8 UPSfail; + __u8 genstatus; +}; + +struct voyager_psi { + struct voyager_psi_regs regs; + struct voyager_psi_subregs subregs; +}; + +struct voyager_SUS { +#define VOYAGER_DUMP_BUTTON_NMI 0x1 +#define VOYAGER_SUS_VALID 0x2 +#define VOYAGER_SYSINT_COMPLETE 0x3 + __u8 SUS_mbox; +#define VOYAGER_NO_COMMAND 0x0 +#define VOYAGER_IGNORE_DUMP 0x1 +#define VOYAGER_DO_DUMP 0x2 +#define VOYAGER_SYSINT_HANDSHAKE 0x3 +#define VOYAGER_DO_MEM_DUMP 0x4 +#define VOYAGER_SYSINT_WAS_RECOVERED 0x5 + __u8 kernel_mbox; +#define VOYAGER_MAILBOX_VERSION 0x10 + __u8 SUS_version; + __u8 kernel_version; +#define VOYAGER_OS_HAS_SYSINT 0x1 +#define VOYAGER_OS_IN_PROGRESS 0x2 +#define VOYAGER_UPDATING_WDPERIOD 0x4 + __u32 kernel_flags; +#define VOYAGER_SUS_BOOTING 0x1 +#define VOYAGER_SUS_IN_PROGRESS 0x2 + __u32 SUS_flags; + __u32 watchdog_period; + __u32 watchdog_count; + __u32 SUS_errorlog; + /* lots of system configuration stuff under here */ +}; + +/* Variables exported by voyager_smp */ +extern __u32 voyager_extended_vic_processors; +extern __u32 voyager_allowed_boot_processors; +extern __u32 voyager_quad_processors; +extern struct voyager_qic_cpi *voyager_quad_cpi_addr[NR_CPUS]; +extern struct voyager_SUS *voyager_SUS; + +/* variables exported always */ +extern int voyager_level; +extern int kvoyagerd_running; +extern struct semaphore kvoyagerd_sem; +extern struct voyager_status voyager_status; + + + +/* functions exported by the voyager and voyager_smp modules */ + +extern int voyager_cat_readb(__u8 module, __u8 asic, int reg); +extern void voyager_cat_init(void); +extern void voyager_detect(struct voyager_bios_info *); +extern void voyager_trap_init(void); +extern void voyager_setup_irqs(void); +extern int voyager_memory_detect(int region, __u32 *addr, __u32 *length); +extern void voyager_smp_intr_init(void); +extern __u8 voyager_extended_cmos_read(__u16 cmos_address); +extern void voyager_dump(void); +extern void voyager_smp_dump(void); +extern void voyager_timer_interrupt(struct pt_regs *regs); +extern void smp_local_timer_interrupt(struct pt_regs * regs); +extern void voyager_power_off(void); +extern void smp_voyager_power_off(void *dummy); +extern void voyager_restart(void); +extern void voyager_cat_power_off(void); +extern void voyager_cat_do_common_interrupt(void); +extern void voyager_handle_nmi(void); +/* Commands for the following are */ +#define VOYAGER_PSI_READ 0 +#define VOYAGER_PSI_WRITE 1 +#define VOYAGER_PSI_SUBREAD 2 +#define VOYAGER_PSI_SUBWRITE 3 +extern void voyager_cat_psi(__u8, __u16, __u8 *); diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h new file mode 100644 index 000000000000..bf9b15f5f70b --- /dev/null +++ b/include/linux/device-mapper.h @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2001 Sistina Software (UK) Limited. + * + * This file is released under the LGPL. + */ + +#ifndef _LINUX_DEVICE_MAPPER_H +#define _LINUX_DEVICE_MAPPER_H + +#define DM_DIR "mapper" /* Slashes not supported */ +#define DM_MAX_TYPE_NAME 16 +#define DM_NAME_LEN 128 +#define DM_UUID_LEN 129 + +#ifdef __KERNEL__ + +struct dm_target; +struct dm_table; +struct dm_dev; + +typedef enum { STATUSTYPE_INFO, STATUSTYPE_TABLE } status_type_t; + +/* + * In the constructor the target parameter will already have the + * table, type, begin and len fields filled in. + */ +typedef int (*dm_ctr_fn) (struct dm_target *target, int argc, char **argv); + +/* + * The destructor doesn't need to free the dm_target, just + * anything hidden ti->private. + */ +typedef void (*dm_dtr_fn) (struct dm_target *ti); + +/* + * The map function must return: + * < 0: error + * = 0: The target will handle the io by resubmitting it later + * > 0: simple remap complete + */ +typedef int (*dm_map_fn) (struct dm_target *ti, struct bio *bio); +typedef int (*dm_status_fn) (struct dm_target *ti, status_type_t status_type, + char *result, int maxlen); + +void dm_error(const char *message); + +/* + * Constructors should call these functions to ensure destination devices + * are opened/closed correctly. + * FIXME: too many arguments. + */ +int dm_get_device(struct dm_target *ti, const char *path, sector_t start, + sector_t len, int mode, struct dm_dev **result); +void dm_put_device(struct dm_target *ti, struct dm_dev *d); + +/* + * Information about a target type + */ +struct target_type { + const char *name; + struct module *module; + dm_ctr_fn ctr; + dm_dtr_fn dtr; + dm_map_fn map; + dm_status_fn status; +}; + +struct io_restrictions { + unsigned short max_sectors; + unsigned short max_phys_segments; + unsigned short max_hw_segments; + unsigned short hardsect_size; + unsigned int max_segment_size; + unsigned long seg_boundary_mask; +}; + +struct dm_target { + struct dm_table *table; + struct target_type *type; + + /* target limits */ + sector_t begin; + sector_t len; + + /* FIXME: turn this into a mask, and merge with io_restrictions */ + sector_t split_io; + + /* + * These are automaticall filled in by + * dm_table_get_device. + */ + struct io_restrictions limits; + + /* target specific data */ + void *private; + + /* Used to provide an error string from the ctr */ + char *error; +}; + +int dm_register_target(struct target_type *t); +int dm_unregister_target(struct target_type *t); + +#endif /* __KERNEL__ */ + +#endif /* _LINUX_DEVICE_MAPPER_H */ diff --git a/include/linux/dm-ioctl.h b/include/linux/dm-ioctl.h new file mode 100644 index 000000000000..c5ae8cd3921c --- /dev/null +++ b/include/linux/dm-ioctl.h @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2001 Sistina Software (UK) Limited. + * + * This file is released under the LGPL. + */ + +#ifndef _LINUX_DM_IOCTL_H +#define _LINUX_DM_IOCTL_H + +#include <linux/device-mapper.h> +#include <linux/types.h> + +/* + * Implements a traditional ioctl interface to the device mapper. + */ + +/* + * All ioctl arguments consist of a single chunk of memory, with + * this structure at the start. If a uuid is specified any + * lookup (eg. for a DM_INFO) will be done on that, *not* the + * name. + */ +struct dm_ioctl { + /* + * The version number is made up of three parts: + * major - no backward or forward compatibility, + * minor - only backwards compatible, + * patch - both backwards and forwards compatible. + * + * All clients of the ioctl interface should fill in the + * version number of the interface that they were + * compiled with. + * + * All recognised ioctl commands (ie. those that don't + * return -ENOTTY) fill out this field, even if the + * command failed. + */ + uint32_t version[3]; /* in/out */ + uint32_t data_size; /* total size of data passed in + * including this struct */ + + uint32_t data_start; /* offset to start of data + * relative to start of this struct */ + + uint32_t target_count; /* in/out */ + uint32_t open_count; /* out */ + uint32_t flags; /* in/out */ + + __kernel_dev_t dev; /* in/out */ + + char name[DM_NAME_LEN]; /* device name */ + char uuid[DM_UUID_LEN]; /* unique identifier for + * the block device */ +}; + +/* + * Used to specify tables. These structures appear after the + * dm_ioctl. + */ +struct dm_target_spec { + int32_t status; /* used when reading from kernel only */ + uint64_t sector_start; + uint32_t length; + + /* + * Offset in bytes (from the start of this struct) to + * next target_spec. + */ + uint32_t next; + + char target_type[DM_MAX_TYPE_NAME]; + + /* + * Parameter string starts immediately after this object. + * Be careful to add padding after string to ensure correct + * alignment of subsequent dm_target_spec. + */ +}; + +/* + * Used to retrieve the target dependencies. + */ +struct dm_target_deps { + uint32_t count; + + __kernel_dev_t dev[0]; /* out */ +}; + +/* + * If you change this make sure you make the corresponding change + * to dm-ioctl.c:lookup_ioctl() + */ +enum { + /* Top level cmds */ + DM_VERSION_CMD = 0, + DM_REMOVE_ALL_CMD, + + /* device level cmds */ + DM_DEV_CREATE_CMD, + DM_DEV_REMOVE_CMD, + DM_DEV_RELOAD_CMD, + DM_DEV_RENAME_CMD, + DM_DEV_SUSPEND_CMD, + DM_DEV_DEPS_CMD, + DM_DEV_STATUS_CMD, + + /* target level cmds */ + DM_TARGET_STATUS_CMD, + DM_TARGET_WAIT_CMD +}; + +#define DM_IOCTL 0xfd + +#define DM_VERSION _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl) +#define DM_REMOVE_ALL _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl) + +#define DM_DEV_CREATE _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl) +#define DM_DEV_REMOVE _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl) +#define DM_DEV_RELOAD _IOWR(DM_IOCTL, DM_DEV_RELOAD_CMD, struct dm_ioctl) +#define DM_DEV_SUSPEND _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl) +#define DM_DEV_RENAME _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl) +#define DM_DEV_DEPS _IOWR(DM_IOCTL, DM_DEV_DEPS_CMD, struct dm_ioctl) +#define DM_DEV_STATUS _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl) + +#define DM_TARGET_STATUS _IOWR(DM_IOCTL, DM_TARGET_STATUS_CMD, struct dm_ioctl) +#define DM_TARGET_WAIT _IOWR(DM_IOCTL, DM_TARGET_WAIT_CMD, struct dm_ioctl) + +#define DM_VERSION_MAJOR 1 +#define DM_VERSION_MINOR 0 +#define DM_VERSION_PATCHLEVEL 6 +#define DM_VERSION_EXTRA "-ioctl (2002-10-15)" + +/* Status bits */ +#define DM_READONLY_FLAG 0x00000001 +#define DM_SUSPEND_FLAG 0x00000002 +#define DM_EXISTS_FLAG 0x00000004 +#define DM_PERSISTENT_DEV_FLAG 0x00000008 + +/* + * Flag passed into ioctl STATUS command to get table information + * rather than current status. + */ +#define DM_STATUS_TABLE_FLAG 0x00000010 + +#endif /* _LINUX_DM_IOCTL_H */ diff --git a/include/linux/dvb/audio.h b/include/linux/dvb/audio.h new file mode 100644 index 000000000000..d0ce5e27bcd5 --- /dev/null +++ b/include/linux/dvb/audio.h @@ -0,0 +1,124 @@ +/* + * audio.h + * + * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de> + * & Marcus Metzler <marcus@convergence.de> + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Lesser Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVBAUDIO_H_ +#define _DVBAUDIO_H_ + +#ifdef __KERNEL__ +#include <linux/types.h> +#else +#include <stdint.h> +#endif + + +typedef enum { + AUDIO_SOURCE_DEMUX, /* Select the demux as the main source */ + AUDIO_SOURCE_MEMORY /* Select internal memory as the main source */ +} audio_stream_source_t; + + +typedef enum { + AUDIO_STOPPED, /* Device is stopped */ + AUDIO_PLAYING, /* Device is currently playing */ + AUDIO_PAUSED /* Device is paused */ +} audio_play_state_t; + + +typedef enum { + AUDIO_STEREO, + AUDIO_MONO_LEFT, + AUDIO_MONO_RIGHT, +} audio_channel_select_t; + + +typedef struct audio_status { + int AV_sync_state; /* sync audio and video? */ + int mute_state; /* audio is muted */ + audio_play_state_t play_state; /* current playback state */ + audio_stream_source_t stream_source; /* current stream source */ + audio_channel_select_t channel_select; /* currently selected channel */ + int bypass_mode; /* pass on audio data to */ +} audio_status_t; /* separate decoder hardware */ + + +typedef struct audio_mixer { + unsigned int volume_left; + unsigned int volume_right; + // what else do we need? bass, pass-through, ... +} audio_mixer_t; + + +typedef +struct audio_karaoke{ /* if Vocal1 or Vocal2 are non-zero, they get mixed */ + int vocal1; /* into left and right t at 70% each */ + int vocal2; /* if both, Vocal1 and Vocal2 are non-zero, Vocal1 gets*/ + int melody; /* mixed into the left channel and */ + /* Vocal2 into the right channel at 100% each. */ + /* if Melody is non-zero, the melody channel gets mixed*/ +} audio_karaoke_t; /* into left and right */ + + +typedef uint16_t audio_attributes_t; +/* bits: descr. */ +/* 15-13 audio coding mode (0=ac3, 2=mpeg1, 3=mpeg2ext, 4=LPCM, 6=DTS, */ +/* 12 multichannel extension */ +/* 11-10 audio type (0=not spec, 1=language included) */ +/* 9- 8 audio application mode (0=not spec, 1=karaoke, 2=surround) */ +/* 7- 6 Quantization / DRC (mpeg audio: 1=DRC exists)(lpcm: 0=16bit, */ +/* 5- 4 Sample frequency fs (0=48kHz, 1=96kHz) */ +/* 2- 0 number of audio channels (n+1 channels) */ + + +/* for GET_CAPABILITIES and SET_FORMAT, the latter should only set one bit */ +#define AUDIO_CAP_DTS 1 +#define AUDIO_CAP_LPCM 2 +#define AUDIO_CAP_MP1 4 +#define AUDIO_CAP_MP2 8 +#define AUDIO_CAP_MP3 16 +#define AUDIO_CAP_AAC 32 +#define AUDIO_CAP_OGG 64 +#define AUDIO_CAP_SDDS 128 +#define AUDIO_CAP_AC3 256 + +#define AUDIO_STOP _IO('o', 1) +#define AUDIO_PLAY _IO('o', 2) +#define AUDIO_PAUSE _IO('o', 3) +#define AUDIO_CONTINUE _IO('o', 4) +#define AUDIO_SELECT_SOURCE _IO('o', 5) +#define AUDIO_SET_MUTE _IO('o', 6) +#define AUDIO_SET_AV_SYNC _IO('o', 7) +#define AUDIO_SET_BYPASS_MODE _IO('o', 8) +#define AUDIO_CHANNEL_SELECT _IO('o', 9) +#define AUDIO_GET_STATUS _IOR('o', 10, audio_status_t) + +#define AUDIO_GET_CAPABILITIES _IOR('o', 11, unsigned int) +#define AUDIO_CLEAR_BUFFER _IO('o', 12) +#define AUDIO_SET_ID _IO('o', 13) +#define AUDIO_SET_MIXER _IOW('o', 14, audio_mixer_t) +#define AUDIO_SET_STREAMTYPE _IO('o', 15) +#define AUDIO_SET_EXT_ID _IO('o', 16) +#define AUDIO_SET_ATTRIBUTES _IOW('o', 17, audio_attributes_t) +#define AUDIO_SET_KARAOKE _IOW('o', 18, audio_karaoke_t) + +#endif /* _DVBAUDIO_H_ */ + diff --git a/include/linux/dvb/ca.h b/include/linux/dvb/ca.h new file mode 100644 index 000000000000..b7ce90ec3618 --- /dev/null +++ b/include/linux/dvb/ca.h @@ -0,0 +1,84 @@ +/* + * ca.h + * + * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de> + * & Marcus Metzler <marcus@convergence.de> + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Lesser Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _CA_H_ +#define _CA_H_ + +/* slot interface types and info */ + +typedef struct ca_slot_info_s { + int num; /* slot number */ + + int type; /* CA interface this slot supports */ +#define CA_CI 1 /* CI high level interface */ +#define CA_CI_LINK 2 /* CI link layer level interface */ +#define CA_CI_PHYS 4 /* CI physical layer level interface */ +#define CA_SC 128 /* simple smart card interface */ + + unsigned int flags; +#define CA_CI_MODULE_PRESENT 1 /* module (or card) inserted */ +#define CA_CI_MODULE_READY 2 +} ca_slot_info_t; + + +/* descrambler types and info */ + +typedef struct ca_descr_info_s { + unsigned int num; /* number of available descramblers (keys) */ + unsigned int type; /* type of supported scrambling system */ +#define CA_ECD 1 +#define CA_NDS 2 +#define CA_DSS 4 +} ca_descr_info_t; + +typedef struct ca_cap_s { + unsigned int slot_num; /* total number of CA card and module slots */ + unsigned int slot_type; /* OR of all supported types */ + unsigned int descr_num; /* total number of descrambler slots (keys) */ + unsigned int descr_type; /* OR of all supported types */ +} ca_cap_t; + +/* a message to/from a CI-CAM */ +typedef struct ca_msg_s { + unsigned int index; + unsigned int type; + unsigned int length; + unsigned char msg[256]; +} ca_msg_t; + +typedef struct ca_descr_s { + unsigned int index; + unsigned int parity; + unsigned char cw[8]; +} ca_descr_t; + +#define CA_RESET _IO('o', 128) +#define CA_GET_CAP _IOR('o', 129, ca_cap_t) +#define CA_GET_SLOT_INFO _IOR('o', 130, ca_slot_info_t) +#define CA_GET_DESCR_INFO _IOR('o', 131, ca_descr_info_t) +#define CA_GET_MSG _IOR('o', 132, ca_msg_t) +#define CA_SEND_MSG _IOW('o', 133, ca_msg_t) +#define CA_SET_DESCR _IOW('o', 134, ca_descr_t) + +#endif + diff --git a/include/linux/dvb/dmx.h b/include/linux/dvb/dmx.h new file mode 100644 index 000000000000..38586a88ac3f --- /dev/null +++ b/include/linux/dvb/dmx.h @@ -0,0 +1,172 @@ +/* + * dmx.h + * + * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de> + * & Ralph Metzler <ralph@convergence.de> + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DMX_H_ +#define _DMX_H_ + +#ifdef __KERNEL__ +#include <linux/types.h> +#else +#include <stdint.h> +#endif + +#define DMX_FILTER_SIZE 16 + +typedef enum +{ + DMX_OUT_DECODER, /* Streaming directly to decoder. */ + DMX_OUT_TAP, /* Output going to a memory buffer */ + /* (to be retrieved via the read command).*/ + DMX_OUT_TS_TAP /* Output multiplexed into a new TS */ + /* (to be retrieved by reading from the */ + /* logical DVR device). */ +} dmx_output_t; + + +typedef enum +{ + DMX_IN_FRONTEND, /* Input from a front-end device. */ + DMX_IN_DVR /* Input from the logical DVR device. */ +} dmx_input_t; + + +typedef enum +{ + DMX_PES_AUDIO0, + DMX_PES_VIDEO0, + DMX_PES_TELETEXT0, + DMX_PES_SUBTITLE0, + DMX_PES_PCR0, + + DMX_PES_AUDIO1, + DMX_PES_VIDEO1, + DMX_PES_TELETEXT1, + DMX_PES_SUBTITLE1, + DMX_PES_PCR1, + + DMX_PES_AUDIO2, + DMX_PES_VIDEO2, + DMX_PES_TELETEXT2, + DMX_PES_SUBTITLE2, + DMX_PES_PCR2, + + DMX_PES_AUDIO3, + DMX_PES_VIDEO3, + DMX_PES_TELETEXT3, + DMX_PES_SUBTITLE3, + DMX_PES_PCR3, + + DMX_PES_OTHER +} dmx_pes_type_t; + +#define DMX_PES_AUDIO DMX_PES_AUDIO0 +#define DMX_PES_VIDEO DMX_PES_VIDEO0 +#define DMX_PES_TELETEXT DMX_PES_TELETEXT0 +#define DMX_PES_SUBTITLE DMX_PES_SUBTITLE0 +#define DMX_PES_PCR DMX_PES_PCR0 + + +typedef enum +{ + DMX_SCRAMBLING_EV, + DMX_FRONTEND_EV +} dmx_event_t; + + +typedef enum +{ + DMX_SCRAMBLING_OFF, + DMX_SCRAMBLING_ON +} dmx_scrambling_status_t; + + +typedef struct dmx_filter +{ + uint8_t filter[DMX_FILTER_SIZE]; + uint8_t mask[DMX_FILTER_SIZE]; + uint8_t mode[DMX_FILTER_SIZE]; +} dmx_filter_t; + + +struct dmx_sct_filter_params +{ + uint16_t pid; + dmx_filter_t filter; + uint32_t timeout; + uint32_t flags; +#define DMX_CHECK_CRC 1 +#define DMX_ONESHOT 2 +#define DMX_IMMEDIATE_START 4 +#define DMX_KERNEL_CLIENT 0x8000 +}; + + +struct dmx_pes_filter_params +{ + uint16_t pid; + dmx_input_t input; + dmx_output_t output; + dmx_pes_type_t pes_type; + uint32_t flags; +}; + + +struct dmx_event +{ + dmx_event_t event; + time_t timeStamp; + union + { + dmx_scrambling_status_t scrambling; + } u; +}; + +typedef struct dmx_caps { + uint32_t caps; + int num_decoders; +} dmx_caps_t; + +typedef enum { + DMX_SOURCE_FRONT0 = 0, + DMX_SOURCE_FRONT1, + DMX_SOURCE_FRONT2, + DMX_SOURCE_FRONT3, + DMX_SOURCE_DVR0 = 16, + DMX_SOURCE_DVR1, + DMX_SOURCE_DVR2, + DMX_SOURCE_DVR3, +} dmx_source_t; + + +#define DMX_START _IO('o',41) +#define DMX_STOP _IO('o',42) +#define DMX_SET_FILTER _IOW('o',43,struct dmx_sct_filter_params) +#define DMX_SET_PES_FILTER _IOW('o',44,struct dmx_pes_filter_params) +#define DMX_SET_BUFFER_SIZE _IO('o',45) +#define DMX_GET_EVENT _IOR('o',46,struct dmx_event) +#define DMX_GET_PES_PIDS _IOR('o',47,uint16_t) +#define DMX_GET_CAPS _IOR('o',48,dmx_caps_t) +#define DMX_SET_SOURCE _IOW('o',49,dmx_source_t) + +#endif /*_DMX_H_*/ + diff --git a/include/linux/dvb/frontend.h b/include/linux/dvb/frontend.h new file mode 100644 index 000000000000..0256741c580b --- /dev/null +++ b/include/linux/dvb/frontend.h @@ -0,0 +1,261 @@ +/* + * frontend.h + * + * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de> + * Ralph Metzler <ralph@convergence.de> + * Holger Waechtler <holger@convergence.de> + * Andre Draszik <ad@convergence.de> + * for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _FRONTEND_H_ +#define _FRONTEND_H_ + +#ifdef __KERNEL__ +#include <linux/types.h> +#else +#include <stdint.h> +#endif + + +typedef enum { + FE_QPSK, + FE_QAM, + FE_OFDM +} fe_type_t; + + +typedef enum { + FE_IS_STUPID = 0, + FE_CAN_INVERSION_AUTO = 0x1, + FE_CAN_FEC_1_2 = 0x2, + FE_CAN_FEC_2_3 = 0x4, + FE_CAN_FEC_3_4 = 0x8, + FE_CAN_FEC_4_5 = 0x10, + FE_CAN_FEC_5_6 = 0x20, + FE_CAN_FEC_6_7 = 0x40, + FE_CAN_FEC_7_8 = 0x80, + FE_CAN_FEC_8_9 = 0x100, + FE_CAN_FEC_AUTO = 0x200, + FE_CAN_QPSK = 0x400, + FE_CAN_QAM_16 = 0x800, + FE_CAN_QAM_32 = 0x1000, + FE_CAN_QAM_64 = 0x2000, + FE_CAN_QAM_128 = 0x4000, + FE_CAN_QAM_256 = 0x8000, + FE_CAN_QAM_AUTO = 0x10000, + FE_CAN_TRANSMISSION_MODE_AUTO = 0x20000, + FE_CAN_BANDWIDTH_AUTO = 0x40000, + FE_CAN_GUARD_INTERVAL_AUTO = 0x80000, + FE_CAN_HIERARCHY_AUTO = 0x100000, + FE_CAN_MUTE_TS = 0x80000000 +} fe_caps_t; + + +struct dvb_frontend_info { + char name[128]; + fe_type_t type; + uint32_t frequency_min; + uint32_t frequency_max; + uint32_t frequency_stepsize; + uint32_t frequency_tolerance; + uint32_t symbol_rate_min; + uint32_t symbol_rate_max; + uint32_t symbol_rate_tolerance; /* ppm */ + uint32_t notifier_delay; /* ms */ + fe_caps_t caps; +}; + + +/** + * Check out the DiSEqC bus spec available on http://www.eutelsat.org/ for + * the meaning of this struct... + */ +struct dvb_diseqc_master_cmd { + uint8_t msg [6]; /* { framing, address, command, data [3] } */ + uint8_t msg_len; /* valid values are 3...6 */ +}; + + +struct dvb_diseqc_slave_reply { + uint8_t msg [4]; /* { framing, data [3] } */ + uint8_t msg_len; /* valid values are 0...4, 0 means no msg */ + int timeout; /* return from ioctl after timeout ms with */ +}; /* errorcode when no message was received */ + + +typedef enum { + SEC_VOLTAGE_13, + SEC_VOLTAGE_18 +} fe_sec_voltage_t; + + +typedef enum { + SEC_TONE_ON, + SEC_TONE_OFF +} fe_sec_tone_mode_t; + + +typedef enum { + SEC_MINI_A, + SEC_MINI_B +} fe_sec_mini_cmd_t; + + +typedef enum { + FE_HAS_SIGNAL = 0x01, /* found something above the noise level */ + FE_HAS_CARRIER = 0x02, /* found a DVB signal */ + FE_HAS_VITERBI = 0x04, /* FEC is stable */ + FE_HAS_SYNC = 0x08, /* found sync bytes */ + FE_HAS_LOCK = 0x10, /* everything's working... */ + FE_TIMEDOUT = 0x20, /* no lock within the last ~2 seconds */ + FE_REINIT = 0x40 /* frontend was reinitialized, */ +} fe_status_t; /* application is recommned to reset */ + /* DiSEqC, tone and parameters */ + +typedef enum { + INVERSION_OFF, + INVERSION_ON, + INVERSION_AUTO +} fe_spectral_inversion_t; + + +typedef enum { + FEC_NONE = 0, + FEC_1_2, + FEC_2_3, + FEC_3_4, + FEC_4_5, + FEC_5_6, + FEC_6_7, + FEC_7_8, + FEC_8_9, + FEC_AUTO +} fe_code_rate_t; + + +typedef enum { + QPSK, + QAM_16, + QAM_32, + QAM_64, + QAM_128, + QAM_256, + QAM_AUTO +} fe_modulation_t; + + +typedef enum { + TRANSMISSION_MODE_2K, + TRANSMISSION_MODE_8K, + TRANSMISSION_MODE_AUTO +} fe_transmit_mode_t; + +typedef enum { + BANDWIDTH_8_MHZ, + BANDWIDTH_7_MHZ, + BANDWIDTH_6_MHZ, + BANDWIDTH_AUTO +} fe_bandwidth_t; + + +typedef enum { + GUARD_INTERVAL_1_32, + GUARD_INTERVAL_1_16, + GUARD_INTERVAL_1_8, + GUARD_INTERVAL_1_4, + GUARD_INTERVAL_AUTO +} fe_guard_interval_t; + + +typedef enum { + HIERARCHY_NONE, + HIERARCHY_1, + HIERARCHY_2, + HIERARCHY_4, + HIERARCHY_AUTO +} fe_hierarchy_t; + + +struct dvb_qpsk_parameters { + uint32_t symbol_rate; /* symbol rate in Symbols per second */ + fe_code_rate_t fec_inner; /* forward error correction (see above) */ +}; + + +struct dvb_qam_parameters { + uint32_t symbol_rate; /* symbol rate in Symbols per second */ + fe_code_rate_t fec_inner; /* forward error correction (see above) */ + fe_modulation_t modulation; /* modulation type (see above) */ +}; + + +struct dvb_ofdm_parameters { + fe_bandwidth_t bandwidth; + fe_code_rate_t code_rate_HP; /* high priority stream code rate */ + fe_code_rate_t code_rate_LP; /* low priority stream code rate */ + fe_modulation_t constellation; /* modulation type (see above) */ + fe_transmit_mode_t transmission_mode; + fe_guard_interval_t guard_interval; + fe_hierarchy_t hierarchy_information; +}; + + +struct dvb_frontend_parameters { + uint32_t frequency; /* (absolute) frequency in Hz for QAM/OFDM */ + /* intermediate frequency in kHz for QPSK */ + fe_spectral_inversion_t inversion; + union { + struct dvb_qpsk_parameters qpsk; + struct dvb_qam_parameters qam; + struct dvb_ofdm_parameters ofdm; + } u; +}; + + +struct dvb_frontend_event { + fe_status_t status; + struct dvb_frontend_parameters parameters; +}; + + + +#define FE_GET_INFO _IOR('o', 61, struct dvb_frontend_info) + +#define FE_DISEQC_RESET_OVERLOAD _IO('o', 62) +#define FE_DISEQC_SEND_MASTER_CMD _IOW('o', 63, struct dvb_diseqc_master_cmd) +#define FE_DISEQC_RECV_SLAVE_REPLY _IOR('o', 64, struct dvb_diseqc_slave_reply) +#define FE_DISEQC_SEND_BURST _IO('o', 65) /* fe_sec_mini_cmd_t */ + +#define FE_SET_TONE _IO('o', 66) /* fe_sec_tone_mode_t */ +#define FE_SET_VOLTAGE _IO('o', 67) /* fe_sec_voltage_t */ +#define FE_ENABLE_HIGH_LNB_VOLTAGE _IO('o', 68) /* int */ + +#define FE_READ_STATUS _IOR('o', 69, fe_status_t) +#define FE_READ_BER _IOR('o', 70, uint32_t) +#define FE_READ_SIGNAL_STRENGTH _IOR('o', 71, uint16_t) +#define FE_READ_SNR _IOR('o', 72, uint16_t) +#define FE_READ_UNCORRECTED_BLOCKS _IOR('o', 73, uint32_t) + +#define FE_SET_FRONTEND _IOW('o', 76, struct dvb_frontend_parameters) +#define FE_GET_FRONTEND _IOR('o', 77, struct dvb_frontend_parameters) +#define FE_GET_EVENT _IOR('o', 78, struct dvb_frontend_event) + + +#endif /*_FRONTEND_H_*/ + diff --git a/include/linux/dvb/net.h b/include/linux/dvb/net.h new file mode 100644 index 000000000000..419d44884b72 --- /dev/null +++ b/include/linux/dvb/net.h @@ -0,0 +1,44 @@ +/* + * net.h + * + * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de> + * & Ralph Metzler <ralph@convergence.de> + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVBNET_H_ +#define _DVBNET_H_ + +#ifdef __KERNEL__ +#include <linux/types.h> +#else +#include <stdint.h> +#endif + + +struct dvb_net_if { + uint16_t pid; + uint16_t if_num; +}; + + +#define NET_ADD_IF _IOWR('o', 52, struct dvb_net_if) +#define NET_REMOVE_IF _IO('o', 53) + +#endif /*_DVBNET_H_*/ + diff --git a/include/linux/dvb/osd.h b/include/linux/dvb/osd.h new file mode 100644 index 000000000000..143c8296f895 --- /dev/null +++ b/include/linux/dvb/osd.h @@ -0,0 +1,110 @@ +/* + * osd.h + * + * Copyright (C) 2001 Ralph Metzler <ralph@convergence.de> + * & Marcus Metzler <marcus@convergence.de> + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Lesser Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVBOSD_H_ +#define _DVBOSD_H_ + +typedef enum { + // All functions return -2 on "not open" + OSD_Close = 1, // () + // Disables OSD and releases the buffers + // returns 0 on success + OSD_Open, // (x0,y0,x1,y1,BitPerPixel[2/4/8](color&0x0F),mix[0..15](color&0xF0)) + // Opens OSD with this size and bit depth + // returns 0 on success, -1 on DRAM allocation error, -2 on "already open" + OSD_Show, // () + // enables OSD mode + // returns 0 on success + OSD_Hide, // () + // disables OSD mode + // returns 0 on success + OSD_Clear, // () + // Sets all pixel to color 0 + // returns 0 on success + OSD_Fill, // (color) + // Sets all pixel to color <col> + // returns 0 on success + OSD_SetColor, // (color,R{x0},G{y0},B{x1},opacity{y1}) + // set palette entry <num> to <r,g,b>, <mix> and <trans> apply + // R,G,B: 0..255 + // R=Red, G=Green, B=Blue + // opacity=0: pixel opacity 0% (only video pixel shows) + // opacity=1..254: pixel opacity as specified in header + // opacity=255: pixel opacity 100% (only OSD pixel shows) + // returns 0 on success, -1 on error + OSD_SetPalette, // (firstcolor{color},lastcolor{x0},data) + // Set a number of entries in the palette + // sets the entries "firstcolor" through "lastcolor" from the array "data" + // data has 4 byte for each color: + // R,G,B, and a opacity value: 0->transparent, 1..254->mix, 255->pixel + OSD_SetTrans, // (transparency{color}) + // Sets transparency of mixed pixel (0..15) + // returns 0 on success + OSD_SetPixel, // (x0,y0,color) + // sets pixel <x>,<y> to color number <col> + // returns 0 on success, -1 on error + OSD_GetPixel, // (x0,y0) + // returns color number of pixel <x>,<y>, or -1 + OSD_SetRow, // (x0,y0,x1,data) + // fills pixels x0,y through x1,y with the content of data[] + // returns 0 on success, -1 on clipping all pixel (no pixel drawn) + OSD_SetBlock, // (x0,y0,x1,y1,increment{color},data) + // fills pixels x0,y0 through x1,y1 with the content of data[] + // inc contains the width of one line in the data block, + // inc<=0 uses blockwidth as linewidth + // returns 0 on success, -1 on clipping all pixel + OSD_FillRow, // (x0,y0,x1,color) + // fills pixels x0,y through x1,y with the color <col> + // returns 0 on success, -1 on clipping all pixel + OSD_FillBlock, // (x0,y0,x1,y1,color) + // fills pixels x0,y0 through x1,y1 with the color <col> + // returns 0 on success, -1 on clipping all pixel + OSD_Line, // (x0,y0,x1,y1,color) + // draw a line from x0,y0 to x1,y1 with the color <col> + // returns 0 on success + OSD_Query, // (x0,y0,x1,y1,xasp{color}}), yasp=11 + // fills parameters with the picture dimensions and the pixel aspect ratio + // returns 0 on success + OSD_Test, // () + // draws a test picture. for debugging purposes only + // returns 0 on success +// TODO: remove "test" in final version + OSD_Text, // (x0,y0,size,color,text) + OSD_SetWindow, // (x0) set window with number 0<x0<8 as current + OSD_MoveWindow, // move current window to (x0, y0) +} OSD_Command; + +typedef struct osd_cmd_s { + OSD_Command cmd; + int x0; + int y0; + int x1; + int y1; + int color; + void *data; +} osd_cmd_t; + + +#define OSD_SEND_CMD _IOW('o', 160, osd_cmd_t) + +#endif diff --git a/include/linux/dvb/video.h b/include/linux/dvb/video.h new file mode 100644 index 000000000000..8bcb009f5779 --- /dev/null +++ b/include/linux/dvb/video.h @@ -0,0 +1,190 @@ +/* + * video.h + * + * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de> + * & Ralph Metzler <ralph@convergence.de> + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVBVIDEO_H_ +#define _DVBVIDEO_H_ + +#ifdef __KERNEL__ +#include <linux/types.h> +#else +#include <stdint.h> +#endif + + +typedef enum { + VIDEO_FORMAT_4_3, /* Select 4:3 format */ + VIDEO_FORMAT_16_9 /* Select 16:9 format. */ +} video_format_t; + + +typedef enum { + VIDEO_SYSTEM_PAL, + VIDEO_SYSTEM_NTSC, + VIDEO_SYSTEM_PALN, + VIDEO_SYSTEM_PALNc, + VIDEO_SYSTEM_PALM, + VIDEO_SYSTEM_NTSC60, + VIDEO_SYSTEM_PAL60, + VIDEO_SYSTEM_PALM60 +} video_system_t; + + +typedef enum { + VIDEO_PAN_SCAN, /* use pan and scan format */ + VIDEO_LETTER_BOX, /* use letterbox format */ + VIDEO_CENTER_CUT_OUT /* use center cut out format */ +} video_displayformat_t; + + +typedef enum { + VIDEO_SOURCE_DEMUX, /* Select the demux as the main source */ + VIDEO_SOURCE_MEMORY /* If this source is selected, the stream + comes from the user through the write + system call */ +} video_stream_source_t; + + +typedef enum { + VIDEO_STOPPED, /* Video is stopped */ + VIDEO_PLAYING, /* Video is currently playing */ + VIDEO_FREEZED /* Video is freezed */ +} video_play_state_t; + + +struct video_event { + int32_t type; + time_t timestamp; + union { + video_format_t video_format; + } u; +}; + + +struct video_status { + int video_blank; /* blank video on freeze? */ + video_play_state_t play_state; /* current state of playback */ + video_stream_source_t stream_source; /* current source (demux/memory) */ + video_format_t video_format; /* current aspect ratio of stream*/ + video_displayformat_t display_format;/* selected cropping mode */ +}; + + +struct video_still_picture { + char *iFrame; /* pointer to a single iframe in memory */ + int32_t size; +}; + + +typedef +struct video_highlight { + int active; /* 1=show highlight, 0=hide highlight */ + uint8_t contrast1; /* 7- 4 Pattern pixel contrast */ + /* 3- 0 Background pixel contrast */ + uint8_t contrast2; /* 7- 4 Emphasis pixel-2 contrast */ + /* 3- 0 Emphasis pixel-1 contrast */ + uint8_t color1; /* 7- 4 Pattern pixel color */ + /* 3- 0 Background pixel color */ + uint8_t color2; /* 7- 4 Emphasis pixel-2 color */ + /* 3- 0 Emphasis pixel-1 color */ + uint32_t ypos; /* 23-22 auto action mode */ + /* 21-12 start y */ + /* 9- 0 end y */ + uint32_t xpos; /* 23-22 button color number */ + /* 21-12 start x */ + /* 9- 0 end x */ +} video_highlight_t; + + +typedef struct video_spu { + int active; + int stream_id; +} video_spu_t; + + +typedef struct video_spu_palette { /* SPU Palette information */ + int length; + uint8_t *palette; +} video_spu_palette_t; + + +typedef struct video_navi_pack { + int length; /* 0 ... 1024 */ + uint8_t data[1024]; +} video_navi_pack_t; + + +typedef uint16_t video_attributes_t; +/* bits: descr. */ +/* 15-14 Video compression mode (0=MPEG-1, 1=MPEG-2) */ +/* 13-12 TV system (0=525/60, 1=625/50) */ +/* 11-10 Aspect ratio (0=4:3, 3=16:9) */ +/* 9- 8 permitted display mode on 4:3 monitor (0=both, 1=only pan-sca */ +/* 7 line 21-1 data present in GOP (1=yes, 0=no) */ +/* 6 line 21-2 data present in GOP (1=yes, 0=no) */ +/* 5- 3 source resolution (0=720x480/576, 1=704x480/576, 2=352x480/57 */ +/* 2 source letterboxed (1=yes, 0=no) */ +/* 0 film/camera mode (0=camera, 1=film (625/50 only)) */ + + +/* bit definitions for capabilities: */ +/* can the hardware decode MPEG1 and/or MPEG2? */ +#define VIDEO_CAP_MPEG1 1 +#define VIDEO_CAP_MPEG2 2 +/* can you send a system and/or program stream to video device? + (you still have to open the video and the audio device but only + send the stream to the video device) */ +#define VIDEO_CAP_SYS 4 +#define VIDEO_CAP_PROG 8 +/* can the driver also handle SPU, NAVI and CSS encoded data? + (CSS API is not present yet) */ +#define VIDEO_CAP_SPU 16 +#define VIDEO_CAP_NAVI 32 +#define VIDEO_CAP_CSS 64 + + +#define VIDEO_STOP _IO('o', 21) +#define VIDEO_PLAY _IO('o', 22) +#define VIDEO_FREEZE _IO('o', 23) +#define VIDEO_CONTINUE _IO('o', 24) +#define VIDEO_SELECT_SOURCE _IO('o', 25) +#define VIDEO_SET_BLANK _IO('o', 26) +#define VIDEO_GET_STATUS _IOR('o', 27, struct video_status) +#define VIDEO_GET_EVENT _IOR('o', 28, struct video_event) +#define VIDEO_SET_DISPLAY_FORMAT _IO('o', 29) +#define VIDEO_STILLPICTURE _IOW('o', 30, struct video_still_picture) +#define VIDEO_FAST_FORWARD _IO('o', 31) +#define VIDEO_SLOWMOTION _IO('o', 32) +#define VIDEO_GET_CAPABILITIES _IOR('o', 33, unsigned int) +#define VIDEO_CLEAR_BUFFER _IO('o', 34) +#define VIDEO_SET_ID _IO('o', 35) +#define VIDEO_SET_STREAMTYPE _IO('o', 36) +#define VIDEO_SET_FORMAT _IO('o', 37) +#define VIDEO_SET_SYSTEM _IO('o', 38) +#define VIDEO_SET_HIGHLIGHT _IOW('o', 39, video_highlight_t) +#define VIDEO_SET_SPU _IOW('o', 50, video_spu_t) +#define VIDEO_SET_SPU_PALETTE _IOW('o', 51, video_spu_palette_t) +#define VIDEO_GET_NAVI _IOR('o', 52, video_navi_pack_t) +#define VIDEO_SET_ATTRIBUTES _IO('o', 53) + +#endif /*_DVBVIDEO_H_*/ + diff --git a/include/linux/hdlc.h b/include/linux/hdlc.h index e372def0d8aa..aeceb6f1a7be 100644 --- a/include/linux/hdlc.h +++ b/include/linux/hdlc.h @@ -12,7 +12,7 @@ #ifndef __HDLC_H #define __HDLC_H -#define GENERIC_HDLC_VERSION 3 /* For synchronization with sethdlc utility */ +#define GENERIC_HDLC_VERSION 4 /* For synchronization with sethdlc utility */ #define CLOCK_DEFAULT 0 /* Default setting */ #define CLOCK_EXT 1 /* External TX and RX clock - DTE */ diff --git a/include/linux/hdreg.h b/include/linux/hdreg.h index 02ffdebb7cdc..5b1c363f89cb 100644 --- a/include/linux/hdreg.h +++ b/include/linux/hdreg.h @@ -707,9 +707,9 @@ struct hd_driveid { * 12 * 11:0 */ - unsigned short words161_175[14];/* Reserved for CFA */ - unsigned short words176_205[31];/* Current Media Serial Number */ - unsigned short words206_254[48];/* reserved words 206-254 */ + unsigned short words161_175[15];/* Reserved for CFA */ + unsigned short words176_205[30];/* Current Media Serial Number */ + unsigned short words206_254[49];/* reserved words 206-254 */ unsigned short integrity_word; /* (word 255) * 15:8 Checksum * 7:0 Signature diff --git a/include/linux/if.h b/include/linux/if.h index a46d55dd576d..734578911ba8 100644 --- a/include/linux/if.h +++ b/include/linux/if.h @@ -96,16 +96,20 @@ struct ifmap struct if_settings { unsigned int type; /* Type of physical device or protocol */ + unsigned int size; /* Size of the data allocated by the caller */ union { /* {atm/eth/dsl}_settings anyone ? */ - union hdlc_settings ifsu_hdlc; - union line_settings ifsu_line; + raw_hdlc_proto *raw_hdlc; + cisco_proto *cisco; + fr_proto *fr; + fr_proto_pvc *fr_pvc; + + /* interface settings */ + sync_serial_settings *sync; + te1_settings *te1; } ifs_ifsu; }; -#define ifs_hdlc ifs_ifsu.ifsu_hdlc -#define ifs_line ifs_ifsu.ifsu_line - /* * Interface request structure used for socket * ioctl's. All interface ioctl's must have parameter @@ -135,7 +139,7 @@ struct ifreq char ifru_slave[IFNAMSIZ]; /* Just fits the size */ char ifru_newname[IFNAMSIZ]; char * ifru_data; - struct if_settings *ifru_settings; + struct if_settings ifru_settings; } ifr_ifru; }; diff --git a/include/linux/mempool.h b/include/linux/mempool.h index 04095af05d3b..bc77a394f25a 100644 --- a/include/linux/mempool.h +++ b/include/linux/mempool.h @@ -27,4 +27,11 @@ extern void mempool_destroy(mempool_t *pool); extern void * mempool_alloc(mempool_t *pool, int gfp_mask); extern void mempool_free(void *element, mempool_t *pool); +/* + * A mempool_alloc_t and mempool_free_t that get the memory from + * a slab that is passed in through pool_data. + */ +void *mempool_alloc_slab(int gfp_mask, void *pool_data); +void mempool_free_slab(void *element, void *pool_data); + #endif /* _LINUX_MEMPOOL_H */ diff --git a/mm/mempool.c b/mm/mempool.c index 43984703747c..cdbe8adf99aa 100644 --- a/mm/mempool.c +++ b/mm/mempool.c @@ -259,8 +259,25 @@ void mempool_free(void *element, mempool_t *pool) pool->free(element, pool->pool_data); } +/* + * A commonly used alloc and free fn. + */ +void *mempool_alloc_slab(int gfp_mask, void *pool_data) +{ + kmem_cache_t *mem = (kmem_cache_t *) pool_data; + return kmem_cache_alloc(mem, gfp_mask); +} + +void mempool_free_slab(void *element, void *pool_data) +{ + kmem_cache_t *mem = (kmem_cache_t *) pool_data; + kmem_cache_free(mem, element); +} + EXPORT_SYMBOL(mempool_create); EXPORT_SYMBOL(mempool_resize); EXPORT_SYMBOL(mempool_destroy); EXPORT_SYMBOL(mempool_alloc); EXPORT_SYMBOL(mempool_free); +EXPORT_SYMBOL(mempool_alloc_slab); +EXPORT_SYMBOL(mempool_free_slab); diff --git a/scripts/ver_linux b/scripts/ver_linux index fa151baf940a..edc3ec1f26a4 100644 --- a/scripts/ver_linux +++ b/scripts/ver_linux @@ -4,7 +4,7 @@ # /bin /sbin /usr/bin /usr/sbin /usr/local/bin, but it may # differ on your system. # -PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH +PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:$PATH echo 'If some fields are empty or look unusual you may have an old version.' echo 'Compare to the current minimal requirements in Documentation/Changes.' echo ' ' @@ -12,7 +12,11 @@ echo ' ' uname -a echo ' ' -echo "Gnu C " `gcc --version` +gcc --version 2>&1| head -n 1 | grep -v gcc | awk \ +'NR==1{print "Gnu C ", $1}' + +gcc --version 2>&1| grep gcc | awk \ +'NR==1{print "Gnu C ", $3}' make --version 2>&1 | awk -F, '{print $1}' | awk \ '/GNU Make/{print "Gnu make ",$NF}' @@ -29,9 +33,15 @@ insmod -V 2>&1 | awk 'NR==1 {print "modutils ",$NF}' tune2fs 2>&1 | grep "^tune2fs" | sed 's/,//' | awk \ 'NR==1 {print "e2fsprogs ", $2}' -reiserfsck 2>&1 | grep reiserfsprogs | awk \ +fsck.jfs -V 2>&1 | grep version | sed 's/,//' | awk \ +'NR==1 {print "jfsutils ", $3}' + +reiserfsck -V 2>&1 | grep reiserfsprogs | awk \ 'NR==1{print "reiserfsprogs ", $NF}' +xfs_db -V 2>&1 | grep version | awk \ +'NR==1{print "xfsprogs ", $3}' + cardmgr -V 2>&1| grep version | awk \ 'NR==1{print "pcmcia-cs ", $3}' |
